let ``mine to correct`` checkType (chain:ConcurrentChain) (block:Block) =    
    let validation = 
        match checkType with
        | NoWork -> fun (cb:ChainedBlock) -> true
        | EasyWork -> fun cb -> cb.ValidateEasy network
        | CorrectWork -> fun cb -> cb.Validate network 
    let processors = uint32(Environment.ProcessorCount)
    let prevBlock = chain.GetBlock(block.Header.HashPrevBlock)
    let rec mine nonce (blockHead:BlockHeader) =
        let bh = blockHead.Clone()
        bh.Nonce <- nonce
        let headerBlock = 
            ChainedBlock(bh, bh.GetHash(), prevBlock)
        if validation headerBlock then nonce
        else mine (nonce+processors) bh
    let tasks = 
        [|0u .. processors-1u|] |> Array.map(fun i ->
            System.Threading.Tasks.Task.Run(fun t ->
                mine i block.Header
            )
        )
    let found = 
        tasks 
        |> Array.map (fun t -> t :> System.Threading.Tasks.Task) 
        |> System.Threading.Tasks.Task.WaitAny
    let r = tasks.[found].Result
    printfn "%d" r
    block.Header.Nonce <- r