Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
391d3af
test changes for mainnet
svlachakis Oct 3, 2025
29c4fa5
more changes
svlachakis Oct 8, 2025
b64cb4c
latest changes
svlachakis Oct 8, 2025
5e49a18
mimic SnapProvider in the importer
svlachakis Oct 10, 2025
31b2b3f
exporter and changes
svlachakis Oct 13, 2025
81d6f66
changes that match nitro
svlachakis Oct 13, 2025
cfe6904
code & more fixes
svlachakis Oct 15, 2025
031e155
Merge remote-tracking branch 'origin/main' into stavros-mainnet-sync
svlachakis Oct 15, 2025
0b7ffa8
update latest main
svlachakis Oct 15, 2025
4d55de1
delete unused file
svlachakis Oct 15, 2025
9ee6bbe
logger in ArbitrumRpcModule.cs
svlachakis Oct 15, 2025
12a91e2
comments removal
svlachakis Oct 15, 2025
9487d09
remove comments
svlachakis Oct 15, 2025
3e16979
push nethermind submodule
svlachakis Oct 15, 2025
c11af7f
changes for snapshot
svlachakis Oct 18, 2025
36d8841
DB from snapshot, mainnet changes, minimal cleanup.
svlachakis Oct 18, 2025
11b3434
cleanup
svlachakis Oct 18, 2025
15ad64b
changes
svlachakis Oct 20, 2025
c0b0073
cleanup
svlachakis Oct 20, 2025
61ce2bd
cleanup
svlachakis Oct 20, 2025
e8a5fa8
cleanup
svlachakis Oct 20, 2025
6f0e111
cleanup
svlachakis Oct 20, 2025
b3664f9
Merge remote-tracking branch 'origin/main' into stavros-mainnet-sync-2
svlachakis Oct 20, 2025
746a441
cleanup
svlachakis Oct 20, 2025
d145d7b
makefile
svlachakis Oct 20, 2025
046cfda
fix genesis from 0
svlachakis Oct 20, 2025
a298368
virtual isGenesis on BlockHeader.cs
svlachakis Oct 20, 2025
b28503e
update submodule
svlachakis Oct 20, 2025
62a7663
submodule update
svlachakis Oct 20, 2025
12d526b
Merge remote-tracking branch 'origin/main' into stavros-mainnet-sync-2
svlachakis Oct 20, 2025
dbacb9c
Improvements - fallback to local ChainSpec if this is not present in …
svlachakis Oct 20, 2025
7743dda
Merge remote-tracking branch 'origin/main' into stavros-mainnet-sync-2
svlachakis Oct 23, 2025
481f444
imports
svlachakis Oct 23, 2025
92636bb
Merge remote-tracking branch 'origin/main' into stavros-mainnet-sync-2
svlachakis Oct 23, 2025
189008e
Genesis block header from chainspec
svlachakis Oct 23, 2025
078ba5d
chain config storage change
svlachakis Oct 23, 2025
3eca3ee
change in test infra
svlachakis Oct 23, 2025
cd1280b
build fixes
svlachakis Oct 23, 2025
7746e62
commit PR suggestion
svlachakis Oct 23, 2025
c22dc1a
Merge remote-tracking branch 'origin/main' into stavros-mainnet-sync-2
svlachakis Oct 24, 2025
e86f40e
update nethermind submodule with latest master
svlachakis Oct 24, 2025
f880295
add BuildBlocksOnMainState
svlachakis Oct 24, 2025
01d88c0
small fixes
svlachakis Oct 24, 2025
4aab822
Merge remote-tracking branch 'origin/main' into stavros-mainnet-sync-2
svlachakis Oct 24, 2025
0f51c60
test fix
svlachakis Oct 24, 2025
fef03cd
small PR review comment
svlachakis Oct 27, 2025
3fa900a
PR review comment
svlachakis Oct 27, 2025
dc6869f
Merge branch 'main' into stavros-mainnet-sync-2
svlachakis Oct 27, 2025
9bfbf44
PR review comments
svlachakis Oct 27, 2025
006ef28
small fixes
svlachakis Oct 27, 2025
dba7683
small fix
svlachakis Oct 27, 2025
3cd4f33
PR review comments
svlachakis Oct 27, 2025
042a5c4
PR review comments
svlachakis Oct 27, 2025
cce205a
update chainspec based on https://docs.arbitrum.foundation/network-up…
svlachakis Oct 27, 2025
7705437
fix timestamps
svlachakis Oct 27, 2025
5dfdd0e
chainspec
svlachakis Oct 27, 2025
22cb438
chainspec - match sepolia + additional eips
svlachakis Oct 27, 2025
921d61d
add namespace
svlachakis Oct 28, 2025
81f3856
update hex
svlachakis Oct 28, 2025
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
11 changes: 11 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,17 @@ clean-run-sepolia-verify: ## Clean .data and start Nethermind Arbitrum node (Sep
@$(MAKE) clean
@$(MAKE) run-sepolia-verify

run-mainnet: ## Start Nethermind Arbitrum node (Mainnet) without cleaning .data
@echo "Starting Nethermind Arbitrum node (Mainnet) with metrics..."
cd $(BUILD_OUTPUT_DIR) && dotnet nethermind.dll -c arbitrum-mainnet-archive \
--data-dir $(ROOT_DIR)/.data \
--Snapshot.Enabled true \
--Snapshot.DownloadUrl "https://drive.usercontent.google.com/download?id=1Pf2jTRqgy41dZ-phpyDBvKHqrnQniKgJ&export=download&authuser=1&confirm=t&uuid=55e02503-d00b-4efa-8eb1-9cfaab8d49c8&at=AKSUxGMRmuAIU5MHSL33qOFtwc1q:1760799619104"
Comment thread
hudem1 marked this conversation as resolved.

clean-run-mainnet: ## Clean .data and start Nethermind Arbitrum node (Mainnet)
@$(MAKE) clean
@$(MAKE) run-mainnet

run-sepolia-monitoring: ## Start monitoring stack and Nethermind Arbitrum node (Sepolia)
@echo "Starting monitoring stack..."
@./start-monitoring.sh
Expand Down
2 changes: 1 addition & 1 deletion src/Nethermind
Submodule Nethermind updated 185 files
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Nethermind.Arbitrum.Arbos;
using Nethermind.Arbitrum.Arbos.Compression;
using Nethermind.Arbitrum.Arbos.Storage;
using Nethermind.Arbitrum.Config;
using Nethermind.Arbitrum.Core;
using Nethermind.Arbitrum.Data.Transactions;
using Nethermind.Arbitrum.Evm;
Expand Down Expand Up @@ -1633,8 +1634,8 @@ public void ArbitrumTransaction_WithArbitrumBlockHeader_ProcessesCorrectly()

genesis.Header.BaseFeePerGas = blockBaseFee;

// NEW: Create ArbitrumBlockHeader with original base fee stored
ArbitrumBlockHeader arbitrumHeader = new ArbitrumBlockHeader(genesis.Header, originalBaseFee);
ArbitrumChainSpecEngineParameters chainSpecParams = new() { GenesisBlockNum = 0 };
ArbitrumBlockHeader arbitrumHeader = new(genesis.Header, originalBaseFee, (long)chainSpecParams.GenesisBlockNum!);
arbitrumHeader.BaseFeePerGas = 0; // Set to 0 for EVM execution (NoBaseFee behavior)

BlockExecutionContext blCtx = new(arbitrumHeader, fullChainSimulationSpecProvider.GetSpec(arbitrumHeader));
Expand Down Expand Up @@ -1798,11 +1799,10 @@ public void ArbitrumTransaction_WithArbitrumBlockHeader_UsesOriginalBaseFeeForGa
_logManager
);

UInt256 blockBaseFee = (UInt256)1500;
UInt256 originalBaseFee = (UInt256)3000;

// Create ArbitrumBlockHeader with original base fee stored
ArbitrumBlockHeader arbitrumHeader = new ArbitrumBlockHeader(genesis.Header, originalBaseFee);
ArbitrumChainSpecEngineParameters chainSpecParams = new() { GenesisBlockNum = 0 };
ArbitrumBlockHeader arbitrumHeader = new(genesis.Header, originalBaseFee, (long)chainSpecParams.GenesisBlockNum!);
arbitrumHeader.BaseFeePerGas = 0; // Set to 0 for EVM execution (NoBaseFee behavior)

BlockExecutionContext blCtx = new(arbitrumHeader, fullChainSimulationSpecProvider.GetSpec(arbitrumHeader));
Expand Down Expand Up @@ -1879,8 +1879,8 @@ public void ArbitrumBlockHeader_StoresOriginalBaseFeeCorrectly()

genesis.Header.BaseFeePerGas = blockBaseFee;

// Create ArbitrumBlockHeader
ArbitrumBlockHeader arbitrumHeader = new(genesis.Header, originalBaseFee);
ArbitrumChainSpecEngineParameters chainSpecParams = new() { GenesisBlockNum = 0 };
ArbitrumBlockHeader arbitrumHeader = new(genesis.Header, originalBaseFee, (long)chainSpecParams.GenesisBlockNum!);

// Verify it copies all properties correctly
arbitrumHeader.ParentHash.Should().Be(genesis.Header.ParentHash);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,8 @@ private static ArbitrumRpcTestBlockchain CreateInternal(ArbitrumRpcTestBlockchai
chain.Container.Resolve<IFeeHistoryOracle>(),
chain.Container.Resolve<IProtocolsManager>(),
chain.Container.Resolve<IForkInfo>(),
chain.Container.Resolve<IBlocksConfig>().SecondsPerSlot
chain.Container.Resolve<IBlocksConfig>().SecondsPerSlot,
chain.Container.Resolve<ArbitrumChainSpecEngineParameters>()
);

return chain;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ public async Task ResultAtMessageIndex_BlockNotFound_ReturnsFailResult()
Assert.Multiple(() =>
{
Assert.That(result.Result.ResultType, Is.EqualTo(ResultType.Failure));
Assert.That(result.Result.Error, Does.Contain(ArbitrumRpcErrors.BlockNotFound));
Assert.That(result.Result.Error, Does.Contain(ArbitrumRpcErrors.BlockNotFound((long)blockNumber)));
});
}

Expand Down
13 changes: 13 additions & 0 deletions src/Nethermind.Arbitrum/ArbitrumPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,28 @@
using Nethermind.Api.Steps;
using Nethermind.Arbitrum.Arbos;
using Nethermind.Arbitrum.Config;
using Nethermind.Arbitrum.Core;
using Nethermind.Arbitrum.Evm;
using Nethermind.Arbitrum.Execution;
using Nethermind.Arbitrum.Execution.Transactions;
using Nethermind.Arbitrum.Genesis;
using Nethermind.Arbitrum.Init;
using Nethermind.Arbitrum.Modules;
using Nethermind.Arbitrum.Precompiles;
using Nethermind.Arbitrum.Stylus;
using Nethermind.Blockchain;
using Nethermind.Blockchain.Blocks;
using Nethermind.Blockchain.Headers;
using Nethermind.Blockchain.Synchronization;
using Nethermind.Config;
using Nethermind.Consensus;
using Nethermind.Consensus.Processing;
using Nethermind.Consensus.Producers;
using Nethermind.Core;
using Nethermind.Core.Container;
using Nethermind.Core.Specs;
using Nethermind.Db;
using Nethermind.Db.Blooms;
using Nethermind.Db.Rocks.Config;
using Nethermind.Evm;
using Nethermind.Evm.State;
Expand All @@ -32,8 +40,10 @@
using Nethermind.JsonRpc;
using Nethermind.JsonRpc.Modules;
using Nethermind.JsonRpc.Modules.Eth;
using Nethermind.Logging;
using Nethermind.Serialization.Rlp;
using Nethermind.Specs.ChainSpecStyle;
using Nethermind.State.Repositories;

namespace Nethermind.Arbitrum;

Expand Down Expand Up @@ -174,6 +184,7 @@ protected override void Load(ContainerBuilder builder)
.AddStep(typeof(ArbitrumInitializeBlockchain))
.AddStep(typeof(ArbitrumInitializeWasmDb))
.AddStep(typeof(ArbitrumInitializeStylusNative))
.AddStep(typeof(ArbitrumInitializeGenesis))

.AddDatabase(WasmDb.DbName)
.AddDecorator<IRocksDbConfigFactory, ArbitrumDbConfigFactory>()
Expand All @@ -186,6 +197,8 @@ protected override void Load(ContainerBuilder builder)
return new WasmStore(wasmDb, new StylusTargetConfig(), cacheTag: 1);
})

.AddSingleton<IBlockTree, ArbitrumBlockTree>()

.AddSingleton<ArbitrumBlockTreeInitializer>()

.AddSingleton<IBlockValidationModule, ArbitrumBlockValidationModule>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
using Nethermind.TxPool;

namespace Nethermind.Arbitrum.Config;

public class ArbitrumInitializeBlockchain(ArbitrumNethermindApi api, IChainHeadInfoProvider chainHeadInfoProvider) : InitializeBlockchain(api, chainHeadInfoProvider)
{
protected override IBlockProductionPolicy CreateBlockProductionPolicy() => AlwaysStartBlockProductionPolicy.Instance;

}
5 changes: 4 additions & 1 deletion src/Nethermind.Arbitrum/Core/ArbitrumBlockHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ namespace Nethermind.Arbitrum.Core;

public class ArbitrumBlockHeader : BlockHeader
{
private readonly long _genesisBlockNumber;
public override long GenesisBlockNumber => _genesisBlockNumber;
public UInt256 OriginalBaseFee { get; set; }

public ArbitrumBlockHeader(BlockHeader original, UInt256 originalBaseFee) : base(
public ArbitrumBlockHeader(BlockHeader original, UInt256 originalBaseFee, long genesisBlockNumber) : base(
original.ParentHash ?? Hash256.Zero,
original.UnclesHash ?? Hash256.Zero,
original.Beneficiary ?? Address.Zero,
Expand All @@ -25,6 +27,7 @@ public ArbitrumBlockHeader(BlockHeader original, UInt256 originalBaseFee) : base
original.ParentBeaconBlockRoot,
original.RequestsHash)
{
_genesisBlockNumber = genesisBlockNumber;
OriginalBaseFee = originalBaseFee;

Author = original.Author;
Expand Down
41 changes: 41 additions & 0 deletions src/Nethermind.Arbitrum/Core/ArbitrumBlockTree.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using Nethermind.Arbitrum.Config;
using Nethermind.Blockchain;
using Nethermind.Blockchain.Blocks;
using Nethermind.Blockchain.Headers;
using Nethermind.Blockchain.Synchronization;
using Nethermind.Core.Specs;
using Nethermind.Db;
using Nethermind.Db.Blooms;
using Nethermind.Logging;
using Nethermind.State.Repositories;

namespace Nethermind.Arbitrum.Core;

public class ArbitrumBlockTree(
Comment thread
svlachakis marked this conversation as resolved.
IBlockStore blockStore,
IHeaderStore headerStore,
IDbProvider dbProvider,
IBadBlockStore badBlockStore,
IChainLevelInfoRepository chainLevelInfoRepository,
ISpecProvider specProvider,
IBloomStorage bloomStorage,
ISyncConfig syncConfig,
ILogManager logManager,
ArbitrumChainSpecEngineParameters chainSpecParams)
: BlockTree(
blockStore,
headerStore,
dbProvider.BlockInfosDb,
dbProvider.MetadataDb,
badBlockStore,
chainLevelInfoRepository,
specProvider,
bloomStorage,
syncConfig,
logManager,
(long)chainSpecParams.GenesisBlockNum!)
{
}
64 changes: 64 additions & 0 deletions src/Nethermind.Arbitrum/Genesis/ArbitrumInitializeGenesis.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using Nethermind.Api.Steps;
using Nethermind.Arbitrum.Config;
using Nethermind.Blockchain;
using Nethermind.Core;
using Nethermind.Evm.State;
using Nethermind.Init.Steps;
using Nethermind.Logging;

namespace Nethermind.Arbitrum.Init;

[RunnerStepDependencies(typeof(InitDatabase))]
public class ArbitrumInitializeGenesis : IStep
{
private readonly ArbitrumNethermindApi _api;
private readonly IArbitrumSpecHelper _specHelper;
private readonly ILogger _logger;

public ArbitrumInitializeGenesis(ArbitrumNethermindApi api, IArbitrumSpecHelper specHelper)
{
_api = api;
_specHelper = specHelper;
_logger = _api.LogManager.GetClassLogger();
}

public Task Execute(CancellationToken cancellationToken)
{
if (!_specHelper.Enabled)
return Task.CompletedTask;

long arbitrumGenesisBlockNum = (long)_specHelper.GenesisBlockNum;

if (arbitrumGenesisBlockNum == 0)
{
_logger.Info("Arbitrum genesis block number is 0, skipping initialization");
return Task.CompletedTask;
}

Block? arbitrumGenesisBlock = _api.BlockTree!.FindBlock(arbitrumGenesisBlockNum, BlockTreeLookupOptions.None);

if (arbitrumGenesisBlock is null)
Comment thread
wurdum marked this conversation as resolved.
{
throw new InvalidOperationException(
$"Arbitrum genesis block {arbitrumGenesisBlockNum} not found in BlockTree. " +
"Ensure the snapshot was downloaded correctly before this step.");
}

_logger.Info($"Arbitrum genesis block {arbitrumGenesisBlockNum} already exists (hash: {arbitrumGenesisBlock.Hash})");

// Re-establish state registration by running the state initialization
_logger.Info("Re-initializing genesis state registration...");

IWorldState worldState = _api.WorldStateManager.GlobalWorldState;
using (worldState.BeginScope(IWorldState.PreGenesis))
{
worldState.CommitTree(arbitrumGenesisBlockNum);
Comment thread
svlachakis marked this conversation as resolved.
_logger.Info($"State tree committed for genesis block {arbitrumGenesisBlockNum}");
}
Comment thread
svlachakis marked this conversation as resolved.

return Task.CompletedTask;
}
}
Loading
Loading