-
Notifications
You must be signed in to change notification settings - Fork 147
Unified Nimbus node #3646
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Unified Nimbus node #3646
+708
−38
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This was referenced Sep 8, 2025
Closed
Closed
f53815c to
8fb1609
Compare
dffaf55 to
a627026
Compare
a4bfab4 to
3d34be4
Compare
a627026 to
95e3e1d
Compare
3d34be4 to
fb7eaf9
Compare
bcc31af to
b7f4479
Compare
fb7eaf9 to
a78dfa5
Compare
a78dfa5 to
24bd1cd
Compare
b7f4479 to
1a562c8
Compare
24bd1cd to
e3a0724
Compare
89754de to
554a991
Compare
e3a0724 to
0dc40f7
Compare
554a991 to
5db3686
Compare
0dc40f7 to
841072f
Compare
841072f to
83b63ba
Compare
Holesky is no longer maintained and has been removed from eth2
08b0f90 to
e8b4734
Compare
This change brings Nimbus full circle to where it started all these years ago and allows running Ethereum in a single node / process, both as a wallet/web3 backend and as a validator. Among interesting properies are: * Easy to set up and run - one binary, one process, no JWT and messy setup, no cross-client communication issues, timing issues etc * Excellent performance, of course * Shared database = small database * Can run without the legacy devp2p as long as you're reasonably synced and not using it for block production - up to 5 months of history are instead sourced from the consensus network - block production requires devp2p since that's where the public mempool comes from Running ethereum and syncing mainnet is now as easy as: ```sh ./nimbus trustedNodeSync \ --trusted-node-url=http://testing.mainnet.beacon-api.nimbus.team/ \ --backfill=false ./nimbus ``` The consensus chain will start from a checkpoint while the execution chain will still be synced via P2P. You need about 500GB of space in total, but if you're buying a drive today, get 2 or 4 TB anyway. Testnets like `hoodi` can reasonably be synced from P2P all the way (takes a bit more than a day at the time of writing), without the checkpoint sync: ```nim ./nimbus --network:hoodi ``` That's it! The node can now be used both for validators and as a web3 provider. `--rpc` gives you the web3 backend which allows connecting wallets while `--rest` gives the beacon api that validator clients use. Of course, you can run your validators [in the node](https://nimbus.guide/run-a-validator.html#2-import-your-validator-keys) as well. Here's a true maxi configuration that turns on (almost) everything: ```nim ./nimbus --rpc --rest --metrics ``` The execution chain can also be imported from era files, downloading the history from https://mainnet.era.nimbus.team/ and https://mainnet.era1.nimbus.team/ and placing them in `era` and `era1` in the data directory as the [manual](https://nimbus.guide/execution-client.html#syncing-using-era-files) suggests, then running an `import` - it takes a few days: ```sh ./nimbus import ``` If you were already running nimbus, you can reuse your existing data directory - use `--data-dir:/some/path` as usual with all the commands to specify where you want your data stored - if you had both eth1 and eth2 directories, just merge their contents. To get up and running more quickly, snapshots of the mainnet execution database are maintained here: https://eth1-db.nimbus.team/ Together with checkpoint sync, you'll have a fully synced node in no time! In future versions, this will be replaced by snap sync or an equivalent state sync mechanism. To build the protoype: ```sh make update make -j8 nimbus ``` In a single process binary, the beacon and execution chain are each running in their own thread, sharing data directory and common services, similar to running the two pieces separately with the same data dir. One way to think about it is that the execution client and beacon nodes are stand-alone libraries that are being used together - this is not far from the truth and in fact, you can use either (or both!) as a library. The binary supports the union of all functionality that `nimbus_execution_client` and `nimbus_beacon_node` offers, including all the subcommands like [checkpoint sync](https://nimbus.guide/trusted-node-sync.html) and [execution history import](https://nimbus.guide/execution-client.html#import-era-files), simply using the `nimbus` command instead. Prototype notes: * cross-thread communication is done using a local instance of web3 / JSON - this is nuts of course: it should simply pass objects around and convert to directly to RLP on demand without going via JSON * the thread pool is not shared but should be - nim-taskpools needs to learn to accept tasks from threads other than the one that created it * discovery is not shared - instead, each of eth1/2 runs its own discovery protocols and consequently the node has two "identities" * there are many efficiency opportunities to exploit, in particular on the memory usage front * next up is light client and portal to be added as options, to support a wide range of feature vs performance tradeoffs
e8b4734 to
ea1f60b
Compare
|
I pushed some modifications to the Nix environment which were required to perform However I ran into a [j@platform:~/experiments/nimbus-eth1]$ ./build/nimbus --rpc --data-dir:/run/media/j/store/nimbus-datadir/
WRN 2025-10-23 15:44:13.474+02:00 Data directory has insecure permissions. Correcting them. data_dir=/run/media/j/store/nimbus-datadir/ current_permissions=0755 required_permissions=0700
INF 2025-10-23 15:44:13.475+02:00 Taskpool started numThreads=16
INF 2025-10-23 15:44:13.475+02:00 Launching beacon node version=v25.9.2-e2cc30-stateofus bls_backend=BLST const_preset=mainnet cmdParams="[--rpc, --data-dir:/run/media/j/store/nimbus-datadir/]" config="(configFile: none(InputFile), logLevel: INFO, logStdout: auto, logFile: none(OutFile), eth2Network: none(string), dataDirFlag: some(/run/media/j/store/nimbus-datadir/), validatorsDirFlag: none(InputDir), verifyingWeb3Signers: [], provenBlockProperties: [], web3Signers: [], web3signerUpdateInterval: 3600, secretsDirFlag: none(InputDir), walletsDirFlag: none(InputDir), eraDirFlag: none(InputDir), web3ForcePolling: none(bool), web3Urls: [], elUrls: [(url: http://127.0.0.1:8551/, jwt-secret: some("43360DF5256DCC98CB526FFAED1DEA5D7532A386B2B8B74E9C3F1D5F0DA30B52"), jwt-secret-file: none(InputFile), roles: none(EngineApiRoles))], noEl: false, optimistic: none(bool), requireEngineAPI: none(bool), nonInteractive: false, netKeyFile: random, netKeyInsecurePassword: false, agentString: nimbus, subscribeAllSubnets: false, debugPeerdasSupernode: false, peerdasSupernode: false, slashingDbKind: v2, numThreads: 0, jwtSecret: none(InputFile), cmd: beaconNode, runAsServiceFlag: false, bootstrapNodes: [], bootstrapNodesFile: , listenAddress: none(IpAddress), tcpPort: 9000, udpPort: 9000, maxPeers: 160, hardMaxPeers: none(int), nat: (hasExtIp: false, nat: NatAny), enrAutoUpdate: false, weakSubjectivityCheckpoint: none(Checkpoint), externalBeaconApiUrl: none(string), syncLightClient: true, trustedBlockRoot: none(Eth2Digest), trustedStateRoot: none(Eth2Digest), finalizedCheckpointState: none(InputFile), genesisState: none(InputFile), genesisStateUrl: none(Uri), finalizedDepositTreeSnapshot: none(InputFile), finalizedCheckpointBlock: none(InputFile), nodeName: , graffiti: none(GraffitiBytes), strictVerification: false, stopAtEpoch: 0, stopAtSyncedEpoch: 0, metricsEnabled: false, metricsAddress: 127.0.0.1, metricsPort: 8008, statusBarEnabled: false, statusBarContents: peers: $connected_peers;finalized: $finalized_root:$finalized_epoch;head: $head_root:$head_epoch:$head_epoch_slot$next_consensus_fork;time: $epoch:$epoch_slot ($slot);sync: $sync_status|ETH: $attached_validators_balance, rpcEnabled: some(true), rpcPort: none(Port), rpcAddress: none(IpAddress), restEnabled: false, restPort: 5052, restAddress: 127.0.0.1, restAllowedOrigin: none(string), restCacheSize: 3, restCacheTtl: 60, restRequestTimeout: 0, restMaxRequestBodySize: 16384, restMaxRequestHeadersSize: 128, keymanagerEnabled: false, keymanagerPort: 5052, keymanagerAddress: 127.0.0.1, keymanagerAllowedOrigin: none(string), keymanagerTokenFile: none(InputFile), lightClientDataServe: true, lightClientDataImportMode: only-new, lightClientDataMaxPeriods: none(uint64), longRangeSync: lenient, inProcessValidators: true, discv5Enabled: true, dumpEnabled: false, invalidBlockRoots: [], directPeers: [], doppelgangerDetection: true, syncHorizon: none(uint64), terminalTotalDifficultyOverride: none(string), validatorMonitorAuto: true, validatorMonitorPubkeys: [], validatorMonitorDetails: false, validatorMonitorTotals: none(bool), safeSlotsToImportOptimistically: none(uint16), suggestedFeeRecipient: none(Address), suggestedGasLimit: 60000000, payloadBuilderEnable: false, payloadBuilderUrl: , localBlockValueBoost: 10, historyMode: prune, trustedSetupFile: none(string), bandwidthEstimate: none(Natural))" numThreads=16
INF 2025-10-23 15:44:13.479+02:00 Taskpool started numThreads=16
INF 2025-10-23 15:44:13.683+02:00 Database initialized base="(0xc696bc71a2dcd5ea91122c39be62e3c3793b31f862d73feafe9ecc1e3b6ba911, 23211858)" finalized="(0xc696bc71a2dcd5ea91122c39be62e3c3793b31f862d73feafe9ecc1e3b6ba911, 23211858)" head="(0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3, 0)"
INF 2025-10-23 15:44:13.683+02:00 Loading block DAG from database topics="forked chain" base=23211858 pendingFCU=000000000000 resolvedFin=0 canonicalHead=0 safe=23211858 numBlocks=1 heads=[23211858] comp=ec
NTC 2025-10-23 15:44:15.457+02:00 Genesis state information topics="beacnde" genesis_fork=phase0 is_post_altair=false
NTC 2025-10-23 15:44:15.803+02:00 Database initialized from genesis blockRoot=4d611d5b93fdab69013a7f0a2f961caca0c853f87cfe9595fe50038163079360 stateRoot=7e76880eb67bbdc86250aa578958e9d0675e64e714337855204fb5abaaf82c2b stateSlot=0
INF 2025-10-23 15:44:15.803+02:00 Loading block DAG from database topics="beacnde" path=/run/media/j/store/nimbus-datadir/db
INF 2025-10-23 15:44:15.822+02:00 Loading finalized blocks finHigh=none() finalizedHead=4d611d5b:0
INF 2025-10-23 15:44:15.829+02:00 Block DAG initialized head=4d611d5b:0 finalizedHead=4d611d5b:0 tail=4d611d5b:0 backfill="(0, 00000000)" loadDur=4ms745us29ns summariesDur=12ms972us839ns finalizedDur=7ms836us123ns frontfillDur=71ns keysDur=15us278ns
INF 2025-10-23 15:44:15.829+02:00 Backfill database initialized topics="beacnde" path=/run/media/j/store/nimbus-datadir/db head=[none] tail=[none]
INF 2025-10-23 15:44:15.829+02:00 Generating new networking key topics="networking" network_public_key=0802122102fd769a14aa6915a5aeb227870b0053eb45cd67083f1d58cc23f2882a8480dd95 network_peer_id=16Uiu2HAmCV626K2PnPRrPcVSw8Qyrca9XszWZgApV6AdSrmTUJTv
WRN 2025-10-23 15:44:17.691+02:00 UPnP/NAT-PMP not available topics="eth net nat" comp=ec
INF 2025-10-23 15:44:17.692+02:00 Discovery ENR initialized topics="eth p2p discv5" enrAutoUpdate=true seqNum=1 ip=none() tcpPort=ok(30303) udpPort=ok(30303) localEnrFields=[] uri=enr:-IO4QITKaaZZeTNpq6Sp0dXgLfbPD31hpr2NgxzK1EIHU5VlQ0fQzsH6_Wyy9k9ZMflNFG31oOBjdu2hRyS-G-hAvHYBgmlkgnY0iXNlY3AyNTZrMaECHOaFjpD-RlAb5chqWalvWLjcXxCVhI9DyXUjtiE8QvSDdGNwgnZfg3VkcIJ2Xw comp=ec
NTC 2025-10-23 15:44:17.692+02:00 No external IP provided for the ENR, this node will not be discoverable until the ENR is updated with the discovered external IP address topics="eth p2p discv5" comp=ec
INF 2025-10-23 15:44:17.692+02:00 RLPx listener up topics="p2p" self=enode://1ce6858e90fe46501be5c86a59a96f58b8dc5f1095848f43c97523b6213c42f497638c8f8a89749e7c46bc2076e9ebc53a5de6ba821b8306e2113156a229f0b6@[::]:30303 comp=ec
INF 2025-10-23 15:44:17.692+02:00 Starting discovery node topics="p2p" node=Node[:::30303] bindAddress=:::30303:30303 discV4=true discV5=true comp=ec
INF 2025-10-23 15:44:17.692+02:00 JSON-RPC API enabled url=http://127.0.0.1:8545 comp=ec
INF 2025-10-23 15:44:17.692+02:00 Engine API enabled url=http://127.0.0.1:8551 comp=ec
WRN 2025-10-23 15:44:19.858+02:00 UPnP/NAT-PMP not available topics="eth net nat"
INF 2025-10-23 15:44:19.859+02:00 Discovery ENR initialized topics="eth p2p discv5" enrAutoUpdate=false seqNum=1 ip=none() tcpPort=ok(9000) udpPort=ok(9000) customEnrFields="@[eth2:0xAD532CEB05000000FFFFFFFFFFFFFFFF, attnets:0x0000000000000000]" uri=enr:-Kq4QIGofu5FK9hM-PsJt_puqBHWFed3n-dbHE420StdoGl_QZi967-ybbgubiUYBYUwMkwMjJOxzbW8z4XOhXbYOowBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpCtUyzrBQAAAP__________gmlkgnY0iXNlY3AyNTZrMaEC_XaaFKppFaWusieHCwBT60XNZwg_HVjMI_KIKoSA3ZWDdGNwgiMog3VkcIIjKA
WRN 2025-10-23 15:44:19.859+02:00 No external IP provided for the ENR, this node will not be discoverable topics="eth p2p discv5"
INF 2025-10-23 15:44:19.859+02:00 Loading slashing protection database (v2) topics="beacnde" path=/run/media/j/store/nimbus-datadir/validators
INF 2025-10-23 15:44:19.876+02:00 Initializing fork choice topics="beacnde" unfinalized_blocks=0
INF 2025-10-23 15:44:19.876+02:00 Fork choice initialized topics="beacnde" justified=0:00000000 finalized=0:00000000
INF 2025-10-23 15:44:19.876+02:00 Loading validators topics="beacval" validatorsDir=/run/media/j/store/nimbus-datadir/validators keystore_cache_available=true
NTC 2025-10-23 15:44:19.876+02:00 Starting beacon node topics="beacnde" version=v25.9.2-e2cc30-stateofus nimVersion=2.2.4 enr=enr:-K-4QCnwnBKrucVPQvBlc149JPsN7grhrHEnv0UtHZU8xUqmEwx36ZEEZyyMkfGCQZPQyui20wF_hWfgWLh3eu3DzgMDh2F0dG5ldHOIAAAAADAAAACDY2djBIRldGgykK1TLOsFAAAA__________-CaWSCdjSJc2VjcDI1NmsxoQL9dpoUqmkVpa6yJ4cLAFPrRc1nCD8dWMwj8ogqhIDdlYN0Y3CCIyiDdWRwgiMo peerId=16Uiu2HAmCV626K2PnPRrPcVSw8Qyrca9XszWZgApV6AdSrmTUJTv timeSinceFinalization=255w2d1h43m56s877ms658us136ns head=4d611d5b:0 justified=0:00000000 finalized=0:00000000 finalizedHead=4d611d5b:0 SLOTS_PER_EPOCH=32 SECONDS_PER_SLOT=12 SPEC_VERSION=1.6.0-beta.0 dataDir=/run/media/j/store/nimbus-datadir/ validators=0 comp=bn
INF 2025-10-23 15:44:19.879+02:00 Listening to incoming network requests topics="beacnde" comp=bn
INF 2025-10-23 15:44:19.879+02:00 Starting discovery node topics="eth p2p discv5" node=ba*cb37e7:unaddressable bindAddress=*:9000 comp=bn
NTC 2025-10-23 15:44:19.881+02:00 Starting light client topics="lightcl" trusted_block_root=none(Eth2Digest) comp=bn
INF 2025-10-23 15:44:19.881+02:00 Sync overseer starting topics="overseer" wall_slot=12866919 dag_head_slot=0 dag_finalized_head_slot=0 dag_horizon=0 dag_backfill_slot=0 untrusted_tail=[none] untrusted_head=[none] comp=bn
INF 2025-10-23 15:44:19.888+02:00 Scheduling first slot action topics="beacnde" startTime=255w2d1h43m56s882ms353us904ns nextSlot=12866920 timeToNextSlot=3s117ms646us96ns comp=bn
INF 2025-10-23 15:44:23.006+02:00 Slot start topics="beacnde" nextFork=altair:74240 slot=12866920 epoch=402091 sync="--h--m (0.00%) 0.0000slots/s (wwwwwwwwww:0)" peers=0 head=4d611d5b:0 finalized=0:00000000 delay=7ms256us618ns comp=bn
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/threadimpl.nim(101) _ZN12typedthreads32threadProcWrapper
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/threadimpl.nim(92) _ZN6system24threadProcWrapStackFrameE3ptrI6ThreadIN6nimbus18BeaconThreadConfigEEE
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/threadimpl.nim(73) _ZN6system22threadProcWrapDispatchE3ptrI6ThreadIN6nimbus18BeaconThreadConfigEEE
/home/j/experiments/nimbus-eth1/execution_chain/nimbus.nim(251) _ZN6nimbus13runBeaconNodeEN6nimbus18BeaconThreadConfigE
/home/j/experiments/nimbus-eth1/vendor/nimbus-eth2/beacon_chain/nimbus_beacon_node.nim(2602) _ZN18nimbus_beacon_node3runE3refIN11beacon_node26BeaconNodecolonObjectType_EE20InternalRaisesFutureI4void5tupleIN7futures14CancelledErrorEEE
/home/j/experiments/nimbus-eth1/vendor/nim-chronos/chronos/internal/asyncengine.nim(150) _ZN11asyncengine4pollE
/home/j/experiments/nimbus-eth1/vendor/nim-chronos/chronos/internal/asyncfutures.nim(382) _ZN12asyncfutures14futureContinueE3refIN7futures26FutureBasecolonObjectType_EE
/home/j/experiments/nimbus-eth1/vendor/nimbus-eth2/beacon_chain/nimbus_beacon_node.nim(1870) _ZN9onSlotEnd9onSlotEndE3refIN7futures26FutureBasecolonObjectType_EE
/home/j/experiments/nimbus-eth1/vendor/nimbus-eth2/beacon_chain/validators/beacon_validators.nim(237) _ZN17beacon_validators8isSyncedE3refIN11beacon_node26BeaconNodecolonObjectType_EE3refIN9block_dag24BlockRefcolonObjectType_EE
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/pure/options.nim(231) _ZN7options3getE3varI6OptionI6uInt64EE
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/excpt.nim(349) _ZN6system18rawWriteStackTraceE3varI3seqIN6system15StackTraceEntryEEE
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/stacktraces.nim(62) _ZN11stacktraces30auxWriteStackTraceWithOverrideE3varI3seqIN6system15StackTraceEntryEEE
[[reraised from:
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/threadimpl.nim(101) _ZN12typedthreads32threadProcWrapper
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/threadimpl.nim(92) _ZN6system24threadProcWrapStackFrameE3ptrI6ThreadIN6nimbus18BeaconThreadConfigEEE
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/threadimpl.nim(73) _ZN6system22threadProcWrapDispatchE3ptrI6ThreadIN6nimbus18BeaconThreadConfigEEE
/home/j/experiments/nimbus-eth1/execution_chain/nimbus.nim(251) _ZN6nimbus13runBeaconNodeEN6nimbus18BeaconThreadConfigE
/home/j/experiments/nimbus-eth1/vendor/nimbus-eth2/beacon_chain/nimbus_beacon_node.nim(2602) _ZN18nimbus_beacon_node3runE3refIN11beacon_node26BeaconNodecolonObjectType_EE20InternalRaisesFutureI4void5tupleIN7futures14CancelledErrorEEE
/home/j/experiments/nimbus-eth1/vendor/nim-chronos/chronos/internal/asyncengine.nim(150) _ZN11asyncengine4pollE
/home/j/experiments/nimbus-eth1/vendor/nim-chronos/chronos/internal/asyncfutures.nim(382) _ZN12asyncfutures14futureContinueE3refIN7futures26FutureBasecolonObjectType_EE
/home/j/experiments/nimbus-eth1/vendor/nimbus-eth2/beacon_chain/nimbus_beacon_node.nim(2035) _ZN9onSlotEnd9onSlotEndE3refIN7futures26FutureBasecolonObjectType_EE
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/stacktraces.nim(62) _ZN11stacktraces30auxWriteStackTraceWithOverrideE3varI3seqIN6system15StackTraceEntryEEE
]]
[[reraised from:
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/threadimpl.nim(101) _ZN12typedthreads32threadProcWrapper
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/threadimpl.nim(92) _ZN6system24threadProcWrapStackFrameE3ptrI6ThreadIN6nimbus18BeaconThreadConfigEEE
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/threadimpl.nim(73) _ZN6system22threadProcWrapDispatchE3ptrI6ThreadIN6nimbus18BeaconThreadConfigEEE
/home/j/experiments/nimbus-eth1/execution_chain/nimbus.nim(251) _ZN6nimbus13runBeaconNodeEN6nimbus18BeaconThreadConfigE
/home/j/experiments/nimbus-eth1/vendor/nimbus-eth2/beacon_chain/nimbus_beacon_node.nim(2602) _ZN18nimbus_beacon_node3runE3refIN11beacon_node26BeaconNodecolonObjectType_EE20InternalRaisesFutureI4void5tupleIN7futures14CancelledErrorEEE
/home/j/experiments/nimbus-eth1/vendor/nim-chronos/chronos/internal/asyncengine.nim(150) _ZN11asyncengine4pollE
/home/j/experiments/nimbus-eth1/vendor/nim-chronos/chronos/internal/asyncfutures.nim(382) _ZN12asyncfutures14futureContinueE3refIN7futures26FutureBasecolonObjectType_EE
/home/j/experiments/nimbus-eth1/vendor/nimbus-eth2/beacon_chain/nimbus_beacon_node.nim(2036) _ZN9onSlotEnd9onSlotEndE3refIN7futures26FutureBasecolonObjectType_EE
/home/j/experiments/nimbus-eth1/vendor/nimbus-build-system/vendor/Nim/lib/system/stacktraces.nim(62) _ZN11stacktraces30auxWriteStackTraceWithOverrideE3varI3seqIN6system15StackTraceEntryEEE
]]
Error: unhandled exception: Can't obtain a value from a `none` [UnpackDefect] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This preview brings Nimbus full circle to where it started all these years ago and allows running Ethereum in a single node / process, both as a wallet/web3 backend and as a validator.
Among interesting properties are:
Running ethereum and syncing mainnet is now as easy as:
The consensus chain will start from a checkpoint while the execution chain will still be synced via P2P.
You need about 500GB of space in total, but if you're buying a drive today, get 2 or 4 TB anyway.
Testnets like
hoodican reasonably be synced from P2P all the way (takes a bit more than a day at the time of writing), without the checkpoint sync:That's it! The node can now be used both for validators and as a web3 provider.
--rpcgives you the web3 backend which allows connecting wallets while--restgives the beacon api that validator clients use.Of course, you can run your validators in the
node as well.
Here's a true maxi configuration that turns on (almost) everything:
The execution chain can also be imported from era files, downloading the history from https://mainnet.era.nimbus.team/ and https://mainnet.era1.nimbus.team/ and placing them in
eraandera1in the data directory as the manual suggests, then running animport- it takes a few days:Use
--data-dir:/some/pathto tell Nimbus where to store data:To get up and running more quickly, snapshots of the mainnet execution database are maintained here:
https://eth1-db.nimbus.team/
Together with checkpoint sync, you'll have a fully synced node in no time!
In future versions, this will be replaced by snap sync or an equivalent state sync mechanism.
To build the prototype:
In a single process binary, the beacon and execution chain are each running in their own thread, sharing data directory and common services, similar to running the two pieces separately with the same data dir.
One way to think about it is that the execution client and beacon nodes are stand-alone libraries that are being used together - this is not far from the truth and in fact, you can use either (or both!) as a library.
The binary supports the union of all functionality that
nimbus_execution_clientandnimbus_beacon_nodeoffers, including all the subcommands like checkpointsync and execution history
import, simply using the
nimbuscommand instead.Prototype notes:
--helpfails to mention the many options available - requires an update tochroniclesto fix