simplify usage of get custody columns

This commit is contained in:
Agnish Ghosh 2024-09-09 01:58:21 +05:30
parent cf0cf815b6
commit 7d04142e4a
5 changed files with 50 additions and 78 deletions

View File

@ -26,33 +26,33 @@ type
CellBytes = array[eip7594.CELLS_PER_EXT_BLOB, Cell] CellBytes = array[eip7594.CELLS_PER_EXT_BLOB, Cell]
ProofBytes = array[eip7594.CELLS_PER_EXT_BLOB, KzgProof] ProofBytes = array[eip7594.CELLS_PER_EXT_BLOB, KzgProof]
proc sortedColumnIndices*(columnsPerSubnet: ColumnIndex, subnetIds: HashSet[uint64]): seq[ColumnIndex] = proc sortedColumnIndices*(columnsPerSubnet: ColumnIndex,
subnetIds: HashSet[uint64]):
seq[ColumnIndex] =
var res: seq[ColumnIndex] = @[] var res: seq[ColumnIndex] = @[]
for i in 0 ..< columnsPerSubnet: for i in 0'u64 ..< columnsPerSubnet:
for subnetId in subnetIds: for subnetId in subnetIds:
let index = DATA_COLUMN_SIDECAR_SUBNET_COUNT * i + subnetId let index = DATA_COLUMN_SIDECAR_SUBNET_COUNT * i + subnetId
res.add(ColumnIndex(index)) res.add(ColumnIndex(index))
res.sort() res.sort
res res
proc sortedColumnIndexList*(columnsPerSubnet: ColumnIndex, proc sortedColumnIndexList*(columnsPerSubnet: ColumnIndex,
subnetIds: HashSet[uint64]): subnetIds: HashSet[uint64]):
List[ColumnIndex, NUMBER_OF_COLUMNS] = List[ColumnIndex, NUMBER_OF_COLUMNS] =
var var
res: seq[ColumnIndex] res: seq[ColumnIndex]
list: List[ColumnIndex, NUMBER_OF_COLUMNS] for i in 0'u64 ..< columnsPerSubnet:
for i in 0 ..< columnsPerSubnet:
for subnetId in subnetIds: for subnetId in subnetIds:
let index = DATA_COLUMN_SIDECAR_SUBNET_COUNT * i + subnetId let index = DATA_COLUMN_SIDECAR_SUBNET_COUNT * i + subnetId
res.add(ColumnIndex(index)) res.add(ColumnIndex(index))
res.sort() res.sort()
for elem in res: let list = List[ColumnIndex, NUMBER_OF_COLUMNS].init(res)
discard list.add(ColumnIndex(elem))
list list
proc get_custody_column_subnet*(node_id: NodeId, proc get_custody_column_subnets*(node_id: NodeId,
custody_subnet_count: uint64): custody_subnet_count: uint64):
Result[HashSet[uint64], cstring] = Result[HashSet[uint64], cstring] =
# Decouples the custody subnet computation part from # Decouples the custody subnet computation part from
# `get_custody_columns`, in order to later use this subnet list # `get_custody_columns`, in order to later use this subnet list
@ -65,55 +65,55 @@ proc get_custody_column_subnet*(node_id: NodeId,
subnet_ids: HashSet[uint64] subnet_ids: HashSet[uint64]
current_id = node_id current_id = node_id
while subnet_ids.len < int(custody_subnet_count): while subnet_ids.lenu64 < custody_subnet_count:
var var
current_id_bytes: array[32, byte]
hashed_bytes: array[8, byte] hashed_bytes: array[8, byte]
current_id_bytes = current_id.toBytesBE()
current_id_bytes.reverse()
let let
current_id_bytes = current_id.toBytesLE()
hashed_current_id = eth2digest(current_id_bytes) hashed_current_id = eth2digest(current_id_bytes)
hashed_bytes[0..7] = hashed_current_id.data.toOpenArray(0,7) hashed_bytes[0..7] = hashed_current_id.data.toOpenArray(0,7)
var subnet_id = bytes_to_uint64(hashed_bytes) mod let subnet_id = bytes_to_uint64(hashed_bytes) mod
DATA_COLUMN_SIDECAR_SUBNET_COUNT DATA_COLUMN_SIDECAR_SUBNET_COUNT
if subnet_id notin subnet_ids: subnet_ids.incl(subnet_id)
subnet_ids.incl(subnet_id)
if current_id == UInt256.high.NodeId: if current_id == UInt256.high.NodeId:
# Overflow prevention # Overflow prevention
current_id = NodeId(StUint[256].zero) current_id = NodeId(StUint[256].zero)
current_id += NodeId(StUint[256].one) current_id += NodeId(StUint[256].one)
ok(subnet_ids) ok(subnet_ids)
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/_features/eip7594/das-core.md#get_custody_columns
# https://github.com/ethereum/consensus-specs/blob/5f48840f4d768bf0e0a8156a3ed06ec333589007/specs/_features/eip7594/das-core.md#get_custody_columns
proc get_custody_columns*(node_id: NodeId, proc get_custody_columns*(node_id: NodeId,
custody_subnet_count: uint64): custody_subnet_count: uint64):
Result[seq[ColumnIndex], cstring] = seq[ColumnIndex] =
let
let subnet_ids = get_custody_column_subnet(node_id, custody_subnet_count).get subnet_ids =
get_custody_column_subnets(node_id, custody_subnet_count).get
const
columns_per_subnet =
NUMBER_OF_COLUMNS div DATA_COLUMN_SIDECAR_SUBNET_COUNT
sortedColumnIndices(ColumnIndex(columns_per_subnet), subnet_ids)
# columns_per_subnet = NUMBER_OF_COLUMNS // DATA_COLUMN_SIDECAR_SUBNET_COUNT
let columns_per_subnet = NUMBER_OF_COLUMNS div DATA_COLUMN_SIDECAR_SUBNET_COUNT
ok(sortedColumnIndices(ColumnIndex(columns_per_subnet), subnet_ids))
proc get_custody_column_list*(node_id: NodeId, proc get_custody_column_list*(node_id: NodeId,
custody_subnet_count: uint64): custody_subnet_count: uint64):
Result[List[ColumnIndex, NUMBER_OF_COLUMNS], cstring] = List[ColumnIndex, NUMBER_OF_COLUMNS] =
let subnet_ids = get_custody_column_subnet(node_id, custody_subnet_count).get
# columns_per_subnet = NUMBER_OF_COLUMNS // DATA_COLUMN_SIDECAR_SUBNET_COUNT # Not in spec in the exact format, but it is useful in sorting custody columns
let columns_per_subnet = NUMBER_OF_COLUMNS div DATA_COLUMN_SIDECAR_SUBNET_COUNT # before sending, data_column_sidecars_by_range requests
let
subnet_ids =
get_custody_column_subnets(node_id, custody_subnet_count).get
const
columns_per_subnet =
NUMBER_OF_COLUMNS div DATA_COLUMN_SIDECAR_SUBNET_COUNT
ok(sortedColumnIndexList(ColumnIndex(columns_per_subnet), subnet_ids)) sortedColumnIndexList(ColumnIndex(columns_per_subnet), subnet_ids)
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/_features/eip7594/das-core.md#compute_extended_matrix # https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.3/specs/_features/eip7594/das-core.md#compute_extended_matrix
proc compute_extended_matrix* (blobs: seq[KzgBlob]): Result[seq[MatrixEntry], cstring] = proc compute_extended_matrix* (blobs: seq[KzgBlob]): Result[seq[MatrixEntry], cstring] =

View File

@ -282,7 +282,7 @@ proc constructValidCustodyPeers(rman: RequestManager,
let let
localNodeId = rman.network.nodeId localNodeId = rman.network.nodeId
localCustodyColumns = localCustodyColumns =
localNodeId.get_custody_columns(localCustodySubnetCount).get localNodeId.get_custody_columns(localCustodySubnetCount)
var validPeers: seq[Peer] var validPeers: seq[Peer]
@ -296,7 +296,7 @@ proc constructValidCustodyPeers(rman: RequestManager,
let let
remoteNodeId = getNodeIdFromPeer(peer) remoteNodeId = getNodeIdFromPeer(peer)
remoteCustodyColumns = remoteCustodyColumns =
remoteNodeId.get_custody_columns(remoteCustodySubnetCount).get remoteNodeId.get_custody_columns(remoteCustodySubnetCount)
# If the remote peer custodies less columns than # If the remote peer custodies less columns than
# our local node # our local node

View File

@ -213,7 +213,7 @@ proc routeSignedBeaconBlock*(
custody_columns = router[].network.nodeId.get_custody_columns(metadata) custody_columns = router[].network.nodeId.get_custody_columns(metadata)
for dc in data_columns: for dc in data_columns:
if dc.index in custody_columns.get: if dc.index in custody_columns:
let dataColumnRefs = Opt.some(dataColumnsOpt[].get().mapIt(newClone(it))) let dataColumnRefs = Opt.some(dataColumnsOpt[].get().mapIt(newClone(it)))
let added = await router[].blockProcessor[].addBlock( let added = await router[].blockProcessor[].addBlock(

View File

@ -11,35 +11,14 @@
import import
std/[json, streams], std/[json, streams],
yaml, yaml,
kzg4844/kzg_ex, kzg4844/[kzg, kzg_abi],
stint, stint,
chronicles,
eth/p2p/discoveryv5/[node], eth/p2p/discoveryv5/[node],
stew/[byteutils, results],
../../beacon_chain/spec/eip7594_helpers, ../../beacon_chain/spec/eip7594_helpers,
../testutil, ../testutil,
./fixtures_utils, ./os_ops ./fixtures_utils, ./os_ops
from std/sequtils import anyIt, mapIt, toSeq from std/sequtils import mapIt
from std/strutils import rsplit
func toUInt64(s: SomeInteger): Opt[uint64] =
if s < 0:
return Opt.none uint64
try:
Opt.some uint64(s)
except ValueError:
Opt.none uint64
func fromHex[N: static int](s: string): Opt[array[N, byte]] =
if s.len != 2*(N+1):
# 0x prefix
return Opt.none array[N, byte]
try:
Opt.some fromHex(array[N, byte], s)
except ValueError:
Opt.none array[N, byte]
proc runGetCustodyColumns(suiteName, path: string) = proc runGetCustodyColumns(suiteName, path: string) =
let relativePathComponent = path.relativeTestPathComponent() let relativePathComponent = path.relativeTestPathComponent()
@ -47,7 +26,7 @@ proc runGetCustodyColumns(suiteName, path: string) =
type TestMetaYaml = object type TestMetaYaml = object
node_id: string node_id: string
custody_subnet_count: uint64 custody_subnet_count: uint64
result: Option[seq[uint64]] result: seq[uint64]
let let
meta = block: meta = block:
var s = openFileStream(path/"meta.yaml") var s = openFileStream(path/"meta.yaml")
@ -56,20 +35,13 @@ proc runGetCustodyColumns(suiteName, path: string) =
yaml.load(s, res) yaml.load(s, res)
res res
node_id = UInt256.fromDecimal(meta.node_id) node_id = UInt256.fromDecimal(meta.node_id)
custody_subnet_count = toUInt64(meta.custody_subnet_count) custody_subnet_count = meta.custody_subnet_count
reslt = (meta.result.get).mapIt(uint64(it)) reslt = (meta.result).mapIt(it)
if custody_subnet_count.isNone: let columns = get_custody_columns(node_id, custody_subnet_count)
check meta.result.isNone
else: for i in 0..<columns.lenu64:
let columns = get_custody_columns(node_id, custody_subnet_count.get) check columns[i] == reslt[i]
if columns.isErr:
check meta.result.isNone
else:
var count = 0
for column in columns.get:
check column == uint64(reslt[count])
count = count + 1
suite "EF - EIP7594 - Networking" & preset(): suite "EF - EIP7594 - Networking" & preset():
const presetPath = SszTestsDir/const_preset const presetPath = SszTestsDir/const_preset