Snippets

Tuomas Hietanen More parallel option for nonce checking in NBitcoin block-chain for https://bitbucket.org/snippets/Thorium/Me5kd8/using-nbitcoin-to-create-private

Created by Tuomas Hietanen
// More parallel calculating alternative option for ``mine to correct`` for https://bitbucket.org/snippets/Thorium/Me5kd8/using-nbitcoin-to-create-private
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

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.