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()); }
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()); }
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); }
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)}."); } }
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); }
=> _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); }
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); }
private void SetReceiptsRoot(Block block, TxReceipt[] txReceipts) { ReceiptTrie receiptTrie = new ReceiptTrie(block.Number, _specProvider, txReceipts); block.Header.ReceiptsRoot = receiptTrie.RootHash; }