示例#1
0
        public void Can_calculate_root()
        {
            TxReceipt   receipt     = Build.A.Receipt.WithAllFieldsFilled.TestObject;
            ReceiptTrie receiptTrie = new ReceiptTrie(MainnetSpecProvider.MuirGlacierBlockNumber, MainnetSpecProvider.Instance, new[] { receipt });

            Assert.AreEqual("0x2e6d89c5b539e72409f2e587730643986c2ef33db5e817a4223aa1bb996476d5", receiptTrie.RootHash.ToString());
        }
示例#2
0
        public void Can_calculate_root_no_eip_658()
        {
            TxReceipt   receipt     = Build.A.Receipt.WithAllFieldsFilled.TestObject;
            ReceiptTrie receiptTrie = new ReceiptTrie(1, MainnetSpecProvider.Instance, new[] { receipt });

            Assert.AreEqual("0xe51a2d9f986d68628990c9d65e45c36128ec7bb697bd426b0bb4d18a3f3321be", receiptTrie.RootHash.ToString());
        }
示例#3
0
        public static Keccak GetReceiptsRoot(this TxReceipt[] txReceipts, IReleaseSpec releaseSpec, Keccak suggestedRoot)
        {
            Keccak SkipStateAndStatusReceiptsRoot()
            {
                txReceipts.SetSkipStateAndStatusInRlp(true);
                try
                {
                    return(new ReceiptTrie(releaseSpec, txReceipts).RootHash);
                }
                finally
                {
                    txReceipts.SetSkipStateAndStatusInRlp(false);
                }
            }

            Keccak receiptsRoot = new ReceiptTrie(releaseSpec, txReceipts).RootHash;

            if (!releaseSpec.ValidateReceipts && receiptsRoot != suggestedRoot)
            {
                var skipStateAndStatusReceiptsRoot = SkipStateAndStatusReceiptsRoot();
                if (skipStateAndStatusReceiptsRoot == suggestedRoot)
                {
                    return(skipStateAndStatusReceiptsRoot);
                }
            }
            return(receiptsRoot);
        }
        private bool TryPrepareReceipts(BlockInfo blockInfo, TxReceipt[] receipts, out TxReceipt[]?preparedReceipts)
        {
            BlockHeader?header = _blockTree.FindHeader(blockInfo.BlockHash);

            if (header == null)
            {
                if (_logger.IsWarn)
                {
                    _logger.Warn("Could not find header for requested blockhash.");
                }
                preparedReceipts = null;
            }
            else
            {
                if (header.ReceiptsRoot == Keccak.EmptyTreeHash)
                {
                    preparedReceipts = receipts.Length == 0 ? receipts : null;
                }
                else
                {
                    Keccak receiptsRoot = new ReceiptTrie(blockInfo.BlockNumber, _specProvider, receipts).RootHash;
                    if (receiptsRoot != header.ReceiptsRoot)
                    {
                        preparedReceipts = null;
                    }
                    else
                    {
                        preparedReceipts = receipts;
                    }
                }
            }

            return(preparedReceipts != null);
        }
示例#5
0
        private void ValidateReceipts(Block block, TxReceipt[] blockReceipts)
        {
            Keccak receiptsRoot = new ReceiptTrie(block.Number, _specProvider, blockReceipts).RootHash;

            if (receiptsRoot != block.ReceiptsRoot)
            {
                throw new EthSyncException($"Wrong receipts root for downloaded block {block.ToString(Block.Format.Short)}.");
            }
        }
示例#6
0
        public void Can_collect_proof_with_branch()
        {
            TxReceipt   receipt1 = Build.A.Receipt.WithAllFieldsFilled.TestObject;
            TxReceipt   receipt2 = Build.A.Receipt.WithAllFieldsFilled.TestObject;
            ReceiptTrie trie     = new ReceiptTrie(1, MainnetSpecProvider.Instance, new[] { receipt1, receipt2 }, true);

            byte[][] proof = trie.BuildProof(0);
            Assert.AreEqual(2, proof.Length);

            trie.UpdateRootHash();
            VerifyProof(proof, trie.RootHash);
        }
示例#7
0
        => _receiptsMigration.Run(blockNumber + 1);     // add 1 to make go from inclusive (better for API) to exclusive (better for internal)

        public void InsertReceipts(BlockParameter blockParameter, TxReceipt[] txReceipts)
        {
            SearchResult <Block> searchResult = _blockTree.SearchForBlock(blockParameter);

            if (searchResult.IsError)
            {
                throw new InvalidDataException(searchResult.Error);
            }

            Block       block       = searchResult.Object;
            ReceiptTrie receiptTrie = new ReceiptTrie(block.Number, _specProvider, txReceipts);

            receiptTrie.UpdateRootHash();
            if (block.ReceiptsRoot != receiptTrie.RootHash)
            {
                throw new InvalidDataException("Receipts root mismatch");
            }

            _receiptStorage.Insert(block, txReceipts);
        }
示例#8
0
        public BlockBuilder WithTransactions(int txCount, ISpecProvider specProvider)
        {
            Transaction[] txs = new Transaction[txCount];
            for (int i = 0; i < txCount; i++)
            {
                txs[i] = new Transaction();
            }

            TxReceipt[] receipts = new TxReceipt[txCount];
            for (int i = 0; i < txCount; i++)
            {
                receipts[i] = Build.A.Receipt.TestObject;
            }

            var         number      = TestObjectInternal.Number;
            ReceiptTrie receiptTrie = new ReceiptTrie(number, specProvider, receipts);

            receiptTrie.UpdateRootHash();

            BlockBuilder result = WithTransactions(txs);

            TestObjectInternal.Header.ReceiptsRoot = receiptTrie.RootHash;
            return(result);
        }
示例#9
0
        private void SetReceiptsRoot(Block block, TxReceipt[] txReceipts)
        {
            ReceiptTrie receiptTrie = new ReceiptTrie(block.Number, _specProvider, txReceipts);

            block.Header.ReceiptsRoot = receiptTrie.RootHash;
        }