diff --git a/beacon_chain/networking/eth2_network.nim b/beacon_chain/networking/eth2_network.nim index 4e3d6e593..f017bf52b 100644 --- a/beacon_chain/networking/eth2_network.nim +++ b/beacon_chain/networking/eth2_network.nim @@ -69,7 +69,7 @@ type protocols: seq[ProtocolInfo] ## Protocols managed by the DSL and mounted on the switch protocolStates*: seq[RootRef] - metadata*: altair.MetaData + metadata*: eip7594.MetaData connectTimeout*: chronos.Duration seenThreshold*: chronos.Duration connQueue: AsyncQueue[PeerAddr] @@ -106,7 +106,7 @@ type lastReqTime*: Moment connections*: int enr*: Opt[enr.Record] - metadata*: Opt[altair.MetaData] + metadata*: Opt[eip7594.MetaData] failedMetadataRequests: int lastMetadataTime*: Moment direction*: PeerType @@ -1795,7 +1795,7 @@ proc new(T: type Eth2Node, let connectTimeout = chronos.seconds(10) seenThreshold = chronos.seconds(10) - type MetaData = altair.MetaData # Weird bug without this.. + type MetaData = eip7594.MetaData # Weird bug without this.. # Versions up to v22.3.0 would write an empty `MetaData` to #`data-dir/node-metadata.json` which would then be reloaded on startup - don't @@ -2077,12 +2077,32 @@ proc p2pProtocolBackendImpl*(p: P2PProtocol): Backend = import ./peer_protocol export peer_protocol +proc metadataV2ToV3(metadata: altair.MetaData): eip7594.MetaData = + eip7594.MetaData( + seq_number: metadata.seq_number, + attnets: metadata.attnets, + syncnets: metadata.syncnets) + +proc getMetadata_vx(node: Eth2Node, peer: Peer): + Future[NetRes[eip7594.MetaData]] + {.async: (raises: [CancelledError]).} = + let + res = + if node.cfg.EIP7594_FORK_EPOCH != FAR_FUTURE_EPOCH: + # Directly fetch eip7594 metadata if available + await getMetadata_v3(peer) + else: + let metadata_v2_result = await getMetadata_v2(peer) + metadata_v2_result.map(proc (altairData: altair.MetaData): eip7594.MetaData {.closure.} = + metadataV2ToV3(altairData) + ) + return res + proc updatePeerMetadata(node: Eth2Node, peerId: PeerId) {.async: (raises: [CancelledError]).} = trace "updating peer metadata", peerId - let peer = node.getPeer(peerId) - newMetadataRes = await peer.getMetadata_v2() + newMetadataRes = await node.getMetadata_vx(peer) newMetadata = newMetadataRes.valueOr: debug "Failed to retrieve metadata from peer!", peerId, error = newMetadataRes.error peer.failedMetadataRequests.inc() diff --git a/beacon_chain/networking/peer_protocol.nim b/beacon_chain/networking/peer_protocol.nim index ff47b17dd..59efc8709 100644 --- a/beacon_chain/networking/peer_protocol.nim +++ b/beacon_chain/networking/peer_protocol.nim @@ -177,6 +177,14 @@ p2pProtocol PeerSync(version = 1, proc getMetadata_v2(peer: Peer): altair.MetaData {.libp2pProtocol("metadata", 2).} = + let altair_metadata = altair.MetaData( + seq_number: peer.network.metadata.seq_number, + attnets: peer.network.metadata.attnets, + syncnets: peer.network.metadata.syncnets) + altair_metadata + + proc getMetadata_v3(peer: Peer): eip7594.MetaData + {.libp2pProtocol("metadata", 3).} = peer.network.metadata proc goodbye(peer: Peer, reason: uint64) diff --git a/beacon_chain/spec/datatypes/eip7594.nim b/beacon_chain/spec/datatypes/eip7594.nim index 8ba81174b..317bb2c18 100644 --- a/beacon_chain/spec/datatypes/eip7594.nim +++ b/beacon_chain/spec/datatypes/eip7594.nim @@ -9,7 +9,7 @@ import std/[sequtils], - "."/[base, deneb], + "."/[altair, base, deneb], kzg4844, stew/[byteutils] @@ -79,6 +79,13 @@ type CscBits* = BitArray[DATA_COLUMN_SIDECAR_SUBNET_COUNT] + # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.4/specs/_features/eip7594/p2p-interface.md#metadata + MetaData* = object + seq_number*: uint64 + attnets*: AttnetBits + syncnets*: SyncnetBits + custody_subnet_count*: uint64 + # func serializeDataColumn(data_column: DataColumn): auto = # var counter = 0 # var serd : array[MAX_BLOB_COMMITMENTS_PER_BLOCK * BYTES_PER_CELL, byte] diff --git a/beacon_chain/spec/presets.nim b/beacon_chain/spec/presets.nim index 482f9501d..d8785505e 100644 --- a/beacon_chain/spec/presets.nim +++ b/beacon_chain/spec/presets.nim @@ -60,6 +60,8 @@ type CAPELLA_FORK_EPOCH*: Epoch DENEB_FORK_VERSION*: Version DENEB_FORK_EPOCH*: Epoch + EIP7594_FORK_VERSION*: Version + EIP7594_FORK_EPOCH*: Epoch ELECTRA_FORK_VERSION*: Version ELECTRA_FORK_EPOCH*: Epoch