Skip to content

Conversation

@rauljordan
Copy link
Contributor

@rauljordan rauljordan commented Feb 5, 2026

This PR completes the new, unified replay binary used by Nitro that can perform both message extraction and block execution. It also ties MEL into the block validator so that the block validator can operate over messages extracted by MEL. With MEL-enabled, the block validator's responsibility becomes quite simple: it simply asks for the latest MEL state that was validated, and schedules an Arbitrator execution run over a message. This PR adds a new MEL-Enabled Validation Entry Creator which contains the logic to deal with MEL in the block validator. This requires very few other changes to the block validator.

We also add a system test that does the following:

  1. Posts some simple transfers as a blob transaction to the parent chain
  2. Post some delayed messages
  3. Awaits for native extraction of those messages
  4. Runs validation over the extraction
  5. Runs validation of execution in a for loop over all the messages extracted in step (4)

@github-actions
Copy link
Contributor

github-actions bot commented Feb 5, 2026

❌ 49 Tests Failed:

Tests completed Failed Passed Skipped
4175 49 4126 0
View the top 3 failed tests by shortest run time
TestEndToEnd_ManyEvilValidators
Stack Traces | -0.000s run time
... [CONTENT TRUNCATED: Keeping last 20 lines]
created by github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast in goroutine 312575
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:106 +0xca

goroutine 5404890 [select]:
github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast.func1()
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:107 +0xc5
created by github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast in goroutine 312581
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:106 +0xca

goroutine 5405136 [select]:
github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast.func1()
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:107 +0xc5
created by github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast in goroutine 312578
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:106 +0xca

goroutine 5404897 [select]:
github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast.func1()
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:107 +0xc5
created by github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast in goroutine 312581
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:106 +0xca
TestEndToEnd_ManyEvilValidators/honest_essential_edges_confirmed_by_challenge_win
Stack Traces | -0.000s run time
... [CONTENT TRUNCATED: Keeping last 20 lines]
created by github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast in goroutine 312575
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:106 +0xca

goroutine 5404890 [select]:
github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast.func1()
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:107 +0xc5
created by github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast in goroutine 312581
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:106 +0xca

goroutine 5405136 [select]:
github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast.func1()
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:107 +0xc5
created by github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast in goroutine 312578
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:106 +0xca

goroutine 5404897 [select]:
github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast.func1()
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:107 +0xc5
created by github.com/offchainlabs/nitro/bold/containers/events.(*Producer[...]).Broadcast in goroutine 312581
	/home/runner/work/nitro/nitro/bold/containers/events/producer.go:106 +0xca
TestNitroNodeVersionAlerter
Stack Traces | 0.670s run time
... [CONTENT TRUNCATED: Keeping last 20 lines]
WARN [02-12|20:20:19.956] Served eth_sendRawTransactionConditional reqid=1348  duration=4.543041ms    err="Storage slot value condition not met"
INFO [02-12|20:20:19.958] Submitted transaction                    hash=0xcbf9297b6cd812bca207a516907e543f6a6dc3d5019e093881ff62defcac22f6 from=0x26E554a8acF9003b83495c7f45F06edCB803d4e3 nonce=58  recipient=0x26E554a8acF9003b83495c7f45F06edCB803d4e3 value=1
WARN [02-12|20:20:19.958] Served eth_call                          reqid=27691 duration="33.963µs"    err="header not found"
WARN [02-12|20:20:19.959] error applying transaction               tx="{\"type\":\"0x2\",\"chainId\":\"0x64aba\",\"nonce\":\"0x10e\",\"to\":\"0x0c709f340f0bb2e361229e345b7e26999d0969ab\",\"gas\":\"0x7a1200\",\"gasPrice\":\"0x0\",\"maxPriorityFeePerGas\":\"0xbebc200\",\"maxFeePerGas\":\"0xbebc200\",\"value\":\"0xe8d4a51000\",\"input\":\"0x\",\"accessList\":[],\"v\":\"0x0\",\"r\":\"0xdf4963485a7283d0654d893448fa218303e41e959f161d1347a0a56d6b98c0e4\",\"s\":\"0x4f968ee6eb6659dabed2006229e9299f053ccd70551e95a1d8a231a1ec627bb9\",\"yParity\":\"0x0\",\"hash\":\"0x2712e5c45d81800feae08d549320a6c995bc9c0e3d3f7eb5b306a8455ff58d59\"}" err="Storage slot value condition not met"
WARN [02-12|20:20:19.960] Served eth_sendRawTransactionConditional reqid=1349  duration=2.720985ms    err="Storage slot value condition not met"
WARN [02-12|20:20:19.960] Served eth_call                          reqid=6025  duration="35.376µs"    err="header not found"
WARN [02-12|20:20:19.961] error applying transaction               tx="{\"type\":\"0x2\",\"chainId\":\"0x64aba\",\"nonce\":\"0x10e\",\"to\":\"0x0c709f340f0bb2e361229e345b7e26999d0969ab\",\"gas\":\"0x7a1200\",\"gasPrice\":\"0x0\",\"maxPriorityFeePerGas\":\"0xbebc200\",\"maxFeePerGas\":\"0xbebc200\",\"value\":\"0xe8d4a51000\",\"input\":\"0x\",\"accessList\":[],\"v\":\"0x0\",\"r\":\"0xdf4963485a7283d0654d893448fa218303e41e959f161d1347a0a56d6b98c0e4\",\"s\":\"0x4f968ee6eb6659dabed2006229e9299f053ccd70551e95a1d8a231a1ec627bb9\",\"yParity\":\"0x0\",\"hash\":\"0x2712e5c45d81800feae08d549320a6c995bc9c0e3d3f7eb5b306a8455ff58d59\"}" err="Storage root hash condition not met"
INFO [02-12|20:20:19.962] Submitted transaction                    hash=0x64e6cf11eedcdada1f65640f25599a5dc19aa89eb035b9f811281687083f0027 from=0xaF24Ca6c2831f4d4F629418b50C227DF0885613A nonce=54  recipient=0xaF24Ca6c2831f4d4F629418b50C227DF0885613A value=1
INFO [02-12|20:20:19.961] Starting peer-to-peer node               instance=test-stack-name/linux-amd64/go1.25.6
WARN [02-12|20:20:19.962] P2P server will be useless, neither dialing nor listening
WARN [02-12|20:20:19.963] Served eth_sendRawTransactionConditional reqid=1350  duration=2.505363ms    err="Storage root hash condition not met"
INFO [02-12|20:20:19.963] Starting work on payload                 id=0x033874bdb4f3b8d7
WARN [02-12|20:20:19.964] error applying transaction               tx="{\"type\":\"0x2\",\"chainId\":\"0x64aba\",\"nonce\":\"0x10e\",\"to\":\"0x0c709f340f0bb2e361229e345b7e26999d0969ab\",\"gas\":\"0x7a1200\",\"gasPrice\":\"0x0\",\"maxPriorityFeePerGas\":\"0xbebc200\",\"maxFeePerGas\":\"0xbebc200\",\"value\":\"0xe8d4a51000\",\"input\":\"0x\",\"accessList\":[],\"v\":\"0x0\",\"r\":\"0xdf4963485a7283d0654d893448fa218303e41e959f161d1347a0a56d6b98c0e4\",\"s\":\"0x4f968ee6eb6659dabed2006229e9299f053ccd70551e95a1d8a231a1ec627bb9\",\"yParity\":\"0x0\",\"hash\":\"0x2712e5c45d81800feae08d549320a6c995bc9c0e3d3f7eb5b306a8455ff58d59\"}" err="Storage root hash condition not met"
WARN [02-12|20:20:19.964] Getting file info                        dir= error="stat : no such file or directory"
WARN [02-12|20:20:19.964] Served eth_call                          reqid=27700 duration="136.885µs"   err="header not found"
INFO [02-12|20:20:19.965] Started log indexer
INFO [02-12|20:20:19.965] New local node record                    seq=1,770,927,619,965 id=73f5dda525e5fe3f   ip=127.0.0.1 udp=0 tcp=0
INFO [02-12|20:20:19.965] Started P2P networking                   self=enode://8150b21ce6cfd80e1896c7fc8838082bdc8a999da8cead9ef1bb6639d9be18e45a64f4d83f50d49c64d8c1c90e02ab4468de21afd502bb0946f1c3030dc3afe9@127.0.0.1:0
INFO [02-12|20:20:19.965] Updated payload                          id=0x033874bdb4f3b8d7 number=110 hash=b0951c..fd4ce2 txs=1   withdrawals=0 gas=21000      fees=0.002099998346 root=50c02c..7fae74 elapsed=1.788ms
--- FAIL: TestNitroNodeVersionAlerter (0.67s)

📣 Thoughts on this report? Let Codecov know! | Powered by Codecov

@codecov
Copy link

codecov bot commented Feb 10, 2026

Codecov Report

❌ Patch coverage is 27.54304% with 463 lines in your changes missing coverage. Please review.
✅ Project coverage is 29.02%. Comparing base (9fb0b2b) to head (9a6e52b).
⚠️ Report is 16 commits behind head on mel-validator-createvalidationentry.

Additional details and impacted files
@@                           Coverage Diff                           @@
##           mel-validator-createvalidationentry    #4338      +/-   ##
=======================================================================
+ Coverage                                28.46%   29.02%   +0.56%     
=======================================================================
  Files                                      495      497       +2     
  Lines                                    58271    58784     +513     
=======================================================================
+ Hits                                     16585    17064     +479     
+ Misses                                   38662    38625      -37     
- Partials                                  3024     3095      +71     

},
EndParentChainBlockHash: endState.ParentChainBlockHash,
}, 0, nil
}, currentState, nil
Copy link
Contributor

Choose a reason for hiding this comment

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

shouldnt this be endState instead of currentState?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Should be the same but edited for correctness

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants