Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wait for blob inclusion #6090

Closed
wants to merge 61 commits into from
Closed
Show file tree
Hide file tree
Changes from 57 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
6cd45c7
Add data gas calculations
flcl42 Apr 21, 2023
7886362
ChainSpecs/BlockProcessing: Fix syncing on Genesis block due to Exces…
spencer-tb May 4, 2023
2cd8bd7
TxValidator: Move KZG version check into network wrapper verification.
spencer-tb May 5, 2023
da546b4
ExcessData gas on genesis block
flcl42 May 9, 2023
1fa67f8
Check versioned hash earlier
flcl42 May 11, 2023
bd49c9d
Remake gas, preview
flcl42 Jun 1, 2023
a7120a8
Fix recursion
flcl42 Jun 3, 2023
6630c96
Add tests, refactor
flcl42 Jun 5, 2023
f363565
Get rid of parent block header finder
flcl42 Jun 5, 2023
2127d3b
Clean up
flcl42 Jun 5, 2023
4548a9f
Clean up checks
flcl42 Jun 5, 2023
d86ec23
Fix tests
flcl42 Jun 5, 2023
a132a10
Fix header mapping to rpc
flcl42 Jun 5, 2023
25b56af
Fix data gas calculations
flcl42 Jun 5, 2023
f0a5e4c
Add safety checks
flcl42 Jun 5, 2023
4fc22f1
Fix and improve
flcl42 Jun 5, 2023
3e6253d
Blob gas info in receipts (#5767)
deffrian Jun 6, 2023
14e9ce2
Increase data gas limits
flcl42 Jun 9, 2023
7c61b53
Clean up
flcl42 Jun 9, 2023
d41f110
Add more blob space
flcl42 Jun 12, 2023
d2b5311
Fix tests; clean up
flcl42 Jun 12, 2023
9913404
Add tests, refacator
flcl42 Jun 14, 2023
d093db7
Merge remote-tracking branch 'origin/master' into feature/eip-4844-ga…
flcl42 Jun 14, 2023
4d251bc
Hotfix devnet-v6
flcl42 Jun 13, 2023
91f8bdd
Add initial implementation
flcl42 Jun 14, 2023
bf03689
Fix
flcl42 Jun 15, 2023
f807741
Fix build
Jun 15, 2023
101bfe4
Dockerize
flcl42 Jun 16, 2023
3168e91
Add more args
flcl42 Jul 3, 2023
3536616
Update README.md
flcl42 Jul 19, 2023
207e9ec
Send broken txs
flcl42 Jul 27, 2023
99a69df
added wait for blob inclusion func
ak88 Sep 11, 2023
52948fc
moved SendBlobs to tools directory
ak88 Sep 12, 2023
3e1ce61
changed launch settings back
ak88 Sep 12, 2023
ce52a7e
removed unused usings
ak88 Sep 12, 2023
1a3c7b4
fix whitespace
ak88 Sep 12, 2023
8cadffc
formatted sendblobs
ak88 Sep 12, 2023
0a4b888
rename Nethermind.SendBlobs->SendBlobs
ak88 Sep 13, 2023
25f383c
rename Nethermind.SendBlobs -> SendBlobs
ak88 Sep 13, 2023
5b33970
.sln file rename folder Nethermind.SendBlobs
ak88 Sep 13, 2023
9d3c5f6
changed wait argument to a selectable number instead
ak88 Sep 13, 2023
79793ce
added retry count for wait for block loop
ak88 Sep 13, 2023
5804a43
wait on the last transaction and change arg name to wait
ak88 Sep 14, 2023
1b995dc
removed sendblobs from main sln
ak88 Sep 14, 2023
28615e3
added public address from launch settings to readme
ak88 Sep 14, 2023
0142329
maxPriorityFeePerGas as args
ak88 Sep 15, 2023
095e175
Revert "maxPriorityFeePerGas as args"
ak88 Sep 16, 2023
950caf1
Max priority as args
ak88 Sep 18, 2023
4e06c94
Distribute and reclaim funds
ak88 Sep 20, 2023
8de7919
added FundsDistributor
ak88 Sep 21, 2023
961cd13
Introduced command line and new commands
ak88 Sep 21, 2023
646ac7f
added maxfee and maxpriorityfee as args
ak88 Sep 22, 2023
9d96df6
Key file for send blobs
ak88 Sep 22, 2023
a77439c
Solution file for sendblobs tool
ak88 Sep 22, 2023
b1f3635
Dotnet format
ak88 Sep 22, 2023
90ca16d
Update README.md
ak88 Sep 22, 2023
69fda27
Revert "fix whitespace"
ak88 Sep 26, 2023
ba6bf75
removed break transaction
ak88 Oct 3, 2023
2d911cd
Removed broken tx no longer possible
ak88 Oct 4, 2023
02aa290
Merge branch 'master' into wait-for-blob-inclusion
ak88 Oct 5, 2023
bf4c349
Revert "Merge branch 'master' into wait-for-blob-inclusion"
ak88 Oct 5, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/Nethermind/Ethereum.Test.Base/GeneralTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ protected EthereumTestResult RunTest(GeneralStateTest test, ITxTracer txTracer)
header.MixHash = test.CurrentRandom;

Stopwatch stopwatch = Stopwatch.StartNew();
var txValidator = new TxValidator((MainnetSpecProvider.Instance.ChainId));
var spec = specProvider.GetSpec((ForkActivation)test.CurrentNumber);
TxValidator? txValidator = new((MainnetSpecProvider.Instance.ChainId));
IReleaseSpec? spec = specProvider.GetSpec((ForkActivation)test.CurrentNumber);
if (test.Transaction.ChainId == null)
test.Transaction.ChainId = MainnetSpecProvider.Instance.ChainId;
bool isValid = txValidator.IsWellFormed(test.Transaction, spec);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
using FluentAssertions;
using Nethermind.Abi;
using Nethermind.Blockchain;
using Nethermind.Blockchain.Find;
using Nethermind.Blockchain.Receipts;
using Nethermind.Consensus;
using Nethermind.Consensus.AuRa;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
using Nethermind.State;
using NSubstitute;
using NUnit.Framework;
using NUnit.Framework.Internal.Execution;

namespace Nethermind.Blockchain.Test.Producers
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ public static IEnumerable EnoughShardBlobTransactionsSelectedTestCases
tx.BlobVersionedHashes = new byte[1][];
});
maxTransactionsSelected.Transactions[1].BlobVersionedHashes =
new byte[Eip4844Constants.MaxBlobsPerBlock - 1][];
new byte[Eip4844Constants.MaxDataGasPerTransaction / Eip4844Constants.DataGasPerBlob - 1][];
maxTransactionsSelected.ExpectedSelectedTransactions.AddRange(
maxTransactionsSelected.Transactions.OrderBy(t => t.Nonce).Take(2));
yield return new TestCaseData(maxTransactionsSelected).SetName("Enough transactions selected");
Expand All @@ -168,7 +168,8 @@ public static IEnumerable EnoughShardBlobTransactionsSelectedTestCases
Transaction[] expectedSelectedTransactions =
enoughTransactionsSelected.Transactions.OrderBy(t => t.Nonce).ToArray();
expectedSelectedTransactions[0].Type = TxType.Blob;
expectedSelectedTransactions[0].BlobVersionedHashes = new byte[Eip4844Constants.MaxBlobsPerBlock][];
expectedSelectedTransactions[0].BlobVersionedHashes =
new byte[Eip4844Constants.MaxDataGasPerTransaction / Eip4844Constants.DataGasPerBlob][];
expectedSelectedTransactions[1].Type = TxType.Blob;
expectedSelectedTransactions[1].BlobVersionedHashes = new byte[1][];
enoughTransactionsSelected.ExpectedSelectedTransactions.AddRange(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,57 +1,105 @@
// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using System.Collections.Generic;
using System.Linq;
using Nethermind.Blockchain.Find;
using Nethermind.Consensus.Validators;
using Nethermind.Core;
using Nethermind.Core.Specs;
using Nethermind.Core.Test.Builders;
using Nethermind.Logging;
using Nethermind.Specs.Forks;
using Nethermind.Specs.Test;
using NSubstitute;
using NUnit.Framework;

namespace Nethermind.Blockchain.Test.Validators;

public class ShardBlobBlockValidatorTests
{
[Test]
public void Not_null_ExcessDataGas_is_invalid_pre_cancun()
[TestCaseSource(nameof(DataGasFieldsPerForkTestCases))]
public static bool Data_gas_fields_should_be_set(IReleaseSpec spec, ulong? dataGasUsed, ulong? excessDataGas)
{
ISpecProvider specProvider = new CustomSpecProvider(((ForkActivation)0, Shanghai.Instance));
BlockValidator blockValidator = new(Always.Valid, Always.Valid, Always.Valid, specProvider, LimboLogs.Instance);
bool isValid = blockValidator.ValidateSuggestedBlock(Build.A.Block
.WithWithdrawalsRoot(TestItem.KeccakA)
.WithWithdrawals(TestItem.WithdrawalA_1Eth)
.WithExcessDataGas(1).TestObject);
Assert.False(isValid);
}

[Test]
public void Null_ExcessDataGas_is_invalid_post_cancun()
{
ISpecProvider specProvider = new CustomSpecProvider(((ForkActivation)0, Cancun.Instance));
BlockValidator blockValidator = new(Always.Valid, Always.Valid, Always.Valid, specProvider, LimboLogs.Instance);
bool isValid = blockValidator.ValidateSuggestedBlock(Build.A.Block
ISpecProvider specProvider = new CustomSpecProvider(((ForkActivation)0, spec));
HeaderValidator headerValidator = new(Substitute.For<IBlockTree>(), Always.Valid, specProvider, TestLogManager.Instance);
BlockValidator blockValidator = new(Always.Valid, headerValidator, Always.Valid, specProvider, TestLogManager.Instance);
return blockValidator.ValidateSuggestedBlock(Build.A.Block
.WithDataGasUsed(dataGasUsed)
.WithExcessDataGas(excessDataGas)
.WithWithdrawalsRoot(TestItem.KeccakA)
.WithWithdrawals(TestItem.WithdrawalA_1Eth)
.WithParent(Build.A.BlockHeader.TestObject)
.TestObject);
Assert.False(isValid);
}

[TestCase(0, ExpectedResult = true)]
[TestCase(Eip4844Constants.MaxBlobsPerBlock - 1, ExpectedResult = true)]
[TestCase(Eip4844Constants.MaxBlobsPerBlock, ExpectedResult = true)]
[TestCase(Eip4844Constants.MaxBlobsPerBlock + 1, ExpectedResult = false)]
public bool Blobs_per_block_count_is_valid(int blobsCount)
[TestCase(0ul, ExpectedResult = true)]
[TestCase(Eip4844Constants.MaxDataGasPerBlock - Eip4844Constants.DataGasPerBlob, ExpectedResult = true)]
[TestCase(Eip4844Constants.MaxDataGasPerBlock, ExpectedResult = true)]
[TestCase(Eip4844Constants.MaxDataGasPerBlock + Eip4844Constants.DataGasPerBlob, ExpectedResult = false)]
public bool Blobs_per_block_count_is_valid(ulong dataGasUsed)
{
ISpecProvider specProvider = new CustomSpecProvider(((ForkActivation)0, Cancun.Instance));
BlockValidator blockValidator = new(Always.Valid, Always.Valid, Always.Valid, specProvider, LimboLogs.Instance);
BlockValidator blockValidator = new(Always.Valid, Always.Valid, Always.Valid, specProvider, TestLogManager.Instance);
return blockValidator.ValidateSuggestedBlock(
Build.A.Block
.WithWithdrawalsRoot(TestItem.KeccakA)
.WithWithdrawals(TestItem.WithdrawalA_1Eth)
.WithExcessDataGas(1)
.WithTransactions(Build.A.Transaction.WithBlobVersionedHashes(blobsCount).TestObject)
.WithDataGasUsed(dataGasUsed)
.WithExcessDataGas(0)
.WithTransactions(Enumerable.Range(0, (int)(dataGasUsed / Eip4844Constants.DataGasPerBlob))
.Select(i => Build.A.Transaction.WithType(TxType.Blob)
.WithMaxFeePerDataGas(ulong.MaxValue)
.WithBlobVersionedHashes(1).TestObject).ToArray())
.TestObject);
}

public static IEnumerable<TestCaseData> DataGasFieldsPerForkTestCases
{
get
{
yield return new TestCaseData(Shanghai.Instance, null, null)
{
TestName = "Data gas fields are not set pre-Cancun",
ExpectedResult = true
};
yield return new TestCaseData(Shanghai.Instance, 0ul, null)
{
TestName = "DataGasUsed is set pre-Cancun",
ExpectedResult = false
};
yield return new TestCaseData(Shanghai.Instance, null, 0ul)
{
TestName = "ExcessDataGas is set pre-Cancun",
ExpectedResult = false
};
yield return new TestCaseData(Shanghai.Instance, 0ul, 0ul)
{
TestName = "Data gas fields are set pre-Cancun",
ExpectedResult = false
};


yield return new TestCaseData(Cancun.Instance, null, null)
{
TestName = "Data gas fields are not set post-Cancun",
ExpectedResult = false
};
yield return new TestCaseData(Cancun.Instance, 0ul, null)
{
TestName = "Just DataGasUsed is set post-Cancun",
ExpectedResult = false
};
yield return new TestCaseData(Cancun.Instance, null, 0ul)
{
TestName = "Just ExcessDataGas is set post-Cancun",
ExpectedResult = false
};
yield return new TestCaseData(Cancun.Instance, 0ul, 0ul)
{
TestName = "Data gas fields are set post-Cancun",
ExpectedResult = true
};
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ public void ShardBlobTransactions_should_have_destination_set()
.WithChainId(TestBlockchainIds.ChainId)
.SignedAndResolved().TestObject;

Transaction txtxWithTo = Build.A.Transaction
Transaction txWithTo = Build.A.Transaction
.WithType(TxType.Blob)
.WithTimestamp(ulong.MaxValue)
.WithTo(TestItem.AddressA)
Expand All @@ -347,7 +347,7 @@ public void ShardBlobTransactions_should_have_destination_set()
.SignedAndResolved().TestObject;

Assert.That(txValidator.IsWellFormed(txWithoutTo, Cancun.Instance), Is.False);
Assert.That(txValidator.IsWellFormed(txtxWithTo, Cancun.Instance));
Assert.That(txValidator.IsWellFormed(txWithTo, Cancun.Instance));
}

[Timeout(Timeout.MaxTestTime)]
Expand All @@ -371,7 +371,6 @@ public bool MaxFeePerDataGas_should_be_set_for_blob_tx_only(TxType txType, bool
return txValidator.IsWellFormed(tx, Cancun.Instance);
}


[TestCaseSource(nameof(BlobVersionedHashInvalidTestCases))]
[TestCaseSource(nameof(BlobVersionedHashValidTestCases))]
public bool BlobVersionedHash_should_be_correct(byte[] hash)
Expand Down Expand Up @@ -407,36 +406,41 @@ private static IEnumerable<TestCaseData> BlobVersionedHashInvalidTestCases
{
yield return new TestCaseData(null) { TestName = "Null hash", ExpectedResult = false };
yield return new TestCaseData(MakeArray(0)) { TestName = "Empty hash", ExpectedResult = false };
yield return new TestCaseData(MakeArray(1, 1, 0))
yield return new TestCaseData(MakeArray(1, 1))
{
TestName = "Correct version, incorrect length",
ExpectedResult = false
};
yield return new TestCaseData(MakeArray(31, 1, 0))
yield return new TestCaseData(MakeArray(31, 1))
{
TestName = "Correct version, incorrect length",
ExpectedResult = false
};
yield return new TestCaseData(MakeArray(33, 1, 0))
yield return new TestCaseData(MakeArray(33, 1))
{
TestName = "Correct version, incorrect length",
ExpectedResult = false
};
yield return new TestCaseData(MakeArray(32, 0, 0))
yield return new TestCaseData(MakeArray(32, 0))
{
TestName = "Incorrect version, correct length",
ExpectedResult = false
};
yield return new TestCaseData(MakeArray(32, KzgPolynomialCommitments.KzgBlobHashVersionV1 - 1, 0))
yield return new TestCaseData(MakeArray(32, KzgPolynomialCommitments.KzgBlobHashVersionV1 - 1))
{
TestName = "Incorrect version, correct length",
ExpectedResult = false
};
yield return new TestCaseData(MakeArray(32, KzgPolynomialCommitments.KzgBlobHashVersionV1 + 1, 0))
yield return new TestCaseData(MakeArray(32, KzgPolynomialCommitments.KzgBlobHashVersionV1 + 1))
{
TestName = "Incorrect version, correct length",
ExpectedResult = false
};
yield return new TestCaseData(MakeArray(32, KzgPolynomialCommitments.KzgBlobHashVersionV1))
{
TestName = "Correct version, correct length",
ExpectedResult = true
};
}
}

Expand Down Expand Up @@ -494,19 +498,19 @@ static TransactionBuilder<Transaction> MakeTestObject(int blobCount = 1) => Buil
TestName = "More than minimum BlobVersionedHashes",
ExpectedResult = true
};
yield return new TestCaseData(MakeTestObject(Eip4844Constants.MaxBlobsPerTransaction - 1)
yield return new TestCaseData(MakeTestObject((int)(Eip4844Constants.MaxDataGasPerBlock / Eip4844Constants.DataGasPerBlob - 1))
.SignedAndResolved().TestObject)
{
TestName = "Less than maximum BlobVersionedHashes",
ExpectedResult = true
};
yield return new TestCaseData(MakeTestObject(Eip4844Constants.MaxBlobsPerTransaction)
yield return new TestCaseData(MakeTestObject((int)(Eip4844Constants.MaxDataGasPerBlock / Eip4844Constants.DataGasPerBlob))
.SignedAndResolved().TestObject)
{
TestName = "Maximum BlobVersionedHashes",
ExpectedResult = true
};
yield return new TestCaseData(MakeTestObject(Eip4844Constants.MaxBlobsPerTransaction + 1)
yield return new TestCaseData(MakeTestObject((int)(Eip4844Constants.MaxDataGasPerBlock / Eip4844Constants.DataGasPerBlob + 1))
.SignedAndResolved().TestObject)
{
TestName = "Too many BlobVersionedHashes",
Expand Down
26 changes: 13 additions & 13 deletions src/Nethermind/Nethermind.Cli/Console/CliConsole.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,19 @@ public CliConsole()
{
_terminal = PrepareConsoleForTerminal();

System.Console.WriteLine("**********************************************");
System.Console.WriteLine();
System.Console.WriteLine("Nethermind CLI {0}", ProductInfo.Version);
System.Console.WriteLine(" https://github.com/NethermindEth/nethermind");
System.Console.WriteLine(" https://nethermind.readthedocs.io/en/latest/");
System.Console.WriteLine();
System.Console.WriteLine("powered by:");
System.Console.WriteLine(" https://github.com/sebastienros/jint");
System.Console.WriteLine(" https://github.com/tomakita/Colorful.Console");
System.Console.WriteLine(" https://github.com/tonerdo/readline");
System.Console.WriteLine();
System.Console.WriteLine("**********************************************");
System.Console.WriteLine();
//System.Console.WriteLine("**********************************************");
//System.Console.WriteLine();
//System.Console.WriteLine("Nethermind CLI {0}", ProductInfo.Version);
//System.Console.WriteLine(" https://github.com/NethermindEth/nethermind");
//System.Console.WriteLine(" https://nethermind.readthedocs.io/en/latest/");
//System.Console.WriteLine();
//System.Console.WriteLine("powered by:");
//System.Console.WriteLine(" https://github.com/sebastienros/jint");
//System.Console.WriteLine(" https://github.com/tomakita/Colorful.Console");
//System.Console.WriteLine(" https://github.com/tonerdo/readline");
//System.Console.WriteLine();
//System.Console.WriteLine("**********************************************");
//System.Console.WriteLine();
}

protected Terminal GetTerminal()
Expand Down
4 changes: 2 additions & 2 deletions src/Nethermind/Nethermind.Cli/NodeManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public async Task<JsValue> PostJint(string method, params object[] parameters)
{
if (_currentClient is null)
{
_cliConsole.WriteErrorLine("[INTERNAL ERROR] JSON RPC client not set.");
//_cliConsole.WriteErrorLine("[INTERNAL ERROR] JSON RPC client not set.");
}
else
{
Expand Down Expand Up @@ -115,7 +115,7 @@ public async Task<JsValue> PostJint(string method, params object[] parameters)
{
if (_currentClient is null)
{
_cliConsole.WriteErrorLine("[INTERNAL ERROR] JSON RPC client not set.");
//_cliConsole.WriteErrorLine("[INTERNAL ERROR] JSON RPC client not set.");
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
using Nethermind.Consensus.Rewards;
using Nethermind.Consensus.Transactions;
using Nethermind.Consensus.Validators;
using Nethermind.Consensus.Withdrawals;
using Nethermind.Core;
using Nethermind.Core.Crypto;
using Nethermind.Core.Extensions;
Expand All @@ -37,7 +36,6 @@
using Nethermind.Trie.Pruning;
using Nethermind.TxPool;
using NUnit.Framework;
using BlockTree = Nethermind.Blockchain.BlockTree;
using Nethermind.Config;

namespace Nethermind.Clique.Test
Expand Down Expand Up @@ -123,7 +121,9 @@ public On CreateNode(PrivateKey privateKey, bool withGenesisAlreadyProcessed = f
_genesis.Header.Hash = _genesis.Header.CalculateHash();
_genesis3Validators.Header.Hash = _genesis3Validators.Header.CalculateHash();

TransactionProcessor transactionProcessor = new(goerliSpecProvider, stateProvider, new VirtualMachine(blockhashProvider, specProvider, nodeLogManager), nodeLogManager);
TransactionProcessor transactionProcessor = new(goerliSpecProvider, stateProvider,
new VirtualMachine(blockhashProvider, specProvider, nodeLogManager),
nodeLogManager);
BlockProcessor blockProcessor = new(
goerliSpecProvider,
Always.Valid,
Expand Down
11 changes: 11 additions & 0 deletions src/Nethermind/Nethermind.Consensus/Processing/BlockProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Nethermind.Blockchain;
using Nethermind.Blockchain.Receipts;
Expand All @@ -13,11 +14,13 @@
using Nethermind.Core.Crypto;
using Nethermind.Core.Specs;
using Nethermind.Crypto;
using Nethermind.Evm;
using Nethermind.Evm.Tracing;
using Nethermind.Int256;
using Nethermind.Logging;
using Nethermind.Specs.Forks;
using Nethermind.State;
using Metrics = Nethermind.Blockchain.Metrics;

namespace Nethermind.Consensus.Processing;

Expand Down Expand Up @@ -221,8 +224,15 @@ protected virtual TxReceipt[] ProcessBlock(

_receiptsTracer.SetOtherTracer(blockTracer);
_receiptsTracer.StartNewBlockTrace(block);

TxReceipt[] receipts = _blockTransactionsExecutor.ProcessTransactions(block, options, _receiptsTracer, spec);

if (spec.IsEip4844Enabled)
{
block.Header.DataGasUsed = DataGasCalculator.CalculateDataGas(
block.Transactions.Sum(tx => tx.BlobVersionedHashes?.Length ?? 0));
}

block.Header.ReceiptsRoot = receipts.GetReceiptsRoot(spec, block.ReceiptsRoot);
ApplyMinerRewards(block, blockTracer, spec);
_withdrawalProcessor.ProcessWithdrawals(block, spec);
Expand Down Expand Up @@ -258,6 +268,7 @@ private Block PrepareBlockForProcessing(Block suggestedBlock)
bh.GasLimit,
bh.Timestamp,
bh.ExtraData,
bh.DataGasUsed,
bh.ExcessDataGas)
{
Bloom = Bloom.Empty,
Expand Down
Loading