add: metadata-v3 for custody subnet count (#6486)

* init: add metadatav3, save progress

* fix import issues

* fix spec version

* fix: metadata_v2 to return altair.MetaData

* update metata function backward compatible now
This commit is contained in:
Agnish Ghosh 2024-08-12 21:27:37 +05:30 committed by GitHub
parent 9be615dff9
commit 1ebba1fac4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 43 additions and 6 deletions

View File

@ -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()

View File

@ -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)

View File

@ -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]

View File

@ -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