Skip to content

Commit f1d3d0e

Browse files
committed
wip: quic
1 parent 5649296 commit f1d3d0e

File tree

5 files changed

+40
-12
lines changed

5 files changed

+40
-12
lines changed

beacon_chain/conf.nim

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ from consensus_object_pools/block_pools_types_light_client
3636

3737
export
3838
uri, nat, enr,
39-
defaultEth2TcpPort, enabledLogLevel,
39+
defaultEth2TcpPort, defaultEth2QuicPort, enabledLogLevel,
4040
defs, parseCmdArg, completeCmdArg, network_metadata,
4141
el_conf, network,
4242
confTomlDefs, confTomlNet, confTomlUri, jsnet,
@@ -299,6 +299,12 @@ type
299299
defaultValueDesc: $defaultEth2TcpPortDesc
300300
name: "tcp-port" .}: Port
301301

302+
quicPort* {.
303+
desc: "Listening UDP port for Ethereum LibP2P traffic over QUIC"
304+
defaultValue: defaultEth2QuicPort
305+
defaultValueDesc: $defaultEth2QuicPortDesc
306+
name: "quic-port" .}: Port
307+
302308
udpPort* {.
303309
desc: "Listening UDP port for node discovery"
304310
defaultValue: defaultEth2TcpPort

beacon_chain/conf_light_client.nim

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ type LightClientConf* = object
6969
defaultValueDesc: $defaultEth2TcpPortDesc
7070
name: "tcp-port" .}: Port
7171

72+
quicPort* {.
73+
desc: "Listening UDP port for Ethereum LibP2P traffic over QUIC"
74+
defaultValue: defaultEth2QuicPort
75+
defaultValueDesc: $defaultEth2QuicPortDesc
76+
name: "quic-port" .}: Port
77+
7278
udpPort* {.
7379
desc: "Listening UDP port for node discovery"
7480
defaultValue: defaultEth2TcpPort

beacon_chain/networking/eth2_discovery.nim

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ proc loadBootstrapFile*(bootstrapFile: string,
7878

7979
proc new*(T: type Eth2DiscoveryProtocol,
8080
config: BeaconNodeConf | LightClientConf,
81-
enrIp: Opt[IpAddress], enrTcpPort, enrUdpPort: Opt[Port],
81+
enrIp: Opt[IpAddress], enrTcpPort, enrQuicPort, enrUdpPort: Opt[Port],
8282
pk: PrivateKey,
8383
enrFields: openArray[(string, seq[byte])], rng: ref HmacDrbgContext):
8484
T =
@@ -102,6 +102,7 @@ proc new*(T: type Eth2DiscoveryProtocol,
102102
else:
103103
Opt.none(IpAddress)
104104

105+
# TODO: what to do with enrQuicPort?
105106
newProtocol(pk, enrIp, enrTcpPort, enrUdpPort, enrFields, bootstrapEnrs,
106107
bindPort = config.udpPort, bindIp = listenAddress,
107108
enrAutoUpdate = config.enrAutoUpdate, rng = rng)

beacon_chain/networking/eth2_network.nim

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,7 +1836,7 @@ proc new(T: type Eth2Node,
18361836
enrForkId: ENRForkID, discoveryForkId: ENRForkID,
18371837
forkDigests: ref ForkDigests, getBeaconTime: GetBeaconTimeFn,
18381838
switch: Switch, pubsub: GossipSub,
1839-
ip: Opt[IpAddress], tcpPort, udpPort: Opt[Port],
1839+
ip: Opt[IpAddress], tcpPort, quicPort, udpPort: Opt[Port],
18401840
privKey: keys.PrivateKey, discovery: bool,
18411841
directPeers: DirectPeers, announcedAddresses: openArray[MultiAddress],
18421842
rng: ref HmacDrbgContext): T =
@@ -1871,7 +1871,7 @@ proc new(T: type Eth2Node,
18711871
forkDigests: forkDigests,
18721872
getBeaconTime: getBeaconTime,
18731873
discovery: Eth2DiscoveryProtocol.new(
1874-
config, ip, tcpPort, udpPort, privKey,
1874+
config, ip, tcpPort, quicPort, udpPort, privKey,
18751875
{
18761876
enrForkIdField: SSZ.encode(enrForkId),
18771877
enrAttestationSubnetsField: SSZ.encode(metadata.attnets)
@@ -2231,6 +2231,9 @@ func asEthKey*(key: PrivateKey): keys.PrivateKey =
22312231
template tcpEndPoint(address, port): auto =
22322232
MultiAddress.init(address, tcpProtocol, port)
22332233

2234+
template quicEndPoint(address, port): auto =
2235+
MultiAddress.init(address, udpProtocol, port) & MultiAddress.init("/quic-v1")
2236+
22342237
func initNetKeys(privKey: PrivateKey): NetKeyPair =
22352238
let pubKey = privKey.getPublicKey().expect("working public key from random")
22362239
NetKeyPair(seckey: privKey, pubkey: pubKey)
@@ -2327,7 +2330,7 @@ func gossipId(
23272330
proc newBeaconSwitch(
23282331
config: BeaconNodeConf | LightClientConf,
23292332
seckey: PrivateKey,
2330-
address: MultiAddress,
2333+
addresses: seq[MultiAddress],
23312334
rng: ref HmacDrbgContext,
23322335
): Result[Switch, string] =
23332336
let service: Service = WildcardAddressResolverService.new()
@@ -2337,12 +2340,13 @@ proc newBeaconSwitch(
23372340
try:
23382341
ok sb
23392342
.withPrivateKey(seckey)
2340-
.withAddress(address)
2343+
.withAddresses(addresses)
23412344
.withRng(rng)
23422345
.withNoise()
2343-
.withMplex(chronos.minutes(5), chronos.minutes(5))
2346+
.withQuicTransport()
23442347
.withMaxConnections(config.maxPeers)
23452348
.withAgentVersion(config.agentString)
2349+
.withMplex(chronos.minutes(5), chronos.minutes(5))
23462350
.withTcpTransport({ServerFlags.ReuseAddr})
23472351
.withServices(@[service])
23482352
.build()
@@ -2369,9 +2373,11 @@ proc createEth2Node*(
23692373
else:
23702374
getAutoAddress(Port(0)).toIpAddress()
23712375

2376+
# TODO: setupAddress only receives a single tcpPort and udpPort,
2377+
# We need a way to pass the quic port
23722378
(extIp, extTcpPort, extUdpPort) =
23732379
setupAddress(config.nat, listenAddress, config.tcpPort,
2374-
config.udpPort, clientId)
2380+
config.quicPort, config.udpPort, clientId)
23752381

23762382
directPeers = block:
23772383
var res: DirectPeers
@@ -2396,10 +2402,16 @@ proc createEth2Node*(
23962402
info "Adding privileged direct peer", peerId, address
23972403
res
23982404

2399-
hostAddress = tcpEndPoint(listenAddress, config.tcpPort)
2400-
announcedAddresses =
2401-
if extIp.isNone() or extTcpPort.isNone(): @[]
2402-
else: @[tcpEndPoint(extIp.get(), extTcpPort.get())]
2405+
hostAddress = @[
2406+
quicEndpoint(listenAddress, config.quicUdpPort),
2407+
tcpEndPoint(listenAddress, config.tcpPort)
2408+
]
2409+
2410+
var announcedAddresses = newSeq[Multiaddr]()
2411+
if not(extIp.isNone() or extTcpPort.isNone()):
2412+
announcedAddresses.add tcpEndPoint(extIp.get(), extTcpPort.get())
2413+
if not(extIp.isNone() or extQuicUdpPort.isNone()):
2414+
announcedAddresses.add quicEndpoint(extIp.get(), extQuicUdpPort.get())
24032415

24042416
debug "Initializing networking", hostAddress,
24052417
network_public_key = netKeys.pubkey,

beacon_chain/spec/network.nim

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ const
4343
defaultEth2TcpPort* = 9000
4444
defaultEth2TcpPortDesc* = $defaultEth2TcpPort
4545

46+
defaultEth2QuicPort* = 9001
47+
defaultEth2QuicPortDesc* = $defaultEth2QuicPort
48+
4649
# This is not part of the spec! But it's port which Lighthouse uses
4750
defaultEth2RestPort* = 5052
4851
defaultEth2RestPortDesc* = $defaultEth2RestPort

0 commit comments

Comments
 (0)