Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
28 changes: 25 additions & 3 deletions nimbus_verified_proxy/engine/genesis_params.nim
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import stew/byteutils, beacon_chain/spec/digest
type GenesisParams* = object
genesisTime*: uint64
genesisValidatorsRoot*: Eth2Digest
genesisBlockRoot*: Eth2Digest

const
mainnetGenesisValidatorsRoot = Eth2Digest(
Expand All @@ -27,18 +28,39 @@ const
"212f13fc4df078b6cb7db228f1c8307566dcecf900867401a92023d7ba99cb5f"
)
)
mainnetGenesisBlockRoot = Eth2Digest(
data: hexToByteArray[32](
"d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3"
)
)
sepoliaGenesisBlockRoot = Eth2Digest(
data: hexToByteArray[32](
"25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9"
)
)
hoodiGenesisBlockRoot = Eth2Digest(
data: hexToByteArray[32](
"bbe312868b376a3001692a646dd2d7d1e4406380dfd86b98aa8a34d1557c971b"
)
)

func genesisParamsForNetwork*(network: string): GenesisParams {.raises: [].} =
case network
of "sepolia":
GenesisParams(
genesisTime: 1655733600'u64, genesisValidatorsRoot: sepoliaGenesisValidatorsRoot
genesisTime: 1655733600'u64,
genesisValidatorsRoot: sepoliaGenesisValidatorsRoot,
genesisBlockRoot: sepoliaGenesisBlockRoot,
)
of "hoodi":
GenesisParams(
genesisTime: 1742213400'u64, genesisValidatorsRoot: hoodiGenesisValidatorsRoot
genesisTime: 1742213400'u64,
genesisValidatorsRoot: hoodiGenesisValidatorsRoot,
genesisBlockRoot: hoodiGenesisBlockRoot,
)
else: # mainnet
GenesisParams(
genesisTime: 1606824023'u64, genesisValidatorsRoot: mainnetGenesisValidatorsRoot
genesisTime: 1606824023'u64,
genesisValidatorsRoot: mainnetGenesisValidatorsRoot,
genesisBlockRoot: mainnetGenesisBlockRoot,
)
60 changes: 56 additions & 4 deletions nimbus_verified_proxy/nimbus_verified_proxy.nim
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
{.push raises: [], gcsafe.}

import
std/[os, strutils],
std/[options, os, strutils],
chronicles,
chronos,
confutils,
Expand All @@ -21,11 +21,13 @@ import
../execution_chain/common/common,
./nimbus_verified_proxy_conf,
./engine/engine,
./engine/genesis_params,
./engine/rpc_frontend,
./engine/header_store,
./engine/utils,
./engine/types,
./lc_backend,
./p2p_lc_backend,
./json_rpc_backend,
./json_rpc_frontend,
../execution_chain/version_info
Expand Down Expand Up @@ -112,6 +114,38 @@ proc startBeaconBackends(

clients

proc startP2PBeaconBackend(
engine: RpcVerificationEngine, config: VerifiedProxyConf
): Future[Option[P2PLightClientBackend]] {.async: (raises: [CancelledError]).} =
let
networkName = config.eth2Network.get("mainnet")
genesis = genesisParamsForNetwork(networkName)
p2pConf = P2PBackendConf(
cfg: engine.cfg,
forkDigests: engine.forkDigests,
getBeaconTime: engine.getBeaconTime,
genesisValidatorsRoot: genesis.genesisValidatorsRoot,
genesisBlockRoot: genesis.genesisBlockRoot,
tcpPort: Port(config.p2pTcpPort),
udpPort: Port(config.p2pUdpPort),
maxPeers: config.p2pMaxPeers,
bootstrapNodesFile: config.p2pBootstrapNodesFile,
nat: config.p2pNat,
network: networkName,
)
backend = P2PLightClientBackend.init(p2pConf).valueOr:
error "Failed to create P2P light client node", err = error.errMsg
return none(P2PLightClientBackend)

let startRes = await backend.start()
if startRes.isErr():
error "Failed to start P2P light client backend", err = startRes.error.errMsg
return none(P2PLightClientBackend)

engine.registerBackend(backend.getBeaconApiBackend(), fullBeaconCapabilities)
info "P2P light client backend started"
some(backend)

proc startFrontends(
frontend: ExecutionApiFrontend, urls: seq[string]
): seq[JsonRpcServer] {.raises: [ProxyError].} =
Expand Down Expand Up @@ -166,6 +200,13 @@ proc run(
engine = RpcVerificationEngine.init(engineConf).valueOr:
raise newException(ProxyError, "Couldn't initialize verification engine")

# sanity check
if config.executionApiUrls.len <= 0:
raise newException(ProxyError, "Need atleast one execution api url to be specified")

if (config.beaconApiUrls.len <= 0) and (not config.p2pEnabled):
raise newException(ProxyError, "Need atleast one beacon url or p2p enabled")

let usePrivateTx = config.privateTxUrls.len > 0

let regularCaps =
Expand All @@ -182,7 +223,18 @@ proc run(

let execBackendClients =
await startExecutionBackends(engine, config.executionApiUrls, regularCaps)
let beaconBackendClients = await startBeaconBackends(engine, config.beaconApiUrls)
let beaconBackendClients =
if config.beaconApiUrls.len > 0:
await startBeaconBackends(engine, config.beaconApiUrls)
else:
@[]

let p2pBackend =
if config.p2pEnabled:
await startP2PBeaconBackend(engine, config)
else:
none(P2PLightClientBackend)

let frontend = engine.getExecutionApiFrontend()
let frontendServers = startFrontends(frontend, config.frontendUrls)

Expand All @@ -202,6 +254,8 @@ proc run(
await c.stop()
for c in privateTxClients:
await c.stop()
if p2pBackend.isSome():
await p2pBackend.get().stop()
raise e

when isMainModule:
Expand Down Expand Up @@ -241,5 +295,3 @@ when isMainModule:
except CatchableError as e:
fatal "Unexpected error", error = e.msg
quit QuitFailure

waitFor run(config)
43 changes: 43 additions & 0 deletions nimbus_verified_proxy/nimbus_verified_proxy_conf.nim
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,49 @@ type VerifiedProxyConf* = object
name: "private-tx-url"
.}: UrlList

# P2P light client backend
p2pEnabled* {.
desc: "Enable P2P light client data backend",
defaultValue: false,
defaultValueDesc: "false"
name: "p2p"
.}: bool

p2pTcpPort* {.
desc: "Listening TCP port for the P2P light client backend",
defaultValue: 9000,
defaultValueDesc: "9000"
name: "p2p-tcp-port"
.}: uint16

p2pUdpPort* {.
desc: "Listening UDP port for the P2P light client backend",
defaultValue: 9000,
defaultValueDesc: "9000"
name: "p2p-udp-port"
.}: uint16

p2pMaxPeers* {.
desc: "Target number of peers for the P2P light client backend",
defaultValue: 160,
defaultValueDesc: "160"
name: "p2p-max-peers"
.}: int

p2pBootstrapNodesFile* {.
desc: "Path to a file containing bootstrap node ENRs (one per line) for the P2P light client backend",
defaultValue: "",
defaultValueDesc: ""
name: "p2p-bootstrap-nodes-file"
.}: string

p2pNat* {.
desc: "NAT traversal for the P2P backend. One of: any, none, upnp, pmp, extip:<IP>",
defaultValue: "any",
defaultValueDesc: "any"
name: "p2p-nat"
.}: string

#!fmt: on

proc parseCmdArg*(T: type UrlList, p: string): T {.raises: [ValueError].} =
Expand Down
Loading
Loading