This release has several bug fixes and improvements, but it is not a required upgrade.
This release is available as a Docker Image on Docker Hub at offchainlabs/nitro-node:v3.7.0-6d34456
This Docker image specifies default flags in its entrypoint which should be replicated if you're overriding the entrypoint: /usr/local/bin/nitro --validation.wasm.allowed-wasm-module-roots /home/user/nitro-legacy/machines,/home/user/target/machines
If you're running a validator without a split validation server (this will be true of most validators), you should instead use the image offchainlabs/nitro-node:v3.7.0-6d34456-validator which has the extra script /usr/local/bin/split-val-entry.sh as the entrypoint.
Very Special Note
Nitro 3.7.0 has a performance regression that increases CPU usage, which is especially noticable for eth_calls. Version 3.7.1 will be released soon to fix the performance regression
Special Note 1
Nitro 3.7.0 pulls in go-ethereum 1.15.6 which changed log index from bloombits to filtermap. This means that on startup there will be elevated CPU usage for 50+ hours while new FilterMaps are generated for log indexing. If log queries are not used, the parameter --execution.tx-indexer.enable=false
can be used to completely disable log indexing.
Special Note 2
Nitro 3.7.0 pulls in go-ethereum 1.15.11 which includes a brand new log indexing system called filtermaps
that has resulted in an increase in log indexing latency due to Nitro’s current reliance on HashDB (instead of PathDB). In some cases, this can delay log queries from being served anywhere between 5 seconds to 2 minutes on Arbitrum One during long tail unindexing. We’ve observed that this happens roughly once per day based on Arbitrum One mainnet traffic levels.
Teams who need to serve log queries with consisten latency (e.g. eth_getLogs
, eth_getFilterLogs
, eth_getFilterChanges
) can use the configuration parameter --execution.rpc.log-history=0
to keep all log history, which will only slightly increase database growth. Teams running their own log indexer may be unaffected.
Future releases of Nitro are expected to fix the issue of log index pruning being able to block log queries.
What's Changed
Update go-ethereum to 1.15.11, fixed issue where a getLogs query was requesting too many blocks at once which can cause issues when using some node providers, and various internal improvements.
Configuration Changes
- The parameters
--node.maintenance.time-of-day
and--node.maintenance.triggerable
have been removed - New parameters
--node.maintenance.check-interval
and--node.maintenance.enable
are now used to control when database maintenance is performed. This functionality is still being investigated, so no recommendations for use are available at this time - The parameters
--execution.rpc.bloom-bits-blocks
and--execution.rpc.bloom-confirms
have been removed - The parameter
--execution.tx-lookup-limit
has been replaced with--execution.tx-indexer.tx-lookup-limit
User-facing improvements
- Split single large getLogs query into multiple smaller queries: #3397
- Merge v1.15.6 v1.15.7 v1.15.8 v1.15.9 v1.15.10 v1.15.11: #3225
- Notify clients when nonce-failure transactions expire (#3408): #3463
Internal highlights
- Run Docker Build on All PRs: #3335
- Fix autoclaim defaults for auctioneer: #3333
- Also run our nightly-ci jobs on arbitrator-ci machines: #3337
- Add the missing prefix in dasserver config: #3339
- [MEL] - Implement a Pure, Batch Lookup Function Using Only a Parent Chain Block: #3280
- Use Tsahi's Parallelization in System Test Builder: #3167
- Add metrics for staker balance in BoLD: #3288
- Use standard max supported arbos version check in execution engine: #3338
- Print transaction info in hex format for fast confirm logs: #3345
- [MEL] - Fetch All Txs for Block Using Preimage Reads: #3309
- Use an Empty DataDir for L1 in System Tests to Force In-Memory DB Usage: #3350
- Fix GetLiveliness impl in redis coordinator: #3351
- Return 0 in CalcBlobFee for arbitrum chains since arbitrum does not have blobs: #3343
- [MEL] - Implement a Receipt Trie Reader for the MEL Replay Binary Using Preimages: #3308
- In ParseStateScheme make sure to set genesis block number properly based on arb/eth chain: #3353
- Update nitro-testnode pin: #3341
- [MEL] - Add Batch Serialization Without Needing Ethclient: #3282
- transaction_streamer: fix sync-till-block: #3346
- Gas Dimension Trace Tests: Nested Call Tests: #3354
- Use gotestsum.sh in Makefile: #3358
- use MessageRunContext struct: #2779
- Add 30 more minutes to the nightly ci timeout: #3361
- Add support for consensus v42-rc.1 to Docker: #3364
- Fix race failures in nightly CI: #3365
- Express Lane Proxy tool for testing purposes: #3108
- Update bold pin so contracts and bold/contracts match: #3368
- Fix for changed-files action: #3371
- bump c-kzg: #3330
- [MEL] - Add a Pure Function to Extract Messages From a Sequencer Message: #3283
- [MEL] - The Message Extraction Function: #3359
- Add a type for modeling a Resource Constraint: #3374
- Fix: handle Redis error in sequencer release: #3357
- Remove four unreachable constants and variables: #3375
- Switch to pull_request_target for the trigger events: #3380
- Add extra validation to bids by making sure eth_call for auction resolution succeeds: #3369
- Update the ApproxExpBasisPoints method: #3281
- Fix system_tests failing race in nightly CI: #3366
- Error initializing staker if fast confirmation is enabled at genesis: #3363
- Disable logging in maxprocs: #3356
- feat: precompilesgen from contracts-local: #3386
- [MEL] - Add a Delayed Message Reader in the MEL Replay Binary: #3381
- recompile wasm for missing targets: #3314
- Fix expected surplus metric: #3360
- [config change] Add transaction indexer configs: #3385
- [MEL] - Database implementation: #3387
- Create ADR-0002 Multi-dimensional gas metering: #3401
- Update go-ethereum pin: #3402
- Bump golang.org/x/oauth2 from 0.22.0 to 0.27.0: #3398
- Fix brotli build script: correct softfloat check and target directory handling: #3391
- Fix TestSequencerInboxReader failing race detection in nightly CI: #3395
- Replace Timer metrics with BoundedHistogram for proper expiry behavior: #3393
- Only increment batchPosterFailureCounter metric in cases of non-ephemeral errors: #3399
- Add support for consensus v50-alpha.1 to Docker: #3404
- [Config Change] Consensus asks Execution if maintenance should be triggered: #3253
- Upgrade go to 1.24.5: #3406
- Use latest version of fastcache: #3405
- Update submodule pin check for safe-smart-account: #3417
- Use node.js 24.4.1: #3412
- add msgIdx to error print when blockhash mismatch: #3418
- Add a new binary to generate genesis hash based on provided genesis.json: #3394
- Fix
make .make/fmt
by upgrading golangci-lint from v1 to v2 command line arguments: #3424 - Updates nvmrc to node v24: #3420
- Update nitro-testnode pin to latest: #3415
- Fix go formatting: #3427
- small fix in arbitrator profiling tool: #3047
- Expanding support for multi-dimensional gas: #3429
- fix: improve error message accuracy in CorrespondingL1BlockNumber: #3422
- Use new golangci-lint fmt and fix solidity formatter: #3432
- Try NOT running the nitro CodeQL build in parallel: #3434
- Increase EVM Call timeout to avoid flaky CI: #3435
- Bold merge: #3430
- Bring in Missing BoLD PRs: #3443
- fix gas accounting for eth_call: #3431
- Blob prices should not be used if parent chain doesn't return blob price: #3450
- perf(util/colors): optimize regex compilation in Uncolor function: #3462
- Tx sequencing using hooks: #3454
- Workaround stuck AuctionResolved logs via resolvedRounds contract call: #3472
- add configurable jit executable path via CLI flag: #3495
- github actions: use foundry v1.0.0: #3499
- fix: update broken links with working alternatives: #3465
- Fix ArbNativeTokenManager precompile inclusion: #3497
- fix spelling and grammar errors across codebase: #3498
- block validator benchmark to use Options-based signature: #3502
- fix spelling and grammar errors across codebase: #3501
- stylus wasmer version: don't upgrade if unnecessary: #3508
- Stylus cranelift: #3480
- Add merge_group triggers: #3507
- Update fastcache: #3503
- GlobalState not in chain should be a fatal error when requesting a confirmed assertion: #3449
- Basic seq-coordinator config validation: #3489
- Close part files after the copy is done: #3512
- resolve race condition in storage test goroutines: #3509
- Fix relay backlog corruption at segment boundaries: #3516
- Return a fatal error instead of stopping the StopWaiter: #3520
Full Changelog: v3.6.8...v3.7.0