コード例 #1
0
 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;
 }
コード例 #2
0
        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());
        }
コード例 #3
0
 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;
 }
コード例 #4
0
 public TransactionKeyResolver(IHasher hasher, IMerkleTreeBuilder merkleTreeBuilder)
 {
     _hasher            = hasher;
     _merkleTreeBuilder = merkleTreeBuilder;
 }