Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add: metadata-v3 for custody subnet count #6486

Merged
merged 5 commits into from
Aug 12, 2024
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
30 changes: 25 additions & 5 deletions beacon_chain/networking/eth2_network.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down
8 changes: 8 additions & 0 deletions beacon_chain/networking/peer_protocol.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 8 additions & 1 deletion beacon_chain/spec/datatypes/eip7594.nim
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import
std/[sequtils],
"."/[base, deneb],
"."/[altair, base, deneb],
kzg4844,
stew/[byteutils]

Expand Down Expand Up @@ -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]
Expand Down
2 changes: 2 additions & 0 deletions beacon_chain/spec/presets.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Loading