diff --git a/execution_chain/common.nim b/execution_chain/common.nim index 7b7e06a94a..1c55c23a53 100644 --- a/execution_chain/common.nim +++ b/execution_chain/common.nim @@ -1,5 +1,5 @@ # Nimbus -# Copyright (c) 2022 Status Research & Development GmbH +# Copyright (c) 2022-2025 Status Research & Development GmbH # Licensed under either of # * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) # * MIT license ([LICENSE-MIT](LICENSE-MIT)) @@ -10,9 +10,9 @@ import ./common/common, ./common/genesis, - ./common/context + ./common/manager export common, genesis, - context + manager diff --git a/execution_chain/common/context.nim b/execution_chain/common/context.nim deleted file mode 100644 index 25ec49e00f..0000000000 --- a/execution_chain/common/context.nim +++ /dev/null @@ -1,82 +0,0 @@ -# Nimbus -# Copyright (c) 2021-2025 Status Research & Development GmbH -# Licensed under either of -# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) -# * MIT license ([LICENSE-MIT](LICENSE-MIT)) -# at your option. -# This file may not be copied, modified, or distributed except according to -# those terms. - -import - std/[strutils, os], - manager, - stew/[io2, byteutils], - results, - eth/common/keys - -export manager - -{.push raises: [].} - -type - EthContext* = ref object - am*: AccountsManager - # You should only create one instance of the RNG per application / library - # Ref is used so that it can be shared between components - rng*: ref HmacDrbgContext - -proc newEthContext*(): EthContext = - result = new(EthContext) - result.am = AccountsManager.init() - result.rng = newRng() - -proc randomPrivateKey*(ctx: EthContext): PrivateKey = - random(PrivateKey, ctx.rng[]) - -proc randomKeyPair*(ctx: EthContext): KeyPair = - random(KeyPair, ctx.rng[]) - -proc containsOnlyHexDigits(hex: string): bool = - const HexDigitsX = HexDigits + {'x'} - for c in hex: - if c notin HexDigitsX: - return false - true - -proc getNetKeys*(ctx: EthContext, netKey: string): Result[KeyPair, string] = - if netKey.len == 0 or netKey == "random": - let privateKey = ctx.randomPrivateKey() - return ok(privateKey.toKeyPair()) - elif netKey.len in {64, 66} and netKey.containsOnlyHexDigits: - let res = PrivateKey.fromHex(netKey) - if res.isErr: - return err($res.error) - return ok(res.get().toKeyPair()) - else: - # TODO: should we secure the private key with - # keystore encryption? - if fileAccessible(netKey, {AccessFlags.Find}): - try: - let lines = netKey.readLines(1) - if lines.len == 0: - return err("empty network key file") - let rc = PrivateKey.fromHex(lines[0]) - if rc.isErr: - return err($rc.error) - return ok(rc.get().toKeyPair()) - except IOError as e: - return err("cannot open network key file: " & e.msg) - except ValueError as ex: - return err("invalid hex string in network key file: " & ex.msg) - else: - let privateKey = ctx.randomPrivateKey() - - try: - createDir(netKey.splitFile.dir) - netKey.writeFile(privateKey.toRaw.to0xHex) - except OSError as e: - return err("could not create network key file: " & e.msg) - except IOError as e: - return err("could not write network key file: " & e.msg) - - return ok(privateKey.toKeyPair()) diff --git a/execution_chain/common/manager.nim b/execution_chain/common/manager.nim index 935b5f4df8..c7b2a3f5d0 100644 --- a/execution_chain/common/manager.nim +++ b/execution_chain/common/manager.nim @@ -1,5 +1,5 @@ # Nimbus -# Copyright (c) 2021-2024 Status Research & Development GmbH +# Copyright (c) 2021-2025 Status Research & Development GmbH # Licensed under either of # * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) # * MIT license ([LICENSE-MIT](LICENSE-MIT)) @@ -27,9 +27,6 @@ type AccountsManager* = object accounts: Table[Address, NimbusAccount] -proc init*(_: type AccountsManager): AccountsManager = - discard - proc loadKeystores*(am: var AccountsManager, path: string): Result[void, string] = try: diff --git a/execution_chain/config.nim b/execution_chain/config.nim index 170b300757..a773886056 100644 --- a/execution_chain/config.nim +++ b/execution_chain/config.nim @@ -39,24 +39,8 @@ import export net, defs, jsdefs, jsnet, nimbus_binary_common -const - # e.g.: Copyright (c) 2018-2025 Status Research & Development GmbH - NimbusCopyright* = "Copyright (c) 2018-" & - CompileDate.split('-')[0] & - " Status Research & Development GmbH" - - # e.g.: - # nimbus_execution_client/v0.1.0-abcdef/os-cpu/nim-a.b.c/emvc - # Copyright (c) 2018-2025 Status Research & Development GmbH - NimbusBuild* = "$#\p$#" % [ - ClientId, - NimbusCopyright, - ] - - NimbusHeader* = "$#\p\pNim version $#" % [ - NimbusBuild, - nimBanner() - ] +const NimbusCopyright* = + "Copyright (c) 2018-" & compileYear & " Status Research & Development GmbH" func getLogLevels(): string = var logLevels: seq[string] @@ -196,16 +180,6 @@ type defaultValue: StdoutLogKind.Auto name: "log-format" .}: StdoutLogKind - logMetricsEnabled* {. - desc: "Enable metrics logging" - defaultValue: false - name: "log-metrics" .}: bool - - logMetricsInterval* {. - desc: "Interval at which to log metrics, in seconds" - defaultValue: 10 - name: "log-metrics-interval" .}: int - metricsEnabled* {. desc: "Enable the built-in metrics HTTP server" defaultValue: false @@ -320,7 +294,7 @@ type separator: "\pPERFORMANCE OPTIONS", defaultValue: 0, desc: "Number of worker threads (\"0\" = use as many threads as there are CPU cores available)" - name: "num-threads" .}: uint + name: "num-threads" .}: int persistBatchSize* {. hidden @@ -802,31 +776,10 @@ func dbOptions*(conf: NimbusConf, noKeyCache = false): DbOptions = # Constructor #------------------------------------------------------------------- -proc makeConfig*(cmdLine = commandLineParams()): NimbusConf = +proc makeConfig*(cmdLine = commandLineParams(), ignoreUnknown = false): NimbusConf = ## Note: this function is not gc-safe - try: - result = NimbusConf.load( - cmdLine, - version = NimbusBuild, - copyrightBanner = NimbusHeader, - secondarySources = proc ( - conf: NimbusConf, sources: ref SecondarySources - ) {.raises: [ConfigurationError].} = - if conf.configFile.isSome: - sources.addConfigFile(Toml, conf.configFile.get) - ) - except CatchableError as err: - if err[] of ConfigurationError and err.parent != nil: - if err.parent[] of TomlFieldReadingError: - let fieldName = ((ref TomlFieldReadingError)(err.parent)).field - echo "Error when parsing ", fieldName, ": ", err.msg - elif err.parent[] of TomlReaderError: - type TT = ref TomlReaderError - echo TT(err).formatMsg("") - else: - echo "Error when parsing config file: ", err.msg - else: - echo "Error when parsing command line params: ", err.msg + result = NimbusConf.loadWithBanners(ClientId, NimbusCopyright, [], ignoreUnknown, cmdLine).valueOr: + writePanicLine error # Logging not yet set up quit QuitFailure processNetworkParamsAndNetworkId(result) diff --git a/execution_chain/networking/netkeys.nim b/execution_chain/networking/netkeys.nim new file mode 100644 index 0000000000..e03b6cc4e2 --- /dev/null +++ b/execution_chain/networking/netkeys.nim @@ -0,0 +1,52 @@ +# Nimbus +# Copyright (c) 2021-2025 Status Research & Development GmbH +# Licensed under either of +# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE)) +# * MIT license ([LICENSE-MIT](LICENSE-MIT)) +# at your option. +# This file may not be copied, modified, or distributed except according to +# those terms. + +{.push raises: [].} + +import std/[strutils, os], stew/[io2, byteutils], results, eth/common/keys + +proc containsOnlyHexDigits(hex: string): bool = + const HexDigitsX = HexDigits + {'x'} + for c in hex: + if c notin HexDigitsX: + return false + true + +proc getNetKeys*(rng: var HmacDrbgContext, netKey: string): Result[KeyPair, string] = + let privateKey = + if netKey.len == 0 or netKey == "random": + PrivateKey.random(rng) + elif netKey.len in {64, 66} and netKey.containsOnlyHexDigits: + PrivateKey.fromHex(netKey).valueOr: + return err($error) + else: + # TODO: should we secure the private key with + # keystore encryption? + if fileAccessible(netKey, {AccessFlags.Find}): + try: + let lines = netKey.readLines(1) + if lines.len == 0: + return err("empty network key file") + PrivateKey.fromHex(lines[0]).valueOr: + return err($error) + except IOError as e: + return err("cannot open network key file: " & e.msg) + else: + let privateKey = PrivateKey.random(rng) + + try: + createDir(netKey.splitFile.dir) + netKey.writeFile(privateKey.toRaw.to0xHex) + except OSError as e: + return err("could not create network key file: " & e.msg) + except IOError as e: + return err("could not write network key file: " & e.msg) + + privateKey + ok privateKey.toKeyPair() diff --git a/execution_chain/nimbus_desc.nim b/execution_chain/nimbus_desc.nim index bf1b946028..af0d21bdc7 100644 --- a/execution_chain/nimbus_desc.nim +++ b/execution_chain/nimbus_desc.nim @@ -45,14 +45,14 @@ type httpServer*: NimbusHttpServerRef engineApiServer*: NimbusHttpServerRef ethNode*: EthereumNode - ctx*: EthContext fc*: ForkedChainRef txPool*: TxPoolRef peerManager*: PeerManagerRef beaconSyncRef*: BeaconSyncRef beaconEngine*: BeaconEngineRef - metricsServer*: MetricsHttpServerRef wire*: EthWireRef + accountsManager*: ref AccountsManager + rng*: ref HmacDrbgContext proc closeWait*(nimbus: NimbusNode) {.async.} = trace "Graceful shutdown" @@ -67,8 +67,6 @@ proc closeWait*(nimbus: NimbusNode) {.async.} = waitedFutures.add nimbus.peerManager.stop() if nimbus.beaconSyncRef.isNil.not: waitedFutures.add nimbus.beaconSyncRef.stop() - if nimbus.metricsServer.isNil.not: - waitedFutures.add nimbus.metricsServer.stop() if nimbus.wire.isNil.not: waitedFutures.add nimbus.wire.stop() diff --git a/execution_chain/nimbus_execution_client.nim b/execution_chain/nimbus_execution_client.nim index 5fbaaa30f1..c1f32362f1 100644 --- a/execution_chain/nimbus_execution_client.nim +++ b/execution_chain/nimbus_execution_client.nim @@ -13,11 +13,10 @@ import ../execution_chain/compile_info import - std/[osproc, net, options], + std/[net, options], chronicles, eth/net/nat, metrics, - metrics/chronicles_support, stew/byteutils, ./rpc, ./version_info, @@ -32,7 +31,7 @@ import ./sync/wire_protocol, ./common/chain_config_hash, ./portal/portal, - ./networking/bootnodes, + ./networking/[bootnodes, netkeys], beacon_chain/[nimbus_binary_common, process_state], beacon_chain/validators/keystore_management @@ -84,37 +83,30 @@ proc basicServices(nimbus: NimbusNode, conf: NimbusConf, com: CommonRef) = proc manageAccounts(nimbus: NimbusNode, conf: NimbusConf) = if conf.keyStoreDir.len > 0: - let res = nimbus.ctx.am.loadKeystores(conf.keyStoreDir) - if res.isErr: - fatal "Load keystore error", msg = res.error() + nimbus.accountsManager[].loadKeystores(conf.keyStoreDir).isOkOr: + fatal "Load keystore error", msg = error quit(QuitFailure) if string(conf.importKey).len > 0: - let res = nimbus.ctx.am.importPrivateKey(string conf.importKey) - if res.isErr: - fatal "Import private key error", msg = res.error() + nimbus.accountsManager[].importPrivateKey(string conf.importKey).isOkOr: + fatal "Import private key error", msg = error quit(QuitFailure) proc setupP2P(nimbus: NimbusNode, conf: NimbusConf, com: CommonRef) = ## Creating P2P Server - let kpres = nimbus.ctx.getNetKeys(conf.netKey) - if kpres.isErr: - fatal "Get network keys error", msg = kpres.error - quit(QuitFailure) - - let keypair = kpres.get() - - let (extIp, extTcpPort, extUdpPort) = - setupAddress(conf.nat, conf.listenAddress, conf.tcpPort, - conf.udpPort, NimbusName & " " & NimbusVersion) - - var address = enode.Address( - ip: extIp.valueOr(conf.listenAddress), - tcpPort: extTcpPort.valueOr(conf.tcpPort), - udpPort: extUdpPort.valueOr(conf.udpPort), - ) - let + keypair = nimbus.rng[].getNetKeys(conf.netKey).valueOr: + fatal "Get network keys error", msg = error + quit(QuitFailure) + natId = NimbusName & " " & NimbusVersion + (extIp, extTcpPort, extUdpPort) = + setupAddress(conf.nat, conf.listenAddress, conf.tcpPort, conf.udpPort, natId) + address = enode.Address( + ip: extIp.valueOr(conf.listenAddress), + tcpPort: extTcpPort.valueOr(conf.tcpPort), + udpPort: extUdpPort.valueOr(conf.udpPort), + ) + bootstrapNodes = conf.getBootstrapNodes() fc = nimbus.fc @@ -136,7 +128,7 @@ proc setupP2P(nimbus: NimbusNode, conf: NimbusConf, com: CommonRef) = bootstrapNodes = bootstrapNodes, bindUdpPort = conf.udpPort, bindTcpPort = conf.tcpPort, bindIp = conf.listenAddress, - rng = nimbus.ctx.rng, + rng = nimbus.rng, forkIdProcs = forkIdProcs) # Add protocol capabilities @@ -189,34 +181,25 @@ proc setupP2P(nimbus: NimbusNode, conf: NimbusConf, com: CommonRef) = if not syncerShouldRun: nimbus.beaconSyncRef = BeaconSyncRef(nil) -proc setupMetrics(nimbus: NimbusNode, conf: NimbusConf) = - # metrics logging - if conf.logMetricsEnabled: - let tmo = conf.logMetricsInterval.seconds - proc setLogMetrics(udata: pointer) {.gcsafe.} - proc runLogMetrics(udata: pointer) {.gcsafe.} = - {.gcsafe.}: - let registry = defaultRegistry - info "metrics", registry - udata.setLogMetrics() - # Store the `runLogMetrics()` in a closure to avoid some garbage - # collection memory corruption issues that might occur otherwise. - proc setLogMetrics(udata: pointer) = - discard setTimer(Moment.fromNow(tmo), runLogMetrics) - # Start the logger - discard setTimer(Moment.fromNow(tmo), runLogMetrics) - - # metrics server - if conf.metricsEnabled: - info "Starting metrics HTTP server", address = conf.metricsAddress, port = conf.metricsPort - let res = MetricsHttpServerRef.new($conf.metricsAddress, conf.metricsPort) - if res.isErr: - fatal "Failed to create metrics server", msg=res.error - quit(QuitFailure) +proc init*(T: type NimbusNode, conf: NimbusConf, com: CommonRef): T = + let nimbus = NimbusNode( + accountsManager: new AccountsManager, + rng: newRng(), + ) + + basicServices(nimbus, conf, com) + manageAccounts(nimbus, conf) + setupP2P(nimbus, conf, com) + setupRpc(nimbus, conf, com) + + # Not starting syncer if there is definitely no way to run it. This + # avoids polling (i.e. waiting for instructions) and some logging. + if not nimbus.beaconSyncRef.isNil and + not nimbus.beaconSyncRef.start(): + nimbus.beaconSyncRef = BeaconSyncRef(nil) + + nimbus - nimbus.metricsServer = res.get - QuitFailure.onException("Cannot start metrics services"): - waitFor nimbus.metricsServer.start() proc preventLoadingDataDirForTheWrongNetwork(db: CoreDbRef; conf: NimbusConf) = proc writeDataDirId(kvt: CoreDbTxRef, calculatedId: Hash32) = @@ -244,18 +227,7 @@ proc preventLoadingDataDirForTheWrongNetwork(db: CoreDbRef; conf: NimbusConf) = expected=calculatedId quit(QuitFailure) -# ------------------------------------------------------------------------------ -# Public functions, `main()` API -# ------------------------------------------------------------------------------ - -proc runExeClient*(nimbus: NimbusNode, conf: NimbusConf) {.gcsafe.} = - ## Launches and runs the execution client for pre-configured `nimbus` and - ## `conf` argument descriptors. - ## - info "Launching execution client", - version = FullVersionStr, - conf - +proc setupCommonRef*(conf: NimbusConf, taskpool: Taskpool): CommonRef = # Trusted setup is needed for processing Cancun+ blocks # If user not specify the trusted setup, baked in # trusted setup will be loaded, lazily. @@ -271,15 +243,6 @@ proc runExeClient*(nimbus: NimbusNode, conf: NimbusConf) {.gcsafe.} = conf.dbOptions(noKeyCache = conf.cmd == NimbusCmd.`import`)) preventLoadingDataDirForTheWrongNetwork(coreDB, conf) - setupMetrics(nimbus, conf) - - var taskpool: Taskpool - QuitFailure.onException("Cannot start task pool"): - if 0 < conf.numThreads: - taskpool = Taskpool.new(numThreads = conf.numThreads.int) - else: - taskpool = Taskpool.new(numThreads = min(countProcessors(), 16)) - info "Threadpool started", numThreads = taskpool.numThreads let com = CommonRef.new( db = coreDB, @@ -304,81 +267,90 @@ proc runExeClient*(nimbus: NimbusNode, conf: NimbusConf) {.gcsafe.} = com.extraData = conf.extraData com.gasLimit = conf.gasLimit - defer: - if not nimbus.fc.isNil: - let - fc = nimbus.fc - txFrame = fc.baseTxFrame + com - fc.serialize(txFrame).isOkOr: - error "FC.serialize error: ", msg=error - txFrame.checkpoint(fc.base.blk.header.number, skipSnapshot = true) - com.db.persist(txFrame) +# ------------------------------------------------------------------------------ +# Public functions, `main()` API +# ------------------------------------------------------------------------------ - com.db.finish() +type StopFuture = Future[void].Raising([CancelledError]) - case conf.cmd - of NimbusCmd.`import`: - importBlocks(conf, com) - of NimbusCmd.`import-rlp`: - try: - waitFor importRlpBlocks(conf, com) - except CancelledError: - raiseAssert "Nothing cancels the future" - else: - basicServices(nimbus, conf, com) - manageAccounts(nimbus, conf) - setupP2P(nimbus, conf, com) - setupRpc(nimbus, conf, com) - - # Not starting syncer if there is definitely no way to run it. This - # avoids polling (i.e. waiting for instructions) and some logging. - if not nimbus.beaconSyncRef.isNil and - not nimbus.beaconSyncRef.start(): - nimbus.beaconSyncRef = BeaconSyncRef(nil) - - # Be graceful about ctrl-c during init - if ProcessState.stopping.isNone: - ProcessState.notifyRunning() - - while not ProcessState.stopIt(notice("Shutting down", reason = it)): - poll() - - # Stop loop - QuitFailure.onException("Exception while shutting down"): - waitFor nimbus.closeWait() - -proc setupExeClientNode*(conf: NimbusConf): NimbusNode {.gcsafe.} = - ## Prepare for running `runExeClient()`. - ## - ## This function returns the node config of type `NimbusNode` which might - ## be further amended before passing it to the runner `runExeClient()`. +proc runExeClient*(conf: NimbusConf, com: CommonRef, stopper: StopFuture) = + ## Launches and runs the execution client for pre-configured `nimbus` and + ## `conf` argument descriptors. ## - ProcessState.setupStopHandlers() + info "Launching execution client", version = FullVersionStr, conf + let nimbus = NimbusNode.init(conf, com) + defer: + let + fc = nimbus.fc + txFrame = fc.baseTxFrame + + fc.serialize(txFrame).isOkOr: + error "FC.serialize error: ", msg = error + txFrame.checkpoint(fc.base.blk.header.number, skipSnapshot = true) + com.db.persist(txFrame) + + # Be graceful about ctrl-c during init + if ProcessState.stopping.isNone: + ProcessState.notifyRunning() + + while true: + if (let reason = ProcessState.stopping(); reason.isSome()): + notice "Shutting down", reason = reason[] + break + if stopper != nil and stopper.finished(): + break + + chronos.poll() + + # Stop loop + QuitFailure.onException("Exception while shutting down"): + waitFor nimbus.closeWait() + +# noinline to keep it in stack traces +proc main*() {.noinline.} = + var config = makeConfig() # Set up logging before everything else - setupLogging(conf.logLevel, conf.logStdout, none(OutFile)) + setupLogging(config.logLevel, config.logStdout) setupFileLimits() + ProcessState.setupStopHandlers() + # TODO provide option for fixing / ignoring permission errors - if not checkAndCreateDataDir(conf.dataDir): + if not (checkAndCreateDataDir(config.dataDir)): # We are unable to access/create data folder or data folder's # permissions are insecure. quit QuitFailure - NimbusNode(ctx: newEthContext()) - -# ------------------------------------------------------------------------------ -# MAIN (if any) -# ------------------------------------------------------------------------------ + # Metrics are useful not just when running node but also during import + let metricsServer = + try: + waitFor(initMetricsServer(config)).valueOr: + quit(QuitFailure) + except CancelledError: + raiseAssert "Never cancelled" + defer: + waitFor metricsServer.stopMetricsServer() -when isMainModule: let - optsConf = makeConfig() - nodeConf = optsConf.setupExeClientNode() + taskpool = setupTaskpool(config.numThreads) + com = setupCommonRef(config, taskpool) - nodeConf.runExeClient(optsConf) + defer: + com.db.finish() -# ------------------------------------------------------------------------------ -# End -# ------------------------------------------------------------------------------ + case config.cmd + of NimbusCmd.`import`: + importBlocks(config, com) + of NimbusCmd.`import - rlp`: + try: + waitFor importRlpBlocks(config, com) + except CancelledError: + raiseAssert "Nothing cancels the future" + else: + runExeClient(config, com, nil) + +when isMainModule: + main() diff --git a/execution_chain/rpc.nim b/execution_chain/rpc.nim index 3e25091b92..33763d5509 100644 --- a/execution_chain/rpc.nim +++ b/execution_chain/rpc.nim @@ -51,7 +51,7 @@ func installRPC(server: RpcServer, setupCommonRpc(nimbus.ethNode, conf, server) if RpcFlag.Eth in flags: - setupServerAPI(serverApi, server, nimbus.ctx) + setupServerAPI(serverApi, server, nimbus.accountsManager) if RpcFlag.Admin in flags: setupAdminRpc(nimbus, conf, server) @@ -214,7 +214,7 @@ proc setupRpc*(nimbus: NimbusNode, conf: NimbusConf, # Provide JWT authentication handler for rpcHttpServer let jwtKey = block: # Create or load shared secret - let rc = nimbus.ctx.rng.jwtSharedSecret(conf) + let rc = nimbus.rng.jwtSharedSecret(conf) if rc.isErr: fatal "Failed create or load shared secret", msg = $(rc.unsafeError) # avoid side effects diff --git a/execution_chain/rpc/server_api.nim b/execution_chain/rpc/server_api.nim index 5378eebbfb..ed3b5dd330 100644 --- a/execution_chain/rpc/server_api.nim +++ b/execution_chain/rpc/server_api.nim @@ -135,7 +135,7 @@ proc blockFromTag(api: ServerAPIRef, blockTag: BlockTag): Result[Block, string] let blockNum = base.BlockNumber blockTag.number return api.chain.blockByNumber(blockNum) -proc setupServerAPI*(api: ServerAPIRef, server: RpcServer, ctx: EthContext) = +proc setupServerAPI*(api: ServerAPIRef, server: RpcServer, am: ref AccountsManager) = server.rpc("eth_getBalance") do(data: Address, blockTag: BlockTag) -> UInt256: ## Returns the balance of the account of given address. let @@ -394,8 +394,8 @@ proc setupServerAPI*(api: ServerAPIRef, server: RpcServer, ctx: EthContext) = server.rpc("eth_accounts") do() -> seq[Address]: ## Returns a list of addresses owned by client. - result = newSeqOfCap[Address](ctx.am.numAccounts) - for k in ctx.am.addresses: + result = newSeqOfCap[Address](am[].numAccounts) + for k in am[].addresses: result.add k server.rpc("eth_getBlockTransactionCountByHash") do(data: Hash32) -> Quantity: @@ -456,7 +456,7 @@ proc setupServerAPI*(api: ServerAPIRef, server: RpcServer, ctx: EthContext) = ## Returns signature. let address = data - acc = ctx.am.getAccount(address).tryGet() + acc = am[].getAccount(address).tryGet() if not acc.unlocked: raise newException(ValueError, "Account locked, please unlock it first") @@ -467,7 +467,7 @@ proc setupServerAPI*(api: ServerAPIRef, server: RpcServer, ctx: EthContext) = ## eth_sendRawTransaction let address = data.`from`.get() - acc = ctx.am.getAccount(address).tryGet() + acc = am[].getAccount(address).tryGet() if not acc.unlocked: raise newException(ValueError, "Account locked, please unlock it first") @@ -488,7 +488,7 @@ proc setupServerAPI*(api: ServerAPIRef, server: RpcServer, ctx: EthContext) = ## Note: Use eth_getTransactionReceipt to get the contract address, after the transaction was mined, when you created a contract. let address = data.`from`.get() - acc = ctx.am.getAccount(address).tryGet() + acc = am[].getAccount(address).tryGet() if not acc.unlocked: raise newException(ValueError, "Account locked, please unlock it first") diff --git a/nimbus_verified_proxy/libverifproxy/verifproxy.nim b/nimbus_verified_proxy/libverifproxy/verifproxy.nim index e34c097e45..feb5ca28c0 100644 --- a/nimbus_verified_proxy/libverifproxy/verifproxy.nim +++ b/nimbus_verified_proxy/libverifproxy/verifproxy.nim @@ -6,7 +6,7 @@ # at your option. This file may not be copied, modified, or distributed except according to those terms. import - std/[atomics, json, strutils, net], + std/[atomics, json, net], eth/net/nat, beacon_chain/spec/[digest, network], beacon_chain/nimbus_binary_common, diff --git a/nimbus_verified_proxy/nimbus_verified_proxy.nim b/nimbus_verified_proxy/nimbus_verified_proxy.nim index e4f742860e..e0edfc20cb 100644 --- a/nimbus_verified_proxy/nimbus_verified_proxy.nim +++ b/nimbus_verified_proxy/nimbus_verified_proxy.nim @@ -18,7 +18,7 @@ import beacon_chain/networking/network_metadata, beacon_chain/networking/topic_params, beacon_chain/spec/beaconstate, - beacon_chain/[beacon_clock, light_client, nimbus_binary_common, version], + beacon_chain/[beacon_clock, buildinfo, light_client, nimbus_binary_common], ../execution_chain/rpc/cors, ../execution_chain/common/common, ./types, @@ -26,7 +26,8 @@ import ./rpc/rpc_eth_api, ./nimbus_verified_proxy_conf, ./header_store, - ./rpc_api_backend + ./rpc_api_backend, + ../execution_chain/version_info type OnHeaderCallback* = proc(s: cstring, t: int) {.cdecl, raises: [], gcsafe.} type Context* = object @@ -69,7 +70,7 @@ proc run*( config: VerifiedProxyConf, ctx: ptr Context ) {.raises: [CatchableError], gcsafe.} = {.gcsafe.}: - setupLogging(config.logLevel, config.logStdout, none(OutFile)) + setupLogging(config.logLevel, config.logStdout) try: notice "Launching Nimbus verified proxy", @@ -305,9 +306,18 @@ proc run*( ctx.onHeader(nil, 2) break -when isMainModule: - {.pop.} - var config = - makeBannerAndConfig("Nimbus verified proxy " & fullVersionStr, VerifiedProxyConf) - {.push raises: [].} +# noinline to keep it in stack traces +proc main() {.noinline, raises: [CatchableError].} = + const + banner = "Nimbus Verified Proxy " & FullVersionStr + copyright = + "Copyright (c) 2022-" & compileYear & " Status Research & Development GmbH" + + var config = VerifiedProxyConf.loadWithBanners(banner, copyright, [], true).valueOr: + writePanicLine error # Logging not yet set up + quit QuitFailure + run(config, nil) + +when isMainModule: + main() diff --git a/portal/bridge/nimbus_portal_bridge.nim b/portal/bridge/nimbus_portal_bridge.nim index 7f45fa85f8..3627999ab9 100644 --- a/portal/bridge/nimbus_portal_bridge.nim +++ b/portal/bridge/nimbus_portal_bridge.nim @@ -61,7 +61,7 @@ when isMainModule: let config = PortalBridgeConf.load() - setupLogging(config.logLevel, config.logStdout, none(OutFile)) + setupLogging(config.logLevel, config.logStdout) case config.cmd of PortalBridgeCmd.beacon: diff --git a/portal/client/nimbus_portal_client.nim b/portal/client/nimbus_portal_client.nim index e149ec96f4..d2a7a68e5a 100644 --- a/portal/client/nimbus_portal_client.nim +++ b/portal/client/nimbus_portal_client.nim @@ -34,7 +34,7 @@ import ../version, ../logging, ../bridge/common/rpc_helpers, - beacon_chain/process_state, + beacon_chain/[nimbus_binary_common, process_state], ./nimbus_portal_client_conf const @@ -64,7 +64,7 @@ proc init(T: type PortalClient): T = PortalClient() proc run(portalClient: PortalClient, config: PortalConf) {.raises: [CatchableError].} = - setupLogging(config.logLevel, config.logStdout, none(OutFile)) + setupLogging(config.logLevel, config.logStdout) notice "Launching Nimbus Portal client", version = fullVersionStr, cmdParams = commandLineParams() @@ -106,15 +106,9 @@ proc run(portalClient: PortalClient, config: PortalConf) {.raises: [CatchableErr bindIp = config.listenAddress udpPort = Port(config.udpPort) # TODO: allow for no TCP port mapping! - (extIp, _, extUdpPort) = - try: - setupAddress( - config.nat, config.listenAddress, udpPort, udpPort, "nimbus_portal_client" - ) - except CatchableError as exc: - raise exc # TODO: Ideally we don't have the Exception here - except Exception as exc: - raiseAssert exc.msg + (extIp, _, extUdpPort) = setupAddress( + config.nat, config.listenAddress, udpPort, udpPort, "nimbus_portal_client" + ) (netkey, newNetKey) = if config.networkKey.isSome(): (config.networkKey.get(), true) @@ -244,31 +238,11 @@ proc run(portalClient: PortalClient, config: PortalConf) {.raises: [CatchableErr let enrFile = dataDir / enrFileName if io2.writeFile(enrFile, d.localNode.record.toURI()).isErr: fatal "Failed to write the enr file", file = enrFile - quit 1 + quit QuitFailure ## Start metrics HTTP server - let metricsServer = - if config.metricsEnabled: - let - address = config.metricsAddress - port = config.metricsPort - url = "http://" & $address & ":" & $port & "/metrics" - - server = MetricsHttpServerRef.new($address, port).valueOr: - error "Could not instantiate metrics HTTP server", url, error - quit QuitFailure - - info "Starting metrics HTTP server", url - try: - waitFor server.start() - except MetricsError as exc: - fatal "Could not start metrics HTTP server", - url, error_msg = exc.msg, error_name = exc.name - quit QuitFailure - - Opt.some(server) - else: - Opt.none(MetricsHttpServerRef) + let metricsServer = waitFor(initMetricsServer(config)).valueOr: + quit QuitFailure # Logged in initMetricsServer ## Start the Portal node. node.start() @@ -310,12 +284,12 @@ proc run(portalClient: PortalClient, config: PortalConf) {.raises: [CatchableErr if config.rpcEnabled: let ta = initTAddress(config.rpcAddress, config.rpcPort) - rpcHttpServer = RpcHttpServer.new() + server = RpcHttpServer.new() # 16mb to comfortably fit 2-3mb blocks + blobs + json overhead - rpcHttpServer.addHttpServer(ta, maxRequestBodySize = 16 * 1024 * 1024) - rpcHttpServer.setupRpcServer(rpcFlags) + server.addHttpServer(ta, maxRequestBodySize = 16 * 1024 * 1024) + server.setupRpcServer(rpcFlags) - Opt.some(rpcHttpServer) + Opt.some(server) else: Opt.none(RpcHttpServer) @@ -354,14 +328,7 @@ proc stop(f: PortalClient) {.async: (raises: []).} = except CatchableError as e: warn "Failed to stop rpc HTTP server", exc = e.name, err = e.msg - if f.metricsServer.isSome(): - let server = f.metricsServer.get() - try: - await server.stop() - await server.close() - except CatchableError as e: - warn "Failed to stop metrics HTTP server", exc = e.name, err = e.msg - + await f.metricsServer.stopMetricsServer() await f.portalNode.stop() when isMainModule: diff --git a/portal/version.nim b/portal/version.nim index b77338fdaa..1060f4b307 100644 --- a/portal/version.nim +++ b/portal/version.nim @@ -30,7 +30,6 @@ const clientName & "/" & fullVersionStr & "/" & hostOS & "-" & hostCPU & "/" & "Nim" & NimVersion - compileYear = CompileDate[0 ..< 4] # YYYY-MM-DD (UTC) copyrightBanner* = "Copyright (c) 2021-" & compileYear & " Status Research & Development GmbH" diff --git a/scripts/check_vendor_eth2.sh b/scripts/check_vendor_eth2.sh index 7c81bd4fdd..23351d9b75 100755 --- a/scripts/check_vendor_eth2.sh +++ b/scripts/check_vendor_eth2.sh @@ -6,4 +6,23 @@ cd "$(dirname "${BASH_SOURCE[0]}")"/.. COMMON=$(ls vendor/ vendor/nimbus-eth2/vendor/ -1 | sort | uniq -d | sed -e "sX^Xvendor/X") -diff -u <(git submodule status $COMMON) <(git -C vendor/nimbus-eth2 submodule status $COMMON) +if [[ "$1" == "--update" ]]; then + for dep in $COMMON; do + eth2_commit=$(git -C vendor/nimbus-eth2 submodule status "$dep" | awk '{gsub(/[+-]/, "", $1); print $1}') + if [ -n "$eth2_commit" ]; then + git -C "$dep" checkout "$eth2_commit" + fi + done +else + for dep in $COMMON; do + eth1_commit=$(git submodule status "$dep" | awk '{gsub(/[+-]/, "", $1); print $1}') + eth2_commit=$(git -C vendor/nimbus-eth2 submodule status "$dep" | awk '{gsub(/[+-]/, "", $1); print $1}') + if [ "$eth1_commit" != "$eth2_commit" ]; then + eth1_info=$(git -C "$dep" show -s --format="%h %ad %s" --date=short "$eth1_commit") + eth2_info=$(git -C vendor/nimbus-eth2/"$dep" show -s --format="%h %ad %s" --date=short "$eth2_commit") + echo "$dep:" + echo " eth1: $eth1_info" + echo " eth2: $eth2_info" + fi + done +fi diff --git a/tests/config_file/basic.toml b/tests/config_file/basic.toml index 8f81f401e2..0454f90ba0 100644 --- a/tests/config_file/basic.toml +++ b/tests/config_file/basic.toml @@ -12,8 +12,6 @@ network = ["hoodi", "777"] log-level = "DEBUG" log-format = "json" -log-metrics = true -log-metrics-interval = 15 metrics = true metrics-port = 127 diff --git a/tests/eest/eest_helpers.nim b/tests/eest/eest_helpers.nim index df5fb750e2..1ed4e4575a 100644 --- a/tests/eest/eest_helpers.nim +++ b/tests/eest/eest_helpers.nim @@ -256,7 +256,7 @@ proc prepareEnv*( beaconEngine = BeaconEngineRef.new(txPool) serverApi = newServerAPI(txPool) - setupServerAPI(serverApi, server, newEthContext()) + setupServerAPI(serverApi, server, new AccountsManager) setupEngineAPI(beaconEngine, server) server.start() diff --git a/tests/test_configuration.nim b/tests/test_configuration.nim index afd53845e8..f67ce54ced 100644 --- a/tests/test_configuration.nim +++ b/tests/test_configuration.nim @@ -15,8 +15,8 @@ import eth/net/nat, eth/p2p/discoveryv5/enr, stew/byteutils, - ../execution_chain/config, - ../execution_chain/common/[chain_config, context, manager], + ../execution_chain/[common, config], + ../execution_chain/networking/netkeys, ./test_helpers func `==`*(a, b: OutDir): bool = @@ -235,17 +235,17 @@ proc configurationMain*() = conf.engineApiServerEnabled == false conf.shareServerWithEngineApi == false - let ctx = newEthContext() + let rng = newRng() test "net-key random": let conf = makeConfig(@["--net-key:random"]) check conf.netKey == "random" - let rc = ctx.getNetKeys(conf.netKey) + let rc = rng[].getNetKeys(conf.netKey) check rc.isOk test "net-key hex without 0x prefix": let conf = makeConfig(@["--net-key:9c647b8b7c4e7c3490668fb6c11473619db80c93704c70893d3813af4090c39c"]) check conf.netKey == "9c647b8b7c4e7c3490668fb6c11473619db80c93704c70893d3813af4090c39c" - let rc = ctx.getNetKeys(conf.netKey) + let rc = rng[].getNetKeys(conf.netKey) check rc.isOk let pkhex = rc.get.seckey.toRaw.to0xHex check pkhex == "0x9c647b8b7c4e7c3490668fb6c11473619db80c93704c70893d3813af4090c39c" @@ -253,7 +253,7 @@ proc configurationMain*() = test "net-key hex with 0x prefix": let conf = makeConfig(@["--net-key:0x9c647b8b7c4e7c3490668fb6c11473619db80c93704c70893d3813af4090c39c"]) check conf.netKey == "0x9c647b8b7c4e7c3490668fb6c11473619db80c93704c70893d3813af4090c39c" - let rc = ctx.getNetKeys(conf.netKey) + let rc = rng[].getNetKeys(conf.netKey) check rc.isOk let pkhex = rc.get.seckey.toRaw.to0xHex check pkhex == "0x9c647b8b7c4e7c3490668fb6c11473619db80c93704c70893d3813af4090c39c" @@ -261,10 +261,10 @@ proc configurationMain*() = test "net-key path": let conf = makeConfig(@["--net-key:nimcache/key.txt"]) check conf.netKey == "nimcache/key.txt" - let rc1 = ctx.getNetKeys(conf.netKey) + let rc1 = rng[].getNetKeys(conf.netKey) check rc1.isOk let pkhex1 = rc1.get.seckey.toRaw.to0xHex - let rc2 = ctx.getNetKeys(conf.netKey) + let rc2 = rng[].getNetKeys(conf.netKey) check rc2.isOk let pkhex2 = rc2.get.seckey.toRaw.to0xHex check pkhex1 == pkhex2 @@ -289,13 +289,13 @@ proc configurationMain*() = check conf.keyStoreDir() == "banana" test "loadKeystores missing address": - var am = AccountsManager.init() + var am = AccountsManager() let res = am.loadKeystores("tests/invalid_keystore/missingaddress") check res.isErr check res.error.find("no 'address' field in keystore data:") == 0 test "loadKeystores not an object": - var am = AccountsManager.init() + var am = AccountsManager() let res = am.loadKeystores("tests/invalid_keystore/notobject") check res.isErr check res.error.find("expect json object of keystore data:") == 0 @@ -315,8 +315,6 @@ proc configurationMain*() = check conf.logLevel == "DEBUG" check conf.logStdout == StdoutLogKind.Json - check conf.logMetricsEnabled == true - check conf.logMetricsInterval == 15 check conf.metricsEnabled == true check conf.metricsPort == 127.Port diff --git a/tests/test_engine_api.nim b/tests/test_engine_api.nim index a91d0df647..9b4074b621 100644 --- a/tests/test_engine_api.nim +++ b/tests/test_engine_api.nim @@ -99,7 +99,7 @@ proc setupEnv(envFork: HardFork = MergeFork, beaconEngine = BeaconEngineRef.new(txPool) serverApi = newServerAPI(txPool) - setupServerAPI(serverApi, server, newEthContext()) + setupServerAPI(serverApi, server, new AccountsManager) setupEngineAPI(beaconEngine, server) server.start() diff --git a/tests/test_helpers.nim b/tests/test_helpers.nim index c55407df34..b688bfc761 100644 --- a/tests/test_helpers.nim +++ b/tests/test_helpers.nim @@ -11,8 +11,8 @@ import testutils/markdown_reports, ../execution_chain/[constants, config, transaction, errors], ../execution_chain/db/ledger, - ../execution_chain/common/[context, common], - ../execution_chain/networking/p2p + ../execution_chain/common, + ../execution_chain/networking/[netkeys, p2p] func revTable(list: array[FkFrontier..FkLatest, string]): Table[string, EVMFork] = for k, v in list: @@ -147,9 +147,9 @@ proc verifyLedger*(wantedState: JsonNode, ledger: ReadOnlyLedger) = raise newException(ValidationError, &"{ac} nonceDiff {wantedNonce.toHex} != {actualNonce.toHex}") proc setupEthNode*( - conf: NimbusConf, ctx: EthContext, + conf: NimbusConf, rng: var HmacDrbgContext, capabilities: varargs[ProtocolInfo, `protocolInfo`]): EthereumNode = - let keypair = ctx.getNetKeys(conf.netKey).tryGet() + let keypair = getNetKeys(rng, conf.netKey).tryGet() let srvAddress = enode.Address( ip: conf.listenAddress, tcpPort: conf.tcpPort, udpPort: conf.udpPort) diff --git a/tests/test_rpc.nim b/tests/test_rpc.nim index 5de5a95ce0..7ce1fa9d1d 100644 --- a/tests/test_rpc.nim +++ b/tests/test_rpc.nim @@ -41,7 +41,7 @@ type server : RpcHttpServer client : RpcHttpClient chain : ForkedChainRef - ctx : EthContext + am : ref AccountsManager node : EthereumNode txHash : Hash32 blockHash: Hash32 @@ -135,8 +135,8 @@ proc makeBlobTx(env: var TestEnv, nonce: int): PooledTransaction = blobs = @[pooled_txs.KzgBlob(blob.bytes)] let - ctx = env.ctx - acc = ctx.am.getAccount(signer).tryGet() + am = env.am + acc = am[].getAccount(signer).tryGet() commitment = blobToKzgCommitment(blob).expect("good blob") proof = computeBlobKzgProof(blob, commitment).expect("good commitment") digest = kzgToVersionedHash(commitment.bytes) @@ -210,22 +210,23 @@ proc setupEnv(envFork: HardFork = MergeFork): TestEnv = quit(QuitFailure) serverApi = newServerAPI(txPool) client = setupClient(server.localAddress[0].port) - ctx = newEthContext() - node = setupEthNode(conf, ctx, eth68, eth69) + rng = newRng() + am = new AccountsManager + node = setupEthNode(conf, rng[], eth68, eth69) nimbus = NimbusNode( ethNode: node, ) - ctx.am.loadKeystores(keyStore).isOkOr: + am[].loadKeystores(keyStore).isOkOr: debugEcho error quit(QuitFailure) - let acc1 = ctx.am.getAccount(signer).tryGet() - ctx.am.unlockAccount(signer, acc1.keystore["password"].getStr()).isOkOr: + let acc1 = am[].getAccount(signer).tryGet() + am[].unlockAccount(signer, acc1.keystore["password"].getStr()).isOkOr: debugEcho error quit(QuitFailure) - setupServerAPI(serverApi, server, ctx) + setupServerAPI(serverApi, server, am) setupCommonRpc(node, conf, server) setupAdminRpc(nimbus, conf, server) server.start() @@ -237,7 +238,7 @@ proc setupEnv(envFork: HardFork = MergeFork): TestEnv = server : server, client : client, chain : chain, - ctx : ctx, + am : am, node : node, chainId: conf.networkParams.config.chainId, ) @@ -246,9 +247,9 @@ proc generateBlock(env: var TestEnv) = let com = env.com xp = env.txPool - ctx = env.ctx + am = env.am txFrame = com.db.baseTxFrame() - acc = ctx.am.getAccount(signer).tryGet() + acc = am[].getAccount(signer).tryGet() tx1 = env.makeTx(acc.privateKey, zeroAddress, 1.u256, 30_000_000_000'u64) tx2 = env.makeTx(acc.privateKey, zeroAddress, 2.u256, 30_000_000_100'u64) chain = env.chain diff --git a/vendor/NimYAML b/vendor/NimYAML index 25f600ebcd..9e43c0ab26 160000 --- a/vendor/NimYAML +++ b/vendor/NimYAML @@ -1 +1 @@ -Subproject commit 25f600ebcd8f03492e6531f5642c3c2f1b83b3e3 +Subproject commit 9e43c0ab26381889a3d932b1e811def60f7408e1 diff --git a/vendor/nim-bearssl b/vendor/nim-bearssl index 11e798b62b..b16f70bd8e 160000 --- a/vendor/nim-bearssl +++ b/vendor/nim-bearssl @@ -1 +1 @@ -Subproject commit 11e798b62b8e6beabe958e048e9e24c7e0f9ee63 +Subproject commit b16f70bd8e14abed1c9f03f93757547cf1e95c03 diff --git a/vendor/nim-blscurve b/vendor/nim-blscurve index bcfb3e77a2..ffbe938f30 160000 --- a/vendor/nim-blscurve +++ b/vendor/nim-blscurve @@ -1 +1 @@ -Subproject commit bcfb3e77a2c5e1a02611ee4d03f3a655fe902eb1 +Subproject commit ffbe938f30185bdb30cfed0659d0977680641002 diff --git a/vendor/nim-chronos b/vendor/nim-chronos index 0646c444fc..bb0a8f07bc 160000 --- a/vendor/nim-chronos +++ b/vendor/nim-chronos @@ -1 +1 @@ -Subproject commit 0646c444fce7c7ed08ef6f2c9a7abfd172ffe655 +Subproject commit bb0a8f07bcff3fb79b20720e4bb286fccedae93a diff --git a/vendor/nim-faststreams b/vendor/nim-faststreams index c3ac3f639e..8a94d6f73f 160000 --- a/vendor/nim-faststreams +++ b/vendor/nim-faststreams @@ -1 +1 @@ -Subproject commit c3ac3f639ed1d62f59d3077d376a29c63ac9750c +Subproject commit 8a94d6f73fc1b0d0cff10ee537268baa772fab40 diff --git a/vendor/nim-json-serialization b/vendor/nim-json-serialization index 9e1017f8b0..0640259af2 160000 --- a/vendor/nim-json-serialization +++ b/vendor/nim-json-serialization @@ -1 +1 @@ -Subproject commit 9e1017f8b0adb775916da1c98dc24b9c9acb8151 +Subproject commit 0640259af2fad330ea28e77359c0d0cefac5a361 diff --git a/vendor/nim-kzg4844 b/vendor/nim-kzg4844 index 644a19b987..6715be0e27 160000 --- a/vendor/nim-kzg4844 +++ b/vendor/nim-kzg4844 @@ -1 +1 @@ -Subproject commit 644a19b9874516446411aa31a7747b81d21431e5 +Subproject commit 6715be0e276ceb19f830e087e4a02f7ba586833f diff --git a/vendor/nim-libbacktrace b/vendor/nim-libbacktrace index 5535cfc4f0..267dee621e 160000 --- a/vendor/nim-libbacktrace +++ b/vendor/nim-libbacktrace @@ -1 +1 @@ -Subproject commit 5535cfc4f0e0912abcbaacadcc7115066a5c0901 +Subproject commit 267dee621ecc33883c9fad1b4af0d296cde7d822 diff --git a/vendor/nim-libp2p b/vendor/nim-libp2p index b517b692df..59e7069c15 160000 --- a/vendor/nim-libp2p +++ b/vendor/nim-libp2p @@ -1 +1 @@ -Subproject commit b517b692dfcdf39943963e60e39c7cff1fc6f289 +Subproject commit 59e7069c15e914618b7f7b2206c47d16c5d10a34 diff --git a/vendor/nim-minilru b/vendor/nim-minilru index 0c4b2bce95..aba86fcf59 160000 --- a/vendor/nim-minilru +++ b/vendor/nim-minilru @@ -1 +1 @@ -Subproject commit 0c4b2bce959591f0a862e9b541ba43c6d0cf3476 +Subproject commit aba86fcf59597f5d43875751d478732100456d1f diff --git a/vendor/nim-secp256k1 b/vendor/nim-secp256k1 index f808ed5e7a..9dd3df6212 160000 --- a/vendor/nim-secp256k1 +++ b/vendor/nim-secp256k1 @@ -1 +1 @@ -Subproject commit f808ed5e7a7bfc42204ec7830f14b7a42b63c284 +Subproject commit 9dd3df62124aae79d564da636bb22627c53c7676 diff --git a/vendor/nim-serialization b/vendor/nim-serialization index 73d6108d9c..b5193007a4 160000 --- a/vendor/nim-serialization +++ b/vendor/nim-serialization @@ -1 +1 @@ -Subproject commit 73d6108d9c7ad0a1283d1e361a3f86e6c676a305 +Subproject commit b5193007a49639b21b2b80cd8ef8cbe0df6b0e48 diff --git a/vendor/nim-snappy b/vendor/nim-snappy index 8291337351..8ab5cf0bdd 160000 --- a/vendor/nim-snappy +++ b/vendor/nim-snappy @@ -1 +1 @@ -Subproject commit 829133735113951b219e3b108a6bd2146209300b +Subproject commit 8ab5cf0bdd84c7166b64dbe1b2deaa606d46ad22 diff --git a/vendor/nim-sqlite3-abi b/vendor/nim-sqlite3-abi index bdf01cf423..a322ceb619 160000 --- a/vendor/nim-sqlite3-abi +++ b/vendor/nim-sqlite3-abi @@ -1 +1 @@ -Subproject commit bdf01cf4236fb40788f0733466cdf6708783cbac +Subproject commit a322ceb619f40a5c521ea711ee1fad4c6d11aa09 diff --git a/vendor/nim-ssz-serialization b/vendor/nim-ssz-serialization index 7882d5ddb1..4b73e3408d 160000 --- a/vendor/nim-ssz-serialization +++ b/vendor/nim-ssz-serialization @@ -1 +1 @@ -Subproject commit 7882d5ddb10f67a107da812b7ce29d566137641f +Subproject commit 4b73e3408df7eadeedc1f1da5976c32c55d5933e diff --git a/vendor/nim-stint b/vendor/nim-stint index 4992f27833..470b789256 160000 --- a/vendor/nim-stint +++ b/vendor/nim-stint @@ -1 +1 @@ -Subproject commit 4992f27833104091fba75486d75f890312dff3d7 +Subproject commit 470b7892561b5179ab20bd389a69217d6213fe58 diff --git a/vendor/nim-toml-serialization b/vendor/nim-toml-serialization index c8dc4527cc..bf994c11ea 160000 --- a/vendor/nim-toml-serialization +++ b/vendor/nim-toml-serialization @@ -1 +1 @@ -Subproject commit c8dc4527cc7f27b67f41402451a757668819127c +Subproject commit bf994c11ea21c1506334949317554b92e34635f0 diff --git a/vendor/nim-web3 b/vendor/nim-web3 index c2b10b4622..141907cd95 160000 --- a/vendor/nim-web3 +++ b/vendor/nim-web3 @@ -1 +1 @@ -Subproject commit c2b10b4622947536c836a5ab5399dacc74cf27e7 +Subproject commit 141907cd958d7ee3b554ec94bc9ac7ec692e546b diff --git a/vendor/nim-websock b/vendor/nim-websock index f80788453e..2c1dbcef10 160000 --- a/vendor/nim-websock +++ b/vendor/nim-websock @@ -1 +1 @@ -Subproject commit f80788453ead89950036d1603fecb2ff1b6b837f +Subproject commit 2c1dbcef10b0d99fb846535ae1a01d5c8263041b diff --git a/vendor/nimbus-build-system b/vendor/nimbus-build-system index d7be8e5243..e6c2c9da39 160000 --- a/vendor/nimbus-build-system +++ b/vendor/nimbus-build-system @@ -1 +1 @@ -Subproject commit d7be8e52434abb003d4bf9e73dcb72559ddf79ba +Subproject commit e6c2c9da39c2d368d9cf420ac22692e99715d22c diff --git a/vendor/nimbus-eth2 b/vendor/nimbus-eth2 index 0415ebc929..1ebb3ecc56 160000 --- a/vendor/nimbus-eth2 +++ b/vendor/nimbus-eth2 @@ -1 +1 @@ -Subproject commit 0415ebc929ee8c41a1660a154cbec02152c3ce6b +Subproject commit 1ebb3ecc56d3947bb2b93e63fee6ebf1eb849fa1