Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
e85ece4
Split GetConsensusParsedInitMsg into two variants
pmikolajczyk41 Feb 17, 2026
850f48d
into 3 variants
pmikolajczyk41 Feb 17, 2026
911e97c
Adapt system tests that were just reading msg from consensus
pmikolajczyk41 Feb 17, 2026
3a84783
Adapt tests
pmikolajczyk41 Feb 17, 2026
c31155d
Small fix
pmikolajczyk41 Feb 17, 2026
ccbb095
Changelog
pmikolajczyk41 Feb 17, 2026
a09bba9
fmt
pmikolajczyk41 Feb 17, 2026
df0a54e
Fix getinithelper
pmikolajczyk41 Feb 17, 2026
61f1e76
Fix nilpointers
pmikolajczyk41 Feb 17, 2026
96f46fe
typo
pmikolajczyk41 Feb 17, 2026
f449e61
Merge remote-tracking branch 'origin/master' into pmikolajczyk/nit-42…
pmikolajczyk41 Feb 24, 2026
5576ecf
Merge remote-tracking branch 'origin/master' into pmikolajczyk/nit-42…
pmikolajczyk41 Feb 25, 2026
47d2414
Add GenesisOverride substruct
pmikolajczyk41 Feb 25, 2026
b0d9fbd
s/TestGetParsedInitMsgFromConsensus/TestGetParsedInitMsgFromParentChain
pmikolajczyk41 Feb 25, 2026
629e9f8
Fix the fetching and comparing flow
pmikolajczyk41 Feb 25, 2026
ce1d76c
Merge remote-tracking branch 'origin/master' into pmikolajczyk/nit-42…
pmikolajczyk41 Feb 25, 2026
994e86c
fmt
pmikolajczyk41 Feb 26, 2026
29b465d
Merge remote-tracking branch 'origin/master' into pmikolajczyk/nit-42…
pmikolajczyk41 Feb 26, 2026
7ac6868
Merge branch 'master' into pmikolajczyk/nit-4242-construct-init-msg
pmikolajczyk41 Feb 27, 2026
2956daa
Merge remote-tracking branch 'origin/master' into pmikolajczyk/nit-42…
pmikolajczyk41 Mar 9, 2026
b14aaa2
Clarify comment in IsSet
pmikolajczyk41 Mar 9, 2026
5cdeeef
s/GenesisOverride/GenesisOverrideConfig
pmikolajczyk41 Mar 9, 2026
f5fcc37
Remove validateParsedInitMessagesMatch
pmikolajczyk41 Mar 9, 2026
53b24e4
Run check also for nil
pmikolajczyk41 Mar 9, 2026
21d6cfa
Log message instructions
pmikolajczyk41 Mar 9, 2026
e8abb34
Require ArbOSInit.InitialL1BaseFee in genesis instead of falling back…
pmikolajczyk41 Mar 9, 2026
07c3a2a
log lines indicating from which source Execution retrieved parsed ini…
pmikolajczyk41 Mar 9, 2026
daeed5c
write the initial l1 base fee in log
pmikolajczyk41 Mar 9, 2026
941c090
minor fixed
pmikolajczyk41 Mar 9, 2026
8334ec3
TestGetExecutionParsedInitMsg
pmikolajczyk41 Mar 9, 2026
cc986a7
Add arbosinit to testgenesis
pmikolajczyk41 Mar 9, 2026
637484e
Merge remote-tracking branch 'origin/master' into pmikolajczyk/nit-42…
pmikolajczyk41 Mar 11, 2026
9fb636d
Revert "Remove validateParsedInitMessagesMatch"
pmikolajczyk41 Mar 11, 2026
49d1f69
Add info that it was read from parent chain
pmikolajczyk41 Mar 11, 2026
252e24f
Tell operator what is the default
pmikolajczyk41 Mar 11, 2026
a9a51d3
Do not hardcode
pmikolajczyk41 Mar 11, 2026
b6011c4
Full override validation
pmikolajczyk41 Mar 11, 2026
c978a2d
Clarify log
pmikolajczyk41 Mar 11, 2026
984cd9a
run validateChainConfigCompatibility with any parsed message
pmikolajczyk41 Mar 11, 2026
73cb2de
Fix test
pmikolajczyk41 Mar 11, 2026
69fb0af
Require neither or both parameters in override
pmikolajczyk41 Mar 11, 2026
2983735
Remove redundant test
pmikolajczyk41 Mar 11, 2026
48f1871
Merge remote-tracking branch 'origin/master' into pmikolajczyk/nit-42…
pmikolajczyk41 Mar 12, 2026
ecb1930
Parse fee only when chainConfigSet is true
pmikolajczyk41 Mar 12, 2026
e638907
Chain config shouldn't be nil
pmikolajczyk41 Mar 12, 2026
d5c674a
Return error if fee not set
pmikolajczyk41 Mar 12, 2026
b563224
Remove unneeded test
pmikolajczyk41 Mar 12, 2026
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
2 changes: 2 additions & 0 deletions changelog/pmikolajczyk-nit-4242.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
### Added
- Nitro can restore parsed init message from genesis, without access to the consensus side
119 changes: 90 additions & 29 deletions cmd/conf/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,48 +3,104 @@
package conf

import (
"encoding/json"
"fmt"
"math/big"
"slices"
"strings"
"time"

"github.com/spf13/pflag"

"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"

"github.com/offchainlabs/nitro/util"
)

type GenesisOverrideConfig struct {
SerializedChainConfig string `koanf:"serialized-chain-config"`
InitialL1BaseFee string `koanf:"initial-l1-base-fee"`
}

var GenesisOverrideConfigDefault = GenesisOverrideConfig{
SerializedChainConfig: "",
InitialL1BaseFee: "",
Comment thread
diegoximenes marked this conversation as resolved.
}

func GenesisOverrideConfigAddOptions(prefix string, f *pflag.FlagSet) {
f.String(prefix+".serialized-chain-config", GenesisOverrideConfigDefault.SerializedChainConfig, "JSON-serialized chain config, can be used to provide chain config when genesis.json is not available")
f.String(prefix+".initial-l1-base-fee", GenesisOverrideConfigDefault.InitialL1BaseFee, "initial L1 base fee (in wei), must be set together with serialized-chain-config")
}

// ParseInitialL1BaseFee parses the InitialL1BaseFee string into a *big.Int.
func (c *GenesisOverrideConfig) ParseInitialL1BaseFee() (*big.Int, error) {
if c.InitialL1BaseFee == "" {
return nil, fmt.Errorf("initial-l1-base-fee is not set")
}
fee, ok := new(big.Int).SetString(c.InitialL1BaseFee, 10)
if !ok {
return nil, fmt.Errorf("failed to parse initial-l1-base-fee %q as integer", c.InitialL1BaseFee)
}
if fee.Sign() < 0 {
return nil, fmt.Errorf("initial-l1-base-fee must be non-negative, got %s", c.InitialL1BaseFee)
}
return fee, nil
}

func (c *GenesisOverrideConfig) Validate() error {
chainConfigSet := c.SerializedChainConfig != ""
baseFeeSet := c.InitialL1BaseFee != ""
if chainConfigSet != baseFeeSet {
return fmt.Errorf("genesis-override.serialized-chain-config and genesis-override.initial-l1-base-fee must both be set or both be empty")
}
if chainConfigSet {
var chainConfig params.ChainConfig
if err := json.Unmarshal([]byte(c.SerializedChainConfig), &chainConfig); err != nil {
return fmt.Errorf("failed to unmarshal serialized-chain-config: %w", err)
}
if _, err := c.ParseInitialL1BaseFee(); err != nil {
return fmt.Errorf("failed to parse initial-l1-base-fee: %w", err)
}
}
return nil
}

func (c *GenesisOverrideConfig) IsSet() bool {
return c != nil && c.SerializedChainConfig != ""
}

type InitConfig struct {
Force bool `koanf:"force"`
Url string `koanf:"url"`
Latest string `koanf:"latest"`
LatestBase string `koanf:"latest-base"`
ValidateChecksum bool `koanf:"validate-checksum"`
DownloadPath string `koanf:"download-path"`
DownloadPoll time.Duration `koanf:"download-poll"`
DevInit bool `koanf:"dev-init"`
DevInitAddress string `koanf:"dev-init-address"`
DevMaxCodeSize uint64 `koanf:"dev-max-code-size"`
DevInitBlockNum uint64 `koanf:"dev-init-blocknum"`
Empty bool `koanf:"empty"`
ImportWasm bool `koanf:"import-wasm"`
AccountsPerSync uint `koanf:"accounts-per-sync"`
ImportFile string `koanf:"import-file"`
GenesisJsonFile string `koanf:"genesis-json-file"`
GenesisJsonFileDirectory string `koanf:"genesis-json-file-directory"`
ThenQuit bool `koanf:"then-quit"`
Prune string `koanf:"prune"`
PruneParallelStorageTraversal bool `koanf:"prune-parallel-storage-traversal"`
PruneBloomSize uint64 `koanf:"prune-bloom-size"`
PruneThreads int `koanf:"prune-threads"`
PruneTrieCleanCache int `koanf:"prune-trie-clean-cache"`
RecreateMissingStateFrom uint64 `koanf:"recreate-missing-state-from"`
RebuildLocalWasm string `koanf:"rebuild-local-wasm"`
ReorgToBatch int64 `koanf:"reorg-to-batch"`
ReorgToMessageBatch int64 `koanf:"reorg-to-message-batch"`
ReorgToBlockBatch int64 `koanf:"reorg-to-block-batch"`
ValidateGenesisAssertion bool `koanf:"validate-genesis-assertion"`
Force bool `koanf:"force"`
Url string `koanf:"url"`
Latest string `koanf:"latest"`
LatestBase string `koanf:"latest-base"`
ValidateChecksum bool `koanf:"validate-checksum"`
DownloadPath string `koanf:"download-path"`
DownloadPoll time.Duration `koanf:"download-poll"`
DevInit bool `koanf:"dev-init"`
DevInitAddress string `koanf:"dev-init-address"`
DevMaxCodeSize uint64 `koanf:"dev-max-code-size"`
DevInitBlockNum uint64 `koanf:"dev-init-blocknum"`
Empty bool `koanf:"empty"`
ImportWasm bool `koanf:"import-wasm"`
AccountsPerSync uint `koanf:"accounts-per-sync"`
ImportFile string `koanf:"import-file"`
GenesisJsonFile string `koanf:"genesis-json-file"`
GenesisJsonFileDirectory string `koanf:"genesis-json-file-directory"`
GenesisOverride GenesisOverrideConfig `koanf:"genesis-override"`
ThenQuit bool `koanf:"then-quit"`
Prune string `koanf:"prune"`
PruneParallelStorageTraversal bool `koanf:"prune-parallel-storage-traversal"`
PruneBloomSize uint64 `koanf:"prune-bloom-size"`
PruneThreads int `koanf:"prune-threads"`
PruneTrieCleanCache int `koanf:"prune-trie-clean-cache"`
RecreateMissingStateFrom uint64 `koanf:"recreate-missing-state-from"`
RebuildLocalWasm string `koanf:"rebuild-local-wasm"`
ReorgToBatch int64 `koanf:"reorg-to-batch"`
ReorgToMessageBatch int64 `koanf:"reorg-to-message-batch"`
ReorgToBlockBatch int64 `koanf:"reorg-to-block-batch"`
ValidateGenesisAssertion bool `koanf:"validate-genesis-assertion"`
}

var InitConfigDefault = InitConfig{
Expand All @@ -64,6 +120,7 @@ var InitConfigDefault = InitConfig{
ImportFile: "",
GenesisJsonFile: "",
GenesisJsonFileDirectory: "",
GenesisOverride: GenesisOverrideConfigDefault,
AccountsPerSync: 100000,
ThenQuit: false,
Prune: "",
Expand Down Expand Up @@ -97,6 +154,7 @@ func InitConfigAddOptions(prefix string, f *pflag.FlagSet) {
f.String(prefix+".import-file", InitConfigDefault.ImportFile, "path for json data to import")
f.String(prefix+".genesis-json-file", InitConfigDefault.GenesisJsonFile, "path for genesis json file")
f.String(prefix+".genesis-json-file-directory", InitConfigDefault.GenesisJsonFileDirectory, "directory path for genesis json files - will search for a file named by the chain ID")
GenesisOverrideConfigAddOptions(prefix+".genesis-override", f)
f.Uint(prefix+".accounts-per-sync", InitConfigDefault.AccountsPerSync, "during init - sync database every X accounts. Lower value for low-memory systems. 0 disables.")
f.String(prefix+".prune", InitConfigDefault.Prune, "pruning for a given use: \"full\" for full nodes serving RPC requests, or \"validator\" for validators")
f.Bool(prefix+".prune-parallel-storage-traversal", InitConfigDefault.PruneParallelStorageTraversal, "if true: use parallel pruning per account")
Expand All @@ -119,6 +177,9 @@ func (c *InitConfig) Validate() error {
if c.Empty && c.GenesisJsonFile != "" {
return fmt.Errorf("init config cannot be both empty and have a genesis json file specified")
}
if err := c.GenesisOverride.Validate(); err != nil {
return fmt.Errorf("invalid init.genesis-override: %w", err)
}
if c.Force && c.RecreateMissingStateFrom > 0 {
log.Warn("force init enabled, recreate-missing-state-from will have no effect")
}
Expand Down
Loading
Loading