Update constants/presets for consistency with consensus-specs v1.4.0 (#5284)
This commit is contained in:
parent
9efd26c2e9
commit
6cd8f3ba55
|
@ -661,7 +661,7 @@ proc sendErrorResponse(peer: Peer,
|
||||||
|
|
||||||
proc sendNotificationMsg(peer: Peer, protocolId: string, requestBytes: Bytes) {.async.} =
|
proc sendNotificationMsg(peer: Peer, protocolId: string, requestBytes: Bytes) {.async.} =
|
||||||
var
|
var
|
||||||
deadline = sleepAsync RESP_TIMEOUT
|
deadline = sleepAsync RESP_TIMEOUT_DUR
|
||||||
streamFut = peer.network.openStream(peer, protocolId)
|
streamFut = peer.network.openStream(peer, protocolId)
|
||||||
|
|
||||||
await streamFut or deadline
|
await streamFut or deadline
|
||||||
|
@ -798,17 +798,18 @@ proc uncompressFramedStream(conn: Connection,
|
||||||
|
|
||||||
func chunkMaxSize[T](): uint32 =
|
func chunkMaxSize[T](): uint32 =
|
||||||
# compiler error on (T: type) syntax...
|
# compiler error on (T: type) syntax...
|
||||||
|
static: doAssert MAX_CHUNK_SIZE < high(uint32).uint64
|
||||||
when T is ForkySignedBeaconBlock:
|
when T is ForkySignedBeaconBlock:
|
||||||
when T is phase0.SignedBeaconBlock or T is altair.SignedBeaconBlock or
|
when T is phase0.SignedBeaconBlock or T is altair.SignedBeaconBlock or
|
||||||
T is bellatrix.SignedBeaconBlock or T is capella.SignedBeaconBlock or
|
T is bellatrix.SignedBeaconBlock or T is capella.SignedBeaconBlock or
|
||||||
T is deneb.SignedBeaconBlock:
|
T is deneb.SignedBeaconBlock:
|
||||||
MAX_CHUNK_SIZE_BELLATRIX
|
MAX_CHUNK_SIZE.uint32
|
||||||
else:
|
else:
|
||||||
{.fatal: "what's the chunk size here?".}
|
{.fatal: "what's the chunk size here?".}
|
||||||
elif isFixedSize(T):
|
elif isFixedSize(T):
|
||||||
uint32 fixedPortionSize(T)
|
uint32 fixedPortionSize(T)
|
||||||
else:
|
else:
|
||||||
MAX_CHUNK_SIZE_BELLATRIX
|
MAX_CHUNK_SIZE.uint32
|
||||||
|
|
||||||
from ../spec/datatypes/capella import SignedBeaconBlock
|
from ../spec/datatypes/capella import SignedBeaconBlock
|
||||||
from ../spec/datatypes/deneb import SignedBeaconBlock
|
from ../spec/datatypes/deneb import SignedBeaconBlock
|
||||||
|
@ -816,10 +817,10 @@ from ../spec/datatypes/deneb import SignedBeaconBlock
|
||||||
template gossipMaxSize(T: untyped): uint32 =
|
template gossipMaxSize(T: untyped): uint32 =
|
||||||
const maxSize = static:
|
const maxSize = static:
|
||||||
when isFixedSize(T):
|
when isFixedSize(T):
|
||||||
fixedPortionSize(T)
|
fixedPortionSize(T).uint32
|
||||||
elif T is bellatrix.SignedBeaconBlock or T is capella.SignedBeaconBlock or
|
elif T is bellatrix.SignedBeaconBlock or T is capella.SignedBeaconBlock or
|
||||||
T is deneb.SignedBeaconBlock:
|
T is deneb.SignedBeaconBlock:
|
||||||
GOSSIP_MAX_SIZE_BELLATRIX
|
GOSSIP_MAX_SIZE
|
||||||
# TODO https://github.com/status-im/nim-ssz-serialization/issues/20 for
|
# TODO https://github.com/status-im/nim-ssz-serialization/issues/20 for
|
||||||
# Attestation, AttesterSlashing, and SignedAggregateAndProof, which all
|
# Attestation, AttesterSlashing, and SignedAggregateAndProof, which all
|
||||||
# have lists bounded at MAX_VALIDATORS_PER_COMMITTEE (2048) items, thus
|
# have lists bounded at MAX_VALIDATORS_PER_COMMITTEE (2048) items, thus
|
||||||
|
@ -827,10 +828,10 @@ template gossipMaxSize(T: untyped): uint32 =
|
||||||
elif T is Attestation or T is AttesterSlashing or
|
elif T is Attestation or T is AttesterSlashing or
|
||||||
T is SignedAggregateAndProof or T is phase0.SignedBeaconBlock or
|
T is SignedAggregateAndProof or T is phase0.SignedBeaconBlock or
|
||||||
T is altair.SignedBeaconBlock or T is SomeForkyLightClientObject:
|
T is altair.SignedBeaconBlock or T is SomeForkyLightClientObject:
|
||||||
GOSSIP_MAX_SIZE_BELLATRIX
|
GOSSIP_MAX_SIZE
|
||||||
else:
|
else:
|
||||||
{.fatal: "unknown type " & name(T).}
|
{.fatal: "unknown type " & name(T).}
|
||||||
static: doAssert maxSize <= GOSSIP_MAX_SIZE_BELLATRIX
|
static: doAssert maxSize <= GOSSIP_MAX_SIZE
|
||||||
maxSize.uint32
|
maxSize.uint32
|
||||||
|
|
||||||
proc readChunkPayload*(conn: Connection, peer: Peer,
|
proc readChunkPayload*(conn: Connection, peer: Peer,
|
||||||
|
@ -1110,7 +1111,7 @@ proc handleIncomingStream(network: Eth2Node,
|
||||||
nbc_reqresp_messages_received.inc(1, [shortProtocolId(protocolId)])
|
nbc_reqresp_messages_received.inc(1, [shortProtocolId(protocolId)])
|
||||||
|
|
||||||
# TODO(zah) The TTFB timeout is not implemented in LibP2P streams back-end
|
# TODO(zah) The TTFB timeout is not implemented in LibP2P streams back-end
|
||||||
let deadline = sleepAsync RESP_TIMEOUT
|
let deadline = sleepAsync RESP_TIMEOUT_DUR
|
||||||
|
|
||||||
const isEmptyMsg = when MsgRec is object:
|
const isEmptyMsg = when MsgRec is object:
|
||||||
# We need nested `when` statements here, because Nim doesn't properly
|
# We need nested `when` statements here, because Nim doesn't properly
|
||||||
|
@ -2336,7 +2337,7 @@ proc createEth2Node*(rng: ref HmacDrbgContext,
|
||||||
try:
|
try:
|
||||||
# This doesn't have to be a tight bound, just enough to avoid denial of
|
# This doesn't have to be a tight bound, just enough to avoid denial of
|
||||||
# service attacks.
|
# service attacks.
|
||||||
let decoded = snappy.decode(m.data, GOSSIP_MAX_SIZE_BELLATRIX)
|
let decoded = snappy.decode(m.data, static(GOSSIP_MAX_SIZE.uint32))
|
||||||
ok(gossipId(decoded, phase0Prefix, topic))
|
ok(gossipId(decoded, phase0Prefix, topic))
|
||||||
except CatchableError:
|
except CatchableError:
|
||||||
err(ValidationResult.Reject)
|
err(ValidationResult.Reject)
|
||||||
|
@ -2393,7 +2394,7 @@ proc createEth2Node*(rng: ref HmacDrbgContext,
|
||||||
sign = false,
|
sign = false,
|
||||||
verifySignature = false,
|
verifySignature = false,
|
||||||
anonymize = true,
|
anonymize = true,
|
||||||
maxMessageSize = GOSSIP_MAX_SIZE_BELLATRIX,
|
maxMessageSize = static(GOSSIP_MAX_SIZE.int),
|
||||||
parameters = params)
|
parameters = params)
|
||||||
|
|
||||||
switch.mount(pubsub)
|
switch.mount(pubsub)
|
||||||
|
@ -2504,7 +2505,7 @@ proc gossipEncode(msg: auto): seq[byte] =
|
||||||
let uncompressed = SSZ.encode(msg)
|
let uncompressed = SSZ.encode(msg)
|
||||||
# This function only for messages we create. A message this large amounts to
|
# This function only for messages we create. A message this large amounts to
|
||||||
# an internal logic error.
|
# an internal logic error.
|
||||||
doAssert uncompressed.len <= GOSSIP_MAX_SIZE_BELLATRIX
|
doAssert uncompressed.lenu64 <= GOSSIP_MAX_SIZE
|
||||||
|
|
||||||
snappy.encode(uncompressed)
|
snappy.encode(uncompressed)
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ const
|
||||||
NODE_ID_BITS* = 256
|
NODE_ID_BITS* = 256
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.1/specs/phase0/p2p-interface.md#configuration
|
# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.1/specs/phase0/p2p-interface.md#configuration
|
||||||
EPOCHS_PER_SUBNET_SUBSCRIPTION* = 256
|
EPOCHS_PER_SUBNET_SUBSCRIPTION* = 256'u64
|
||||||
SUBNETS_PER_NODE* = 2'u64
|
SUBNETS_PER_NODE* = 2'u64
|
||||||
ATTESTATION_SUBNET_COUNT*: uint64 = 64
|
ATTESTATION_SUBNET_COUNT*: uint64 = 64
|
||||||
ATTESTATION_SUBNET_EXTRA_BITS* = 0
|
ATTESTATION_SUBNET_EXTRA_BITS* = 0
|
||||||
|
@ -65,3 +65,11 @@ const
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.1/specs/deneb/p2p-interface.md#configuration
|
# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.1/specs/deneb/p2p-interface.md#configuration
|
||||||
BLOB_SIDECAR_SUBNET_COUNT*: uint64 = 6
|
BLOB_SIDECAR_SUBNET_COUNT*: uint64 = 6
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/phase0/p2p-interface.md#configuration
|
||||||
|
MAX_REQUEST_BLOCKS* = 1024'u64
|
||||||
|
RESP_TIMEOUT* = 10
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/bellatrix/p2p-interface.md#configuration
|
||||||
|
GOSSIP_MAX_SIZE* = 10'u64 * 1024 * 1024 # bytes
|
||||||
|
MAX_CHUNK_SIZE* = 10'u64 * 1024 * 1024 # bytes
|
||||||
|
|
|
@ -23,17 +23,12 @@ const
|
||||||
topicAggregateAndProofsSuffix* = "beacon_aggregate_and_proof/ssz_snappy"
|
topicAggregateAndProofsSuffix* = "beacon_aggregate_and_proof/ssz_snappy"
|
||||||
topicBlsToExecutionChangeSuffix* = "bls_to_execution_change/ssz_snappy"
|
topicBlsToExecutionChangeSuffix* = "bls_to_execution_change/ssz_snappy"
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/phase0/p2p-interface.md#configuration
|
# The spec now includes this as a bare integer as `RESP_TIMEOUT`
|
||||||
MAX_REQUEST_BLOCKS* = 1024
|
RESP_TIMEOUT_DUR* = RESP_TIMEOUT.seconds
|
||||||
RESP_TIMEOUT* = 10.seconds
|
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.1/specs/altair/light-client/p2p-interface.md#configuration
|
# https://github.com/ethereum/consensus-specs/blob/v1.4.0-beta.1/specs/altair/light-client/p2p-interface.md#configuration
|
||||||
MAX_REQUEST_LIGHT_CLIENT_UPDATES* = 128
|
MAX_REQUEST_LIGHT_CLIENT_UPDATES* = 128
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/bellatrix/p2p-interface.md#configuration
|
|
||||||
GOSSIP_MAX_SIZE_BELLATRIX* = 10 * 1024 * 1024 # bytes
|
|
||||||
MAX_CHUNK_SIZE_BELLATRIX* = 10 * 1024 * 1024 # bytes
|
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/deneb/p2p-interface.md#configuration
|
# https://github.com/ethereum/consensus-specs/blob/v1.3.0/specs/deneb/p2p-interface.md#configuration
|
||||||
MAX_REQUEST_BLOCKS_DENEB* = 128 # TODO Make use of in request code
|
MAX_REQUEST_BLOCKS_DENEB* = 128 # TODO Make use of in request code
|
||||||
MAX_REQUEST_BLOB_SIDECARS* = MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK
|
MAX_REQUEST_BLOB_SIDECARS* = MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK
|
||||||
|
|
|
@ -576,6 +576,12 @@ proc readRuntimeConfig*(
|
||||||
checkCompatibility DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF
|
checkCompatibility DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF
|
||||||
checkCompatibility DOMAIN_CONTRIBUTION_AND_PROOF
|
checkCompatibility DOMAIN_CONTRIBUTION_AND_PROOF
|
||||||
|
|
||||||
|
checkCompatibility GOSSIP_MAX_SIZE
|
||||||
|
checkCompatibility MAX_REQUEST_BLOCKS
|
||||||
|
checkCompatibility EPOCHS_PER_SUBNET_SUBSCRIPTION
|
||||||
|
checkCompatibility MAX_CHUNK_SIZE
|
||||||
|
checkCompatibility SUBNETS_PER_NODE
|
||||||
|
|
||||||
# Never pervasively implemented, still under discussion
|
# Never pervasively implemented, still under discussion
|
||||||
checkCompatibility TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH
|
checkCompatibility TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH
|
||||||
|
|
||||||
|
|
|
@ -483,7 +483,8 @@ func compute_subscribed_subnet(node_id: UInt256, epoch: Epoch, index: uint64):
|
||||||
let
|
let
|
||||||
node_id_prefix = truncate(
|
node_id_prefix = truncate(
|
||||||
node_id shr (NODE_ID_BITS - ATTESTATION_SUBNET_PREFIX_BITS), uint64)
|
node_id shr (NODE_ID_BITS - ATTESTATION_SUBNET_PREFIX_BITS), uint64)
|
||||||
node_offset = truncate(node_id mod EPOCHS_PER_SUBNET_SUBSCRIPTION, uint64)
|
node_offset = truncate(
|
||||||
|
node_id mod static(EPOCHS_PER_SUBNET_SUBSCRIPTION.u256), uint64)
|
||||||
permutation_seed = eth2digest(uint_to_bytes(
|
permutation_seed = eth2digest(uint_to_bytes(
|
||||||
uint64((epoch + node_offset) div EPOCHS_PER_SUBNET_SUBSCRIPTION)))
|
uint64((epoch + node_offset) div EPOCHS_PER_SUBNET_SUBSCRIPTION)))
|
||||||
permutated_prefix = compute_shuffled_index(
|
permutated_prefix = compute_shuffled_index(
|
||||||
|
|
|
@ -76,7 +76,8 @@ type
|
||||||
stamp*: chronos.Moment
|
stamp*: chronos.Moment
|
||||||
slots*: uint64
|
slots*: uint64
|
||||||
|
|
||||||
BeaconBlocksRes = NetRes[List[ref ForkedSignedBeaconBlock, MAX_REQUEST_BLOCKS]]
|
BeaconBlocksRes =
|
||||||
|
NetRes[List[ref ForkedSignedBeaconBlock, Limit MAX_REQUEST_BLOCKS]]
|
||||||
BlobSidecarsRes = NetRes[List[ref BlobSidecar, Limit(MAX_REQUEST_BLOB_SIDECARS)]]
|
BlobSidecarsRes = NetRes[List[ref BlobSidecar, Limit(MAX_REQUEST_BLOB_SIDECARS)]]
|
||||||
|
|
||||||
proc now*(sm: typedesc[SyncMoment], slots: uint64): SyncMoment {.inline.} =
|
proc now*(sm: typedesc[SyncMoment], slots: uint64): SyncMoment {.inline.} =
|
||||||
|
@ -389,7 +390,7 @@ proc syncStep[A, B](man: SyncManager[A, B], index: int, peer: A) {.async.} =
|
||||||
queue_input_slot = man.queue.inpSlot,
|
queue_input_slot = man.queue.inpSlot,
|
||||||
queue_output_slot = man.queue.outSlot,
|
queue_output_slot = man.queue.outSlot,
|
||||||
queue_last_slot = man.queue.finalSlot, direction = man.direction
|
queue_last_slot = man.queue.finalSlot, direction = man.direction
|
||||||
await sleepAsync(RESP_TIMEOUT)
|
await sleepAsync(RESP_TIMEOUT_DUR)
|
||||||
return
|
return
|
||||||
|
|
||||||
debug "Creating new request for peer", wall_clock_slot = wallSlot,
|
debug "Creating new request for peer", wall_clock_slot = wallSlot,
|
||||||
|
|
|
@ -261,7 +261,7 @@ p2pProtocol BeaconSync(version = 1,
|
||||||
# given incoming flag
|
# given incoming flag
|
||||||
let
|
let
|
||||||
ourStatus = peer.networkState.getCurrentStatus()
|
ourStatus = peer.networkState.getCurrentStatus()
|
||||||
theirStatus = await peer.status(ourStatus, timeout = RESP_TIMEOUT)
|
theirStatus = await peer.status(ourStatus, timeout = RESP_TIMEOUT_DUR)
|
||||||
|
|
||||||
if theirStatus.isOk:
|
if theirStatus.isOk:
|
||||||
discard await peer.handleStatus(peer.networkState, theirStatus.get())
|
discard await peer.handleStatus(peer.networkState, theirStatus.get())
|
||||||
|
@ -298,7 +298,7 @@ p2pProtocol BeaconSync(version = 1,
|
||||||
reqCount: uint64,
|
reqCount: uint64,
|
||||||
reqStep: uint64,
|
reqStep: uint64,
|
||||||
response: MultipleChunksResponse[
|
response: MultipleChunksResponse[
|
||||||
ref ForkedSignedBeaconBlock, MAX_REQUEST_BLOCKS])
|
ref ForkedSignedBeaconBlock, Limit MAX_REQUEST_BLOCKS])
|
||||||
{.async, libp2pProtocol("beacon_blocks_by_range", 2).} =
|
{.async, libp2pProtocol("beacon_blocks_by_range", 2).} =
|
||||||
# TODO Semantically, this request should return a non-ref, but doing so
|
# TODO Semantically, this request should return a non-ref, but doing so
|
||||||
# runs into extreme inefficiency due to the compiler introducing
|
# runs into extreme inefficiency due to the compiler introducing
|
||||||
|
@ -320,7 +320,7 @@ p2pProtocol BeaconSync(version = 1,
|
||||||
if reqCount == 0 or reqStep == 0:
|
if reqCount == 0 or reqStep == 0:
|
||||||
raise newException(InvalidInputsError, "Empty range requested")
|
raise newException(InvalidInputsError, "Empty range requested")
|
||||||
|
|
||||||
var blocks: array[MAX_REQUEST_BLOCKS, BlockId]
|
var blocks: array[MAX_REQUEST_BLOCKS.int, BlockId]
|
||||||
let
|
let
|
||||||
dag = peer.networkState.dag
|
dag = peer.networkState.dag
|
||||||
# Limit number of blocks in response
|
# Limit number of blocks in response
|
||||||
|
@ -367,7 +367,7 @@ p2pProtocol BeaconSync(version = 1,
|
||||||
# spec constant MAX_REQUEST_BLOCKS is enforced:
|
# spec constant MAX_REQUEST_BLOCKS is enforced:
|
||||||
blockRoots: BlockRootsList,
|
blockRoots: BlockRootsList,
|
||||||
response: MultipleChunksResponse[
|
response: MultipleChunksResponse[
|
||||||
ref ForkedSignedBeaconBlock, MAX_REQUEST_BLOCKS])
|
ref ForkedSignedBeaconBlock, Limit MAX_REQUEST_BLOCKS])
|
||||||
{.async, libp2pProtocol("beacon_blocks_by_root", 2).} =
|
{.async, libp2pProtocol("beacon_blocks_by_root", 2).} =
|
||||||
# TODO Semantically, this request should return a non-ref, but doing so
|
# TODO Semantically, this request should return a non-ref, but doing so
|
||||||
# runs into extreme inefficiency due to the compiler introducing
|
# runs into extreme inefficiency due to the compiler introducing
|
||||||
|
@ -710,7 +710,7 @@ proc updateStatus*(peer: Peer): Future[bool] {.async.} =
|
||||||
nstate = peer.networkState(BeaconSync)
|
nstate = peer.networkState(BeaconSync)
|
||||||
ourStatus = getCurrentStatus(nstate)
|
ourStatus = getCurrentStatus(nstate)
|
||||||
|
|
||||||
let theirFut = awaitne peer.status(ourStatus, timeout = RESP_TIMEOUT)
|
let theirFut = awaitne peer.status(ourStatus, timeout = RESP_TIMEOUT_DUR)
|
||||||
if theirFut.failed():
|
if theirFut.failed():
|
||||||
return false
|
return false
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue