public BlockVerifier(INetworkParameters parameters, ISignatureService signatureService, IEnumerable <ITransactionRule> txnRules, IEnumerable <IBlockRule> blockRules, IEnumerable <ValidInstructionType> validTxnTypes, IMerkleTreeBuilder merkleTreeBuilder, ITransactionKeyResolver transactionKeyResolver, IConsensusMethod consensusMethod, IHasher hasher, IInstructionRepository instructionRepository) { _parameters = parameters; _signatureService = signatureService; _txnRules = txnRules; _blockRules = blockRules; _merkleTreeBuilder = merkleTreeBuilder; _transactionKeyResolver = transactionKeyResolver; _consensusMethod = consensusMethod; _hasher = hasher; _instructionRepository = instructionRepository; }
public static async Task <MerkleTreeLeafBuilder <T>[]> CreateFromValues <T>(IHashResolver resolver, IEnumerable <T> values, int maxChildren) { var result = new List <MerkleTreeLeafBuilder <T> >(); foreach (var value in values) { var leaf = new MerkleTreeLeaf <T>(value); var hash = await resolver.StoreAsync <IMerkleTree <T> >(leaf); var builder = new MerkleTreeLeafBuilder <T>(leaf, hash); result.Add(builder); } var currentLayer = new Queue <IMerkleTreeBuilder <T> >(result); while (currentLayer.Count > 1) { var previousLayer = currentLayer; currentLayer = new Queue <IMerkleTreeBuilder <T> >((previousLayer.Count - 1) / maxChildren + 1); while (previousLayer.Count > 0) { if (previousLayer.Count == 1) { currentLayer.Enqueue(previousLayer.Dequeue()); // Optimization; we never want single-element nodes break; } var children = new IMerkleTreeBuilder <T> [Math.Min(previousLayer.Count, maxChildren)]; var hashes = new Hash <IMerkleTree <T> > [children.Length]; for (var i = 0; i < children.Length; i++) { children[i] = previousLayer.Dequeue(); hashes[i] = children[i].Hash; } var node = new MerkleTreeNode <T>(hashes); var hash = await resolver.StoreAsync <IMerkleTree <T> >(node); var builder = new MerkleTreeNodeBuilder <T>(node, hash); for (var i = 0; i < children.Length; i++) { children[i].Parent = builder; children[i].IndexInParent = i; } currentLayer.Enqueue(builder); } } return(result.ToArray()); }
public BlockMiner(ITransactionKeyResolver transactionKeyResolver, IMerkleTreeBuilder merkleTreeBuilder, INetworkParameters networkParameters, IBlockbaseTransactionBuilder blockbaseBuilder, IPeerNetwork peerNetwork, IConsensusMethod consensusMethod, IUnconfirmedTransactionPool unconfirmedTransactionPool, IBlockRepository blockRepository, IReceiver blockReciever, IDifficultyCalculator difficultyCalculator, ILoggerFactory loggerFactory) { _networkParameters = networkParameters; _peerNetwork = peerNetwork; _blockbaseBuilder = blockbaseBuilder; _blockReciever = blockReciever; _consensusMethod = consensusMethod; _difficultyCalculator = difficultyCalculator; _transactionKeyResolver = transactionKeyResolver; _merkleTreeBuilder = merkleTreeBuilder; _logger = loggerFactory.CreateLogger <BlockMiner>(); _blockRepository = blockRepository; _unconfirmedTransactionPool = unconfirmedTransactionPool; _unconfirmedTransactionPool.Changed += UnconfirmedTransactionPoolChanged; }
public TransactionKeyResolver(IHasher hasher, IMerkleTreeBuilder merkleTreeBuilder) { _hasher = hasher; _merkleTreeBuilder = merkleTreeBuilder; }