diff --git a/src/Nethermind/Nethermind.Blockchain/BlockTree.cs b/src/Nethermind/Nethermind.Blockchain/BlockTree.cs index f94a18ffade3..09c7b4a9e7ef 100644 --- a/src/Nethermind/Nethermind.Blockchain/BlockTree.cs +++ b/src/Nethermind/Nethermind.Blockchain/BlockTree.cs @@ -106,6 +106,8 @@ public BlockHeader? LowestInsertedBeaconHeader private TaskCompletionSource? _taskCompletionSource; + private readonly long _genesisBlockNumber; + public BlockTree( IBlockStore? blockStore, IHeaderStore? headerDb, @@ -116,7 +118,8 @@ public BlockTree( ISpecProvider? specProvider, IBloomStorage? bloomStorage, ISyncConfig? syncConfig, - ILogManager? logManager) + ILogManager? logManager, + long genesisBlockNumber = 0) { _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager)); _blockStore = blockStore ?? throw new ArgumentNullException(nameof(blockStore)); @@ -131,6 +134,8 @@ public BlockTree( throw new ArgumentNullException(nameof(chainLevelInfoRepository)); _oldestBlock = syncConfig.AncientBodiesBarrierCalc; + _genesisBlockNumber = genesisBlockNumber; + LoadSyncPivot(); byte[]? deletePointer = _blockInfoDb.Get(DeletePointerAddressInDb); @@ -142,7 +147,7 @@ public BlockTree( // Need to be here because it still need to run even if there are no genesis to store the null entry. LoadLowestInsertedHeader(); - ChainLevelInfo? genesisLevel = LoadLevel(0); + ChainLevelInfo? genesisLevel = LoadLevel(_genesisBlockNumber); if (genesisLevel is not null) { BlockInfo genesisBlockInfo = genesisLevel.BlockInfos[0]; @@ -203,7 +208,7 @@ public AddBlockResult Insert(BlockHeader header, BlockTreeInsertHeaderOptions he throw new InvalidOperationException("An attempt to insert a block header without a known bloom."); } - if (header.Number == 0) + if (header.Number == _genesisBlockNumber) { throw new InvalidOperationException("Genesis block should not be inserted."); } @@ -301,7 +306,7 @@ public void BulkInsertHeader(IReadOnlyList headers, throw new InvalidOperationException("An attempt to insert a block header without a known bloom."); } - if (header.Number == 0) + if (header.Number == _genesisBlockNumber) { throw new InvalidOperationException("Genesis block should not be inserted."); } @@ -405,7 +410,7 @@ public AddBlockResult Insert(Block block, BlockTreeInsertBlockOptions insertBloc return AddBlockResult.CannotAccept; } - if (block.Number == 0) + if (block.Number == _genesisBlockNumber) { throw new InvalidOperationException("Genesis block should not be inserted."); } @@ -1178,7 +1183,7 @@ private void MoveToMain(Block block, BatchWrite batch, bool wasProcessed, bool f if (forceUpdateHeadBlock || block.IsGenesis || HeadImprovementRequirementsSatisfied(block.Header)) { - if (block.Number == 0) + if (block.Number == _genesisBlockNumber) { Genesis = block.Header; } @@ -1408,7 +1413,7 @@ private void UpdateOrCreateLevel(in ArrayPoolListRef<(long number, BlockInfo blo /// private bool ShouldCache(long number) { - return number == 0L || Head is null || number >= Head.Number - BlockStore.CacheSize; + return number == _genesisBlockNumber || Head is null || number >= Head.Number - BlockStore.CacheSize; } public ChainLevelInfo? FindLevel(long number) diff --git a/src/Nethermind/Nethermind.Core/BlockHeader.cs b/src/Nethermind/Nethermind.Core/BlockHeader.cs index 7f28d015f651..92bcc5d1eabe 100644 --- a/src/Nethermind/Nethermind.Core/BlockHeader.cs +++ b/src/Nethermind/Nethermind.Core/BlockHeader.cs @@ -44,7 +44,8 @@ public BlockHeader( ExcessBlobGas = excessBlobGas; } - public bool IsGenesis => Number == 0L; + public virtual long GenesisBlockNumber => 0; + public bool IsGenesis => Number == GenesisBlockNumber; public Hash256? ParentHash { get; set; } public Hash256? UnclesHash { get; set; } public Address? Author { get; set; }