Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
2cdfb07
update l2 RetryableClient
Dec 11, 2025
7c11f8c
fmt
Dec 11, 2025
98925c5
clean
Dec 11, 2025
c34bee9
fix mpt time
Dec 11, 2025
e39a59a
fix
Dec 15, 2025
105c335
Merge branch 'main' into mpt-switch
curryxbo Dec 15, 2025
a3d76f2
clean
Dec 17, 2025
8ae80bd
fix and test
Dec 22, 2025
d5f2d8d
clean
Dec 22, 2025
fa2307f
update
Jan 9, 2026
c38ea30
refactor
Jan 12, 2026
8b2a833
chore: remove mpt-switch-test from git tracking
Jan 12, 2026
c9f508d
chore: revert go-ethereum submodule to previous version
Jan 12, 2026
0968304
fix
Jan 12, 2026
f4d7b0c
rollback skip bls verify
Jan 13, 2026
32512d0
fix
Jan 13, 2026
b5e977c
clean
Jan 13, 2026
5f6ad17
clean
Jan 13, 2026
8631ca8
Merge branch 'main' into mpt-switch
Jan 13, 2026
5dea362
update geth version
Jan 13, 2026
772df41
Fix NewRetryableClient (#856)
curryxbo Jan 15, 2026
75181a7
Fix swtich time (#862)
curryxbo Jan 28, 2026
6120b0a
add mpt upgrade code for batch finalize
Kukoomomo Jan 29, 2026
89218d0
fix log level
Jan 29, 2026
0a63c6b
fix log level
Jan 29, 2026
a438b20
Force batch points around MPT fork to isolate the first post-fork blo…
FletcherMan Jan 30, 2026
8abcf7c
update submitter mpt config
Kukoomomo Jan 30, 2026
d6dd008
Merge branch 'mpt-switch' of github.com:morph-l2/morph into mpt-switch
Kukoomomo Jan 30, 2026
abcc805
update submitter mpt config
Kukoomomo Jan 30, 2026
57cf1e4
add bls key fork height flag (#863)
FletcherMan Feb 3, 2026
0f74ddb
Add retry for fetch eth_config (#865)
curryxbo Feb 4, 2026
0ec7bda
Merge branch 'main' into mpt-switch
curryxbo Feb 6, 2026
fd31a72
update geth version
Feb 6, 2026
fae4ad8
clean unused code
Kukoomomo Feb 9, 2026
ffa5e6d
Merge branch 'mpt-switch' of github.com:morph-l2/morph into mpt-switch
Kukoomomo Feb 9, 2026
f11e92a
Bump version and fix lint (#881)
curryxbo Feb 11, 2026
f34a133
make submodules
curryxbo Feb 11, 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
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,9 @@ contracts/mainnet.json
.env

# logs
*.log
*.log

# mpt-switch-test data
ops/mpt-switch-test/.testdata
ops/mpt-switch-test/bin
ops/mpt-switch-test/local-test/geth-data
2 changes: 1 addition & 1 deletion bindings/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.24.0

replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2

require github.com/morph-l2/go-ethereum v1.10.14-0.20251203083507-49fa27bcab24
require github.com/morph-l2/go-ethereum v1.10.14-0.20251211075654-796834acba86

require (
github.com/VictoriaMetrics/fastcache v1.12.2 // indirect
Expand Down
3 changes: 1 addition & 2 deletions bindings/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,7 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/morph-l2/go-ethereum v1.10.14-0.20251203083507-49fa27bcab24 h1:r9eaQDNgjAxsuUchmoCFaAjL1TmUfjAmIlJjAtgUk8U=
github.com/morph-l2/go-ethereum v1.10.14-0.20251203083507-49fa27bcab24/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M=
github.com/morph-l2/go-ethereum v1.10.14-0.20251211075654-796834acba86 h1:4BgRnW5lZcgtVvK/WuDTNAfi5F5/VEb7FbDEvCksPHk=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
Expand Down
2 changes: 1 addition & 1 deletion contracts/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.

require (
github.com/iden3/go-iden3-crypto v0.0.16
github.com/morph-l2/go-ethereum v1.10.14-0.20251203083507-49fa27bcab24
github.com/morph-l2/go-ethereum v1.10.14-0.20251211075654-796834acba86
github.com/stretchr/testify v1.10.0
)

Expand Down
3 changes: 1 addition & 2 deletions contracts/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,7 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/morph-l2/go-ethereum v1.10.14-0.20251203083507-49fa27bcab24 h1:r9eaQDNgjAxsuUchmoCFaAjL1TmUfjAmIlJjAtgUk8U=
github.com/morph-l2/go-ethereum v1.10.14-0.20251203083507-49fa27bcab24/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M=
github.com/morph-l2/go-ethereum v1.10.14-0.20251211075654-796834acba86 h1:4BgRnW5lZcgtVvK/WuDTNAfi5F5/VEb7FbDEvCksPHk=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
Expand Down
7 changes: 7 additions & 0 deletions node/core/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ var (
)

type Config struct {
L2Legacy *types.L2Config `json:"l_2_legacy"`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

JSON tag naming inconsistency.

The JSON tag l_2_legacy uses an underscore between "2" and "legacy", while the existing L2 field at line 32 uses l2 without separating underscores. For consistency, consider using l2_legacy instead of l_2_legacy.

📝 Suggested fix
-	L2Legacy                      *types.L2Config `json:"l_2_legacy"`
+	L2Legacy                      *types.L2Config `json:"l2_legacy"`
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
L2Legacy *types.L2Config `json:"l_2_legacy"`
L2Legacy *types.L2Config `json:"l2_legacy"`
🤖 Prompt for AI Agents
In @node/core/config.go at line 31, The JSON tag for the L2Legacy struct field
is inconsistent with the existing L2 field; update the struct tag on L2Legacy
(symbol: L2Legacy) from `json:"l_2_legacy"` to `json:"l2_legacy"` so it follows
the existing `l2` style and maintains consistent JSON naming conventions with
the L2 field (symbol: L2).

L2 *types.L2Config `json:"l2"`
L2CrossDomainMessengerAddress common.Address `json:"cross_domain_messenger_address"`
SequencerAddress common.Address `json:"sequencer_address"`
Expand All @@ -42,6 +43,7 @@ type Config struct {
func DefaultConfig() *Config {
return &Config{
L2: new(types.L2Config),
L2Legacy: new(types.L2Config),
Logger: tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout)),
MaxL1MessageNumPerBlock: 100,
L2CrossDomainMessengerAddress: predeploys.L2CrossDomainMessengerAddr,
Expand Down Expand Up @@ -122,6 +124,11 @@ func (c *Config) SetCliContext(ctx *cli.Context) error {
c.L2.EngineAddr = l2EngineAddr
c.L2.JwtSecret = secret

l2LegacyEthAddr := ctx.GlobalString(flags.L2LegacyEthAddr.Name)
l2LegacyEngineAddr := ctx.GlobalString(flags.L2LegacyEngineAddr.Name)
c.L2Legacy.EthAddr = l2LegacyEthAddr
c.L2Legacy.EngineAddr = l2LegacyEngineAddr
c.L2Legacy.JwtSecret = secret // same secret
Comment thread
curryxbo marked this conversation as resolved.
Outdated
if ctx.GlobalIsSet(flags.MaxL1MessageNumPerBlock.Name) {
c.MaxL1MessageNumPerBlock = ctx.GlobalUint64(flags.MaxL1MessageNumPerBlock.Name)
if c.MaxL1MessageNumPerBlock == 0 {
Expand Down
52 changes: 46 additions & 6 deletions node/core/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,15 @@ func getNextL1MsgIndex(client *types.RetryableClient) (uint64, error) {
func NewExecutor(newSyncFunc NewSyncerFunc, config *Config, tmPubKey crypto.PubKey) (*Executor, error) {
logger := config.Logger
logger = logger.With("module", "executor")
// legacy zk endpoint
laClient, err := authclient.DialContext(context.Background(), config.L2Legacy.EngineAddr, config.L2Legacy.JwtSecret)
if err != nil {
return nil, err
}
leClient, err := ethclient.Dial(config.L2Legacy.EthAddr)
if err != nil {
return nil, err
}
aClient, err := authclient.DialContext(context.Background(), config.L2.EngineAddr, config.L2.JwtSecret)
if err != nil {
return nil, err
Expand All @@ -79,7 +88,7 @@ func NewExecutor(newSyncFunc NewSyncerFunc, config *Config, tmPubKey crypto.PubK
return nil, err
}

l2Client := types.NewRetryableClient(aClient, eClient, config.Logger)
l2Client := types.NewRetryableClient(laClient, leClient, aClient, eClient, config.L2Legacy.EthAddr, config.Logger)
index, err := getNextL1MsgIndex(l2Client)
if err != nil {
return nil, err
Expand Down Expand Up @@ -276,16 +285,39 @@ func (e *Executor) DeliverBlock(txs [][]byte, metaData []byte, consensusData l2n
}

if wrappedBlock.Number <= height {
e.logger.Info("ignore it, the block was delivered", "block number", wrappedBlock.Number)
if e.devSequencer {
return nil, consensusData.ValidatorSet, nil
e.logger.Info("block already delivered by geth (via P2P sync)", "block_number", wrappedBlock.Number)
// Even if block was already delivered (e.g., synced via P2P), we still need to check
// if MPT switch should happen, otherwise sentry nodes won't switch to the correct geth.
e.l2Client.EnsureSwitched(context.Background(), wrappedBlock.Timestamp, wrappedBlock.Number)

// After switch, re-check height from the new geth client
// The block might exist in legacy geth but not in target geth after switch
newHeight, err := e.l2Client.BlockNumber(context.Background())
if err != nil {
return nil, nil, err
}
if wrappedBlock.Number > newHeight {
e.logger.Info("block not in target geth after switch, need to deliver",
"block_number", wrappedBlock.Number,
"old_height", height,
"new_height", newHeight)
// Update height and continue to deliver the block
height = newHeight
} else {
if e.devSequencer {
return nil, consensusData.ValidatorSet, nil
}
return e.getParamsAndValsAtHeight(int64(wrappedBlock.Number))
}
Comment thread
curryxbo marked this conversation as resolved.
return e.getParamsAndValsAtHeight(int64(wrappedBlock.Number))
}

// We only accept the continuous blocks for now.
// It acts like full sync. Snap sync is not enabled until the Geth enables snapshot with zkTrie
if wrappedBlock.Number > height+1 {
e.logger.Error("!!! CRITICAL: Geth is behind - node BLOCKED !!!",
"consensus_block", wrappedBlock.Number,
"geth_height", height,
"action", "Switch to MPT-compatible geth IMMEDIATELY")
return nil, nil, types.ErrWrongBlockNumber
}

Expand Down Expand Up @@ -317,7 +349,15 @@ func (e *Executor) DeliverBlock(txs [][]byte, metaData []byte, consensusData l2n
}
err = e.l2Client.NewL2Block(context.Background(), l2Block, batchHash)
if err != nil {
e.logger.Error("failed to NewL2Block", "error", err)
e.logger.Error("========================================")
e.logger.Error("CRITICAL: Failed to deliver block to geth!")
e.logger.Error("========================================")
e.logger.Error("failed to NewL2Block",
"error", err,
"block_number", l2Block.Number,
"block_timestamp", l2Block.Timestamp)
e.logger.Error("HINT: If this occurs after MPT upgrade, your geth node may not support MPT blocks. " +
"Please ensure you are running an MPT-compatible geth node.")
return nil, nil, err
}

Expand Down
5 changes: 5 additions & 0 deletions node/core/sequencers.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ func (e *Executor) VerifySignature(tmPubKey []byte, messageHash []byte, blsSig [
e.logger.Info("we are in dev mode, do not verify the bls signature")
return true, nil
}
//// Skip BLS verification for non-sequencer nodes (they may not have correct sequencer set from their geth)
//if !e.isSequencer {
// e.logger.Debug("non-sequencer node, skip bls signature verification")
// return true, nil
//}
if len(e.valsByTmKey) == 0 {
return false, errors.New("no available sequencers found in layer2")
}
Expand Down
6 changes: 6 additions & 0 deletions node/derivation/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ const (

type Config struct {
L1 *types.L1Config `json:"l1"`
L2Legacy *types.L2Config `json:"l2_legacy"`
L2 *types.L2Config `json:"l2"`
BeaconRpc string `json:"beacon_rpc"`
RollupContractAddress common.Address `json:"rollup_contract_address"`
Expand Down Expand Up @@ -135,6 +136,11 @@ func (c *Config) SetCliContext(ctx *cli.Context) error {
c.L2.EthAddr = l2EthAddr
c.L2.EngineAddr = l2EngineAddr
c.L2.JwtSecret = secret
l2LegacyEthAddr := ctx.GlobalString(flags.L2LegacyEthAddr.Name)
l2LegacyEngineAddr := ctx.GlobalString(flags.L2LegacyEngineAddr.Name)
c.L2Legacy.EthAddr = l2LegacyEthAddr
c.L2Legacy.EngineAddr = l2LegacyEngineAddr
c.L2Legacy.JwtSecret = secret // same secret
c.MetricsServerEnable = ctx.GlobalBool(flags.MetricsServerEnable.Name)
c.MetricsHostname = ctx.GlobalString(flags.MetricsHostname.Name)
c.MetricsPort = ctx.GlobalUint64(flags.MetricsPort.Name)
Expand Down
11 changes: 10 additions & 1 deletion node/derivation/derivation.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,15 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer,
if err != nil {
return nil, err
}
// legacy zk endpoint
laClient, err := authclient.DialContext(context.Background(), cfg.L2Legacy.EngineAddr, cfg.L2Legacy.JwtSecret)
if err != nil {
return nil, err
}
leClient, err := ethclient.Dial(cfg.L2Legacy.EthAddr)
if err != nil {
return nil, err
}
aClient, err := authclient.DialContext(context.Background(), cfg.L2.EngineAddr, cfg.L2.JwtSecret)
if err != nil {
return nil, err
Expand Down Expand Up @@ -129,7 +138,7 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer,
logger: logger,
RollupContractAddress: cfg.RollupContractAddress,
confirmations: cfg.L1.Confirmations,
l2Client: types.NewRetryableClient(aClient, eClient, tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout))),
l2Client: types.NewRetryableClient(laClient, leClient, aClient, eClient, cfg.L2Legacy.EthAddr, tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout))),
cancel: cancel,
stop: make(chan struct{}),
startHeight: cfg.StartHeight,
Expand Down
14 changes: 14 additions & 0 deletions node/flags/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,18 @@ var (
EnvVar: prefixEnvVar("L2_ENGINE_RPC"),
}

L2LegacyEthAddr = cli.StringFlag{
Name: "l2legacy.eth",
Usage: "Address of L2 legacy Engine JSON-RPC endpoints to use (eth namespace required)",
EnvVar: prefixEnvVar("L2_LEGACY_ETH_RPC"),
}

L2LegacyEngineAddr = cli.StringFlag{
Name: "l2legacy.engine",
Usage: "Address of L2 legacy Engine JSON-RPC endpoints to use (engine namespace required)",
EnvVar: prefixEnvVar("L2_LEGACY_ENGINE_RPC"),
}
Comment thread
curryxbo marked this conversation as resolved.
Outdated

L2EngineJWTSecret = cli.StringFlag{
Name: "l2.jwt-secret",
Usage: "Path to JWT secret key. Keys are 32 bytes, hex encoded in a file. A new key will be generated if left empty.",
Expand Down Expand Up @@ -304,6 +316,8 @@ var Flags = []cli.Flag{
L2EthAddr,
L2EngineAddr,
L2EngineJWTSecret,
L2LegacyEthAddr,
L2LegacyEngineAddr,
MaxL1MessageNumPerBlock,
L2CrossDomainMessengerContractAddr,
L2SequencerAddr,
Expand Down
2 changes: 1 addition & 1 deletion node/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ require (
github.com/hashicorp/golang-lru v1.0.2
github.com/holiman/uint256 v1.2.4
github.com/klauspost/compress v1.17.9
github.com/morph-l2/go-ethereum v1.10.14-0.20251203083507-49fa27bcab24
github.com/morph-l2/go-ethereum v1.10.14-0.20251211075654-796834acba86
github.com/prometheus/client_golang v1.17.0
github.com/spf13/viper v1.13.0
github.com/stretchr/testify v1.10.0
Expand Down
4 changes: 2 additions & 2 deletions node/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -361,8 +361,8 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/morph-l2/go-ethereum v1.10.14-0.20251203083507-49fa27bcab24 h1:r9eaQDNgjAxsuUchmoCFaAjL1TmUfjAmIlJjAtgUk8U=
github.com/morph-l2/go-ethereum v1.10.14-0.20251203083507-49fa27bcab24/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M=
github.com/morph-l2/go-ethereum v1.10.14-0.20251211075654-796834acba86 h1:4BgRnW5lZcgtVvK/WuDTNAfi5F5/VEb7FbDEvCksPHk=
github.com/morph-l2/go-ethereum v1.10.14-0.20251211075654-796834acba86/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M=
github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8=
github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
Expand Down
Loading