extend REST config with more spec constants (#2962)

So far, the REST config response did not include all spec constants.
The spec for `/eth/v1/config/spec` defines that the response should
include constants for all hard forks known by the beacon node. This
patch extends the corresponding response to include more constants.
This commit is contained in:
Etan Kissling 2021-11-02 19:23:31 +01:00 committed by GitHub
parent 233d756518
commit 1943258c66
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 238 additions and 106 deletions

View File

@ -10,12 +10,12 @@ import
stew/[results, base10], stew/[results, base10],
chronicles, chronicles,
nimcrypto/utils as ncrutils, nimcrypto/utils as ncrutils,
./rest_utils,
../beacon_node, ../networking/eth2_network, ../beacon_node, ../networking/eth2_network,
../consensus_object_pools/[blockchain_dag, exit_pool, spec_cache], ../consensus_object_pools/[blockchain_dag, exit_pool, spec_cache],
../validators/validator_duties, ../validators/validator_duties,
../spec/[eth2_merkleization, forks, network], ../spec/[eth2_merkleization, forks, network],
../spec/datatypes/[phase0, altair], ../spec/datatypes/[phase0, altair]
./rest_utils
export rest_utils export rest_utils

View File

@ -22,30 +22,19 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) =
cachedConfigSpec = cachedConfigSpec =
RestApiResponse.prepareJsonResponse( RestApiResponse.prepareJsonResponse(
( (
# https://github.com/ethereum/consensus-specs/blob/v1.0.1/configs/mainnet/phase0.yaml
CONFIG_NAME: CONFIG_NAME:
const_preset, const_preset,
PRESET_BASE:
node.dag.cfg.PRESET_BASE, # https://github.com/ethereum/consensus-specs/blob/v1.1.3/presets/mainnet/phase0.yaml
ALTAIR_FORK_EPOCH:
Base10.toString(uint64(node.dag.cfg.ALTAIR_FORK_EPOCH)),
ALTAIR_FORK_VERSION:
"0x" & $node.dag.cfg.ALTAIR_FORK_VERSION,
MAX_COMMITTEES_PER_SLOT: MAX_COMMITTEES_PER_SLOT:
Base10.toString(MAX_COMMITTEES_PER_SLOT), Base10.toString(MAX_COMMITTEES_PER_SLOT),
TARGET_COMMITTEE_SIZE: TARGET_COMMITTEE_SIZE:
Base10.toString(TARGET_COMMITTEE_SIZE), Base10.toString(TARGET_COMMITTEE_SIZE),
MAX_VALIDATORS_PER_COMMITTEE: MAX_VALIDATORS_PER_COMMITTEE:
Base10.toString(MAX_VALIDATORS_PER_COMMITTEE), Base10.toString(MAX_VALIDATORS_PER_COMMITTEE),
MIN_PER_EPOCH_CHURN_LIMIT:
Base10.toString(node.dag.cfg.MIN_PER_EPOCH_CHURN_LIMIT),
CHURN_LIMIT_QUOTIENT:
Base10.toString(node.dag.cfg.CHURN_LIMIT_QUOTIENT),
SHUFFLE_ROUND_COUNT: SHUFFLE_ROUND_COUNT:
Base10.toString(SHUFFLE_ROUND_COUNT), Base10.toString(SHUFFLE_ROUND_COUNT),
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT:
Base10.toString(node.dag.cfg.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT),
MIN_GENESIS_TIME:
Base10.toString(node.dag.cfg.MIN_GENESIS_TIME),
HYSTERESIS_QUOTIENT: HYSTERESIS_QUOTIENT:
Base10.toString(HYSTERESIS_QUOTIENT), Base10.toString(HYSTERESIS_QUOTIENT),
HYSTERESIS_DOWNWARD_MULTIPLIER: HYSTERESIS_DOWNWARD_MULTIPLIER:
@ -54,40 +43,12 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) =
Base10.toString(HYSTERESIS_UPWARD_MULTIPLIER), Base10.toString(HYSTERESIS_UPWARD_MULTIPLIER),
SAFE_SLOTS_TO_UPDATE_JUSTIFIED: SAFE_SLOTS_TO_UPDATE_JUSTIFIED:
Base10.toString(SAFE_SLOTS_TO_UPDATE_JUSTIFIED), Base10.toString(SAFE_SLOTS_TO_UPDATE_JUSTIFIED),
ETH1_FOLLOW_DISTANCE:
Base10.toString(node.dag.cfg.ETH1_FOLLOW_DISTANCE),
TARGET_AGGREGATORS_PER_COMMITTEE:
Base10.toString(TARGET_AGGREGATORS_PER_COMMITTEE),
TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE:
Base10.toString(uint64(TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE)),
RANDOM_SUBNETS_PER_VALIDATOR:
Base10.toString(RANDOM_SUBNETS_PER_VALIDATOR),
EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION:
Base10.toString(EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION),
SECONDS_PER_ETH1_BLOCK:
Base10.toString(node.dag.cfg.SECONDS_PER_ETH1_BLOCK),
DEPOSIT_CHAIN_ID:
Base10.toString(uint64(node.dag.cfg.DEPOSIT_CHAIN_ID)),
DEPOSIT_NETWORK_ID:
Base10.toString(uint64(node.dag.cfg.DEPOSIT_NETWORK_ID)),
DEPOSIT_CONTRACT_ADDRESS:
$node.dag.cfg.DEPOSIT_CONTRACT_ADDRESS,
MIN_DEPOSIT_AMOUNT: MIN_DEPOSIT_AMOUNT:
Base10.toString(MIN_DEPOSIT_AMOUNT), Base10.toString(MIN_DEPOSIT_AMOUNT),
MAX_EFFECTIVE_BALANCE: MAX_EFFECTIVE_BALANCE:
Base10.toString(MAX_EFFECTIVE_BALANCE), Base10.toString(MAX_EFFECTIVE_BALANCE),
EJECTION_BALANCE:
Base10.toString(node.dag.cfg.EJECTION_BALANCE),
EFFECTIVE_BALANCE_INCREMENT: EFFECTIVE_BALANCE_INCREMENT:
Base10.toString(EFFECTIVE_BALANCE_INCREMENT), Base10.toString(EFFECTIVE_BALANCE_INCREMENT),
GENESIS_FORK_VERSION:
"0x" & $node.dag.cfg.GENESIS_FORK_VERSION,
BLS_WITHDRAWAL_PREFIX:
"0x" & ncrutils.toHex([BLS_WITHDRAWAL_PREFIX]),
GENESIS_DELAY:
Base10.toString(node.dag.cfg.GENESIS_DELAY),
SECONDS_PER_SLOT:
Base10.toString(uint64(SECONDS_PER_SLOT)),
MIN_ATTESTATION_INCLUSION_DELAY: MIN_ATTESTATION_INCLUSION_DELAY:
Base10.toString(MIN_ATTESTATION_INCLUSION_DELAY), Base10.toString(MIN_ATTESTATION_INCLUSION_DELAY),
SLOTS_PER_EPOCH: SLOTS_PER_EPOCH:
@ -100,22 +61,12 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) =
Base10.toString(EPOCHS_PER_ETH1_VOTING_PERIOD), Base10.toString(EPOCHS_PER_ETH1_VOTING_PERIOD),
SLOTS_PER_HISTORICAL_ROOT: SLOTS_PER_HISTORICAL_ROOT:
Base10.toString(SLOTS_PER_HISTORICAL_ROOT), Base10.toString(SLOTS_PER_HISTORICAL_ROOT),
SYNC_COMMITTEE_SIZE:
Base10.toString(uint64(SYNC_COMMITTEE_SIZE)),
SYNC_COMMITTEE_SUBNET_COUNT:
Base10.toString(uint64(SYNC_COMMITTEE_SUBNET_COUNT)),
MIN_VALIDATOR_WITHDRAWABILITY_DELAY:
Base10.toString(node.dag.cfg.MIN_VALIDATOR_WITHDRAWABILITY_DELAY),
SHARD_COMMITTEE_PERIOD:
Base10.toString(node.dag.cfg.SHARD_COMMITTEE_PERIOD),
MIN_EPOCHS_TO_INACTIVITY_PENALTY: MIN_EPOCHS_TO_INACTIVITY_PENALTY:
Base10.toString(MIN_EPOCHS_TO_INACTIVITY_PENALTY), Base10.toString(MIN_EPOCHS_TO_INACTIVITY_PENALTY),
EPOCHS_PER_HISTORICAL_VECTOR: EPOCHS_PER_HISTORICAL_VECTOR:
Base10.toString(EPOCHS_PER_HISTORICAL_VECTOR), Base10.toString(EPOCHS_PER_HISTORICAL_VECTOR),
EPOCHS_PER_SLASHINGS_VECTOR: EPOCHS_PER_SLASHINGS_VECTOR:
Base10.toString(EPOCHS_PER_SLASHINGS_VECTOR), Base10.toString(EPOCHS_PER_SLASHINGS_VECTOR),
EPOCHS_PER_SYNC_COMMITTEE_PERIOD:
Base10.toString(EPOCHS_PER_SYNC_COMMITTEE_PERIOD),
HISTORICAL_ROOTS_LIMIT: HISTORICAL_ROOTS_LIMIT:
Base10.toString(HISTORICAL_ROOTS_LIMIT), Base10.toString(HISTORICAL_ROOTS_LIMIT),
VALIDATOR_REGISTRY_LIMIT: VALIDATOR_REGISTRY_LIMIT:
@ -128,22 +79,10 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) =
Base10.toString(PROPOSER_REWARD_QUOTIENT), Base10.toString(PROPOSER_REWARD_QUOTIENT),
INACTIVITY_PENALTY_QUOTIENT: INACTIVITY_PENALTY_QUOTIENT:
Base10.toString(INACTIVITY_PENALTY_QUOTIENT), Base10.toString(INACTIVITY_PENALTY_QUOTIENT),
INACTIVITY_PENALTY_QUOTIENT_ALTAIR:
Base10.toString(INACTIVITY_PENALTY_QUOTIENT_ALTAIR),
INACTIVITY_SCORE_BIAS:
Base10.toString(node.dag.cfg.INACTIVITY_SCORE_BIAS),
INACTIVITY_SCORE_RECOVERY_RATE:
Base10.toString(node.dag.cfg.INACTIVITY_SCORE_RECOVERY_RATE),
MIN_SLASHING_PENALTY_QUOTIENT: MIN_SLASHING_PENALTY_QUOTIENT:
Base10.toString(MIN_SLASHING_PENALTY_QUOTIENT), Base10.toString(MIN_SLASHING_PENALTY_QUOTIENT),
MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR:
Base10.toString(MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR),
MIN_SYNC_COMMITTEE_PARTICIPANTS:
Base10.toString(uint64(MIN_SYNC_COMMITTEE_PARTICIPANTS)),
PROPORTIONAL_SLASHING_MULTIPLIER: PROPORTIONAL_SLASHING_MULTIPLIER:
Base10.toString(PROPORTIONAL_SLASHING_MULTIPLIER), Base10.toString(PROPORTIONAL_SLASHING_MULTIPLIER),
PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR:
Base10.toString(PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR),
MAX_PROPOSER_SLASHINGS: MAX_PROPOSER_SLASHINGS:
Base10.toString(MAX_PROPOSER_SLASHINGS), Base10.toString(MAX_PROPOSER_SLASHINGS),
MAX_ATTESTER_SLASHINGS: MAX_ATTESTER_SLASHINGS:
@ -154,6 +93,87 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) =
Base10.toString(MAX_DEPOSITS), Base10.toString(MAX_DEPOSITS),
MAX_VOLUNTARY_EXITS: MAX_VOLUNTARY_EXITS:
Base10.toString(MAX_VOLUNTARY_EXITS), Base10.toString(MAX_VOLUNTARY_EXITS),
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/presets/mainnet/altair.yaml
INACTIVITY_PENALTY_QUOTIENT_ALTAIR:
Base10.toString(INACTIVITY_PENALTY_QUOTIENT_ALTAIR),
MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR:
Base10.toString(MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR),
PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR:
Base10.toString(PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR),
SYNC_COMMITTEE_SIZE:
Base10.toString(uint64(SYNC_COMMITTEE_SIZE)),
EPOCHS_PER_SYNC_COMMITTEE_PERIOD:
Base10.toString(EPOCHS_PER_SYNC_COMMITTEE_PERIOD),
MIN_SYNC_COMMITTEE_PARTICIPANTS:
Base10.toString(uint64(MIN_SYNC_COMMITTEE_PARTICIPANTS)),
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/configs/mainnet.yaml
PRESET_BASE:
node.dag.cfg.PRESET_BASE,
TERMINAL_TOTAL_DIFFICULTY:
toString(node.dag.cfg.TERMINAL_TOTAL_DIFFICULTY),
TERMINAL_BLOCK_HASH:
$node.dag.cfg.TERMINAL_BLOCK_HASH,
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT:
Base10.toString(node.dag.cfg.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT),
MIN_GENESIS_TIME:
Base10.toString(node.dag.cfg.MIN_GENESIS_TIME),
GENESIS_FORK_VERSION:
"0x" & $node.dag.cfg.GENESIS_FORK_VERSION,
GENESIS_DELAY:
Base10.toString(node.dag.cfg.GENESIS_DELAY),
ALTAIR_FORK_VERSION:
"0x" & $node.dag.cfg.ALTAIR_FORK_VERSION,
ALTAIR_FORK_EPOCH:
Base10.toString(uint64(node.dag.cfg.ALTAIR_FORK_EPOCH)),
MERGE_FORK_VERSION:
"0x" & $node.dag.cfg.MERGE_FORK_VERSION,
MERGE_FORK_EPOCH:
Base10.toString(uint64(node.dag.cfg.MERGE_FORK_EPOCH)),
SHARDING_FORK_VERSION:
"0x" & $node.dag.cfg.SHARDING_FORK_VERSION,
SHARDING_FORK_EPOCH:
Base10.toString(uint64(node.dag.cfg.SHARDING_FORK_EPOCH)),
SECONDS_PER_SLOT:
Base10.toString(SECONDS_PER_SLOT),
SECONDS_PER_ETH1_BLOCK:
Base10.toString(node.dag.cfg.SECONDS_PER_ETH1_BLOCK),
MIN_VALIDATOR_WITHDRAWABILITY_DELAY:
Base10.toString(node.dag.cfg.MIN_VALIDATOR_WITHDRAWABILITY_DELAY),
SHARD_COMMITTEE_PERIOD:
Base10.toString(node.dag.cfg.SHARD_COMMITTEE_PERIOD),
ETH1_FOLLOW_DISTANCE:
Base10.toString(node.dag.cfg.ETH1_FOLLOW_DISTANCE),
INACTIVITY_SCORE_BIAS:
Base10.toString(node.dag.cfg.INACTIVITY_SCORE_BIAS),
INACTIVITY_SCORE_RECOVERY_RATE:
Base10.toString(node.dag.cfg.INACTIVITY_SCORE_RECOVERY_RATE),
EJECTION_BALANCE:
Base10.toString(node.dag.cfg.EJECTION_BALANCE),
MIN_PER_EPOCH_CHURN_LIMIT:
Base10.toString(node.dag.cfg.MIN_PER_EPOCH_CHURN_LIMIT),
CHURN_LIMIT_QUOTIENT:
Base10.toString(node.dag.cfg.CHURN_LIMIT_QUOTIENT),
DEPOSIT_CHAIN_ID:
Base10.toString(node.dag.cfg.DEPOSIT_CHAIN_ID),
DEPOSIT_NETWORK_ID:
Base10.toString(node.dag.cfg.DEPOSIT_NETWORK_ID),
DEPOSIT_CONTRACT_ADDRESS:
$node.dag.cfg.DEPOSIT_CONTRACT_ADDRESS,
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/specs/phase0/beacon-chain.md#constants
# GENESIS_SLOT
# GENESIS_EPOCH
# FAR_FUTURE_EPOCH
# BASE_REWARDS_PER_EPOCH
# DEPOSIT_CONTRACT_TREE_DEPTH
# JUSTIFICATION_BITS_LENGTH
# ENDIANNESS
BLS_WITHDRAWAL_PREFIX:
"0x" & ncrutils.toHex([BLS_WITHDRAWAL_PREFIX]),
ETH1_ADDRESS_WITHDRAWAL_PREFIX:
"0x" & ncrutils.toHex([ETH1_ADDRESS_WITHDRAWAL_PREFIX]),
DOMAIN_BEACON_PROPOSER: DOMAIN_BEACON_PROPOSER:
"0x" & ncrutils.toHex( "0x" & ncrutils.toHex(
uint32(DOMAIN_BEACON_PROPOSER).toBytesLE()), uint32(DOMAIN_BEACON_PROPOSER).toBytesLE()),
@ -175,15 +195,52 @@ proc installConfigApiHandlers*(router: var RestRouter, node: BeaconNode) =
DOMAIN_AGGREGATE_AND_PROOF: DOMAIN_AGGREGATE_AND_PROOF:
"0x" & ncrutils.toHex( "0x" & ncrutils.toHex(
uint32(DOMAIN_AGGREGATE_AND_PROOF).toBytesLE()), uint32(DOMAIN_AGGREGATE_AND_PROOF).toBytesLE()),
DOMAIN_CONTRIBUTION_AND_PROOF:
"0x" & ncrutils.toHex( # https://github.com/ethereum/consensus-specs/blob/v1.1.3/specs/altair/beacon-chain.md#constants
uint32(DOMAIN_CONTRIBUTION_AND_PROOF).toBytesLE()), TIMELY_SOURCE_FLAG_INDEX:
"0x" & ncrutils.toHex([byte(TIMELY_SOURCE_FLAG_INDEX)]),
TIMELY_TARGET_FLAG_INDEX:
"0x" & ncrutils.toHex([byte(TIMELY_TARGET_FLAG_INDEX)]),
TIMELY_HEAD_FLAG_INDEX:
"0x" & ncrutils.toHex([byte(TIMELY_HEAD_FLAG_INDEX)]),
TIMELY_SOURCE_WEIGHT:
Base10.toString(uint64(TIMELY_SOURCE_WEIGHT)),
TIMELY_TARGET_WEIGHT:
Base10.toString(uint64(TIMELY_TARGET_WEIGHT)),
TIMELY_HEAD_WEIGHT:
Base10.toString(uint64(TIMELY_HEAD_WEIGHT)),
SYNC_REWARD_WEIGHT:
Base10.toString(uint64(SYNC_REWARD_WEIGHT)),
PROPOSER_WEIGHT:
Base10.toString(uint64(PROPOSER_WEIGHT)),
WEIGHT_DENOMINATOR:
Base10.toString(uint64(WEIGHT_DENOMINATOR)),
DOMAIN_SYNC_COMMITTEE: DOMAIN_SYNC_COMMITTEE:
"0x" & ncrutils.toHex( "0x" & ncrutils.toHex(
uint32(DOMAIN_SYNC_COMMITTEE).toBytesLE()), uint32(DOMAIN_SYNC_COMMITTEE).toBytesLE()),
DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF: DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF:
"0x" & ncrutils.toHex( "0x" & ncrutils.toHex(
uint32(DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF).toBytesLE()) uint32(DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF).toBytesLE()),
DOMAIN_CONTRIBUTION_AND_PROOF:
"0x" & ncrutils.toHex(
uint32(DOMAIN_CONTRIBUTION_AND_PROOF).toBytesLE()),
# PARTICIPATION_FLAG_WEIGHTS
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/specs/phase0/validator.md#constants
TARGET_AGGREGATORS_PER_COMMITTEE:
Base10.toString(TARGET_AGGREGATORS_PER_COMMITTEE),
RANDOM_SUBNETS_PER_VALIDATOR:
Base10.toString(RANDOM_SUBNETS_PER_VALIDATOR),
EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION:
Base10.toString(EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION),
ATTESTATION_SUBNET_COUNT:
Base10.toString(uint64(ATTESTATION_SUBNET_COUNT)),
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/specs/altair/validator.md#constants
TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE:
Base10.toString(uint64(TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE)),
SYNC_COMMITTEE_SUBNET_COUNT:
Base10.toString(uint64(SYNC_COMMITTEE_SUBNET_COUNT)),
) )
) )
cachedDepositContract = cachedDepositContract =

View File

@ -31,6 +31,9 @@ proc installConfigApiHandlers*(rpcServer: RpcServer, node: BeaconNode) {.
rpcServer.rpc("get_v1_config_spec") do () -> JsonNode: rpcServer.rpc("get_v1_config_spec") do () -> JsonNode:
return %*{ return %*{
# Note: This is intentionally only returning v1.0 config values.
# Please use the REST API /eth/v1/config/spec to retrieve the full config.
# https://github.com/ethereum/consensus-specs/blob/v1.0.1/configs/mainnet/phase0.yaml
"MAX_COMMITTEES_PER_SLOT": $MAX_COMMITTEES_PER_SLOT, "MAX_COMMITTEES_PER_SLOT": $MAX_COMMITTEES_PER_SLOT,
"TARGET_COMMITTEE_SIZE": $TARGET_COMMITTEE_SIZE, "TARGET_COMMITTEE_SIZE": $TARGET_COMMITTEE_SIZE,
"MAX_VALIDATORS_PER_COMMITTEE": $MAX_VALIDATORS_PER_COMMITTEE, "MAX_VALIDATORS_PER_COMMITTEE": $MAX_VALIDATORS_PER_COMMITTEE,

View File

@ -17,6 +17,9 @@ export
results, peerid, common, serialization, json_serialization, options, net, sets, results, peerid, common, serialization, json_serialization, options, net, sets,
eth2_ssz_serialization, rest_types eth2_ssz_serialization, rest_types
from web3/ethtypes import BlockHash
export ethtypes.BlockHash
Json.createFlavor RestJson Json.createFlavor RestJson
const const
@ -330,6 +333,20 @@ proc readValue*(reader: var JsonReader[RestJson], value: var uint64) {.
else: else:
reader.raiseUnexpectedValue($res.error()) reader.raiseUnexpectedValue($res.error())
## UInt256
proc writeValue*(w: var JsonWriter[RestJson], value: UInt256) {.
raises: [IOError, Defect].} =
writeValue(w, toString(value))
proc readValue*(reader: var JsonReader[RestJson], value: var UInt256) {.
raises: [IOError, SerializationError, Defect].} =
let svalue = reader.readValue(string)
try:
value = parse(svalue, UInt256, 10)
except ValueError:
raiseUnexpectedValue(reader,
"UInt256 value should be a valid decimal string")
## byte ## byte
proc writeValue*(w: var JsonWriter[RestJson], value: byte) {. proc writeValue*(w: var JsonWriter[RestJson], value: byte) {.
raises: [IOError, Defect].} = raises: [IOError, Defect].} =
@ -521,6 +538,19 @@ proc writeValue*(writer: var JsonWriter[RestJson], value: BitArray) {.
raises: [IOError, Defect].} = raises: [IOError, Defect].} =
writeValue(writer, hexOriginal(value.bytes)) writeValue(writer, hexOriginal(value.bytes))
## BlockHash
proc readValue*(reader: var JsonReader[RestJson], value: var BlockHash) {.
raises: [IOError, SerializationError, Defect].} =
try:
hexToByteArray(reader.readValue(string), distinctBase(value))
except ValueError:
raiseUnexpectedValue(reader,
"BlockHash value should be a valid hex string")
proc writeValue*(writer: var JsonWriter[RestJson], value: BlockHash) {.
raises: [IOError, Defect].} =
writeValue(writer, hexOriginal(distinctBase(value)))
## Eth2Digest ## Eth2Digest
proc readValue*(reader: var JsonReader[RestJson], value: var Eth2Digest) {. proc readValue*(reader: var JsonReader[RestJson], value: var Eth2Digest) {.
raises: [IOError, SerializationError, Defect].} = raises: [IOError, SerializationError, Defect].} =

View File

@ -15,7 +15,7 @@
import import
std/[json, typetraits], std/[json, typetraits],
stew/base10, stew/base10, web3/ethtypes,
".."/forks, ".."/forks,
".."/datatypes/[phase0, altair] ".."/datatypes/[phase0, altair]
@ -229,72 +229,90 @@ type
metadata*: RestMetadata metadata*: RestMetadata
RestSpec* = object RestSpec* = object
# https://github.com/ethereum/consensus-specs/blob/v1.0.1/configs/mainnet/phase0.yaml
CONFIG_NAME*: string CONFIG_NAME*: string
PRESET_BASE*: string
ALTAIR_FORK_EPOCH*: Epoch # https://github.com/ethereum/consensus-specs/blob/v1.1.3/presets/mainnet/phase0.yaml
ALTAIR_FORK_VERSION*: Version
MAX_COMMITTEES_PER_SLOT*: uint64 MAX_COMMITTEES_PER_SLOT*: uint64
TARGET_COMMITTEE_SIZE*: uint64 TARGET_COMMITTEE_SIZE*: uint64
MAX_VALIDATORS_PER_COMMITTEE*: uint64 MAX_VALIDATORS_PER_COMMITTEE*: uint64
MIN_PER_EPOCH_CHURN_LIMIT*: uint64
CHURN_LIMIT_QUOTIENT*: uint64
SHUFFLE_ROUND_COUNT*: uint64 SHUFFLE_ROUND_COUNT*: uint64
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT*: uint64
MIN_GENESIS_TIME*: uint64
HYSTERESIS_QUOTIENT*: uint64 HYSTERESIS_QUOTIENT*: uint64
HYSTERESIS_DOWNWARD_MULTIPLIER*: uint64 HYSTERESIS_DOWNWARD_MULTIPLIER*: uint64
HYSTERESIS_UPWARD_MULTIPLIER*: uint64 HYSTERESIS_UPWARD_MULTIPLIER*: uint64
SAFE_SLOTS_TO_UPDATE_JUSTIFIED*: uint64 SAFE_SLOTS_TO_UPDATE_JUSTIFIED*: uint64
ETH1_FOLLOW_DISTANCE*: uint64
TARGET_AGGREGATORS_PER_COMMITTEE*: uint64
TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE*: uint64
RANDOM_SUBNETS_PER_VALIDATOR*: uint64
EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION*: uint64
SECONDS_PER_ETH1_BLOCK*: uint64
DEPOSIT_CHAIN_ID*: uint64
DEPOSIT_NETWORK_ID*: uint64
DEPOSIT_CONTRACT_ADDRESS*: Eth1Address
MIN_DEPOSIT_AMOUNT*: uint64 MIN_DEPOSIT_AMOUNT*: uint64
MAX_EFFECTIVE_BALANCE*: uint64 MAX_EFFECTIVE_BALANCE*: uint64
EJECTION_BALANCE*: uint64
EFFECTIVE_BALANCE_INCREMENT*: uint64 EFFECTIVE_BALANCE_INCREMENT*: uint64
GENESIS_FORK_VERSION*: Version
BLS_WITHDRAWAL_PREFIX*: byte
GENESIS_DELAY*: uint64
SECONDS_PER_SLOT*: uint64
MIN_ATTESTATION_INCLUSION_DELAY*: uint64 MIN_ATTESTATION_INCLUSION_DELAY*: uint64
SLOTS_PER_EPOCH*: uint64 SLOTS_PER_EPOCH*: uint64
MIN_SEED_LOOKAHEAD*: uint64 MIN_SEED_LOOKAHEAD*: uint64
MAX_SEED_LOOKAHEAD*: uint64 MAX_SEED_LOOKAHEAD*: uint64
EPOCHS_PER_ETH1_VOTING_PERIOD*: uint64 EPOCHS_PER_ETH1_VOTING_PERIOD*: uint64
SLOTS_PER_HISTORICAL_ROOT*: uint64 SLOTS_PER_HISTORICAL_ROOT*: uint64
SYNC_COMMITTEE_SIZE*: uint64
SYNC_COMMITTEE_SUBNET_COUNT*: uint64
MIN_VALIDATOR_WITHDRAWABILITY_DELAY*: uint64
SHARD_COMMITTEE_PERIOD*: uint64
MIN_EPOCHS_TO_INACTIVITY_PENALTY*: uint64 MIN_EPOCHS_TO_INACTIVITY_PENALTY*: uint64
EPOCHS_PER_HISTORICAL_VECTOR*: uint64 EPOCHS_PER_HISTORICAL_VECTOR*: uint64
EPOCHS_PER_SLASHINGS_VECTOR*: uint64 EPOCHS_PER_SLASHINGS_VECTOR*: uint64
EPOCHS_PER_SYNC_COMMITTEE_PERIOD*: uint64
HISTORICAL_ROOTS_LIMIT*: uint64 HISTORICAL_ROOTS_LIMIT*: uint64
VALIDATOR_REGISTRY_LIMIT*: uint64 VALIDATOR_REGISTRY_LIMIT*: uint64
BASE_REWARD_FACTOR*: uint64 BASE_REWARD_FACTOR*: uint64
WHISTLEBLOWER_REWARD_QUOTIENT*: uint64 WHISTLEBLOWER_REWARD_QUOTIENT*: uint64
PROPOSER_REWARD_QUOTIENT*: uint64 PROPOSER_REWARD_QUOTIENT*: uint64
INACTIVITY_PENALTY_QUOTIENT*: uint64 INACTIVITY_PENALTY_QUOTIENT*: uint64
INACTIVITY_PENALTY_QUOTIENT_ALTAIR*: uint64
INACTIVITY_SCORE_BIAS*: uint64
INACTIVITY_SCORE_RECOVERY_RATE*: uint64
MIN_SLASHING_PENALTY_QUOTIENT*: uint64 MIN_SLASHING_PENALTY_QUOTIENT*: uint64
MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR*: uint64
MIN_SYNC_COMMITTEE_PARTICIPANTS*: uint64
PROPORTIONAL_SLASHING_MULTIPLIER*: uint64 PROPORTIONAL_SLASHING_MULTIPLIER*: uint64
PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR*: uint64
MAX_PROPOSER_SLASHINGS*: uint64 MAX_PROPOSER_SLASHINGS*: uint64
MAX_ATTESTER_SLASHINGS*: uint64 MAX_ATTESTER_SLASHINGS*: uint64
MAX_ATTESTATIONS*: uint64 MAX_ATTESTATIONS*: uint64
MAX_DEPOSITS*: uint64 MAX_DEPOSITS*: uint64
MAX_VOLUNTARY_EXITS*: uint64 MAX_VOLUNTARY_EXITS*: uint64
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/presets/mainnet/altair.yaml
INACTIVITY_PENALTY_QUOTIENT_ALTAIR*: uint64
MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR*: uint64
PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR*: uint64
SYNC_COMMITTEE_SIZE*: uint64
EPOCHS_PER_SYNC_COMMITTEE_PERIOD*: uint64
MIN_SYNC_COMMITTEE_PARTICIPANTS*: uint64
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/configs/mainnet.yaml
PRESET_BASE*: string
TERMINAL_TOTAL_DIFFICULTY*: UInt256
TERMINAL_BLOCK_HASH*: BlockHash
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT*: uint64
MIN_GENESIS_TIME*: uint64
GENESIS_FORK_VERSION*: Version
GENESIS_DELAY*: uint64
ALTAIR_FORK_VERSION*: Version
ALTAIR_FORK_EPOCH*: uint64
MERGE_FORK_VERSION*: Version
MERGE_FORK_EPOCH*: uint64
SHARDING_FORK_VERSION*: Version
SHARDING_FORK_EPOCH*: uint64
SECONDS_PER_SLOT*: uint64
SECONDS_PER_ETH1_BLOCK*: uint64
MIN_VALIDATOR_WITHDRAWABILITY_DELAY*: uint64
SHARD_COMMITTEE_PERIOD*: uint64
ETH1_FOLLOW_DISTANCE*: uint64
INACTIVITY_SCORE_BIAS*: uint64
INACTIVITY_SCORE_RECOVERY_RATE*: uint64
EJECTION_BALANCE*: uint64
MIN_PER_EPOCH_CHURN_LIMIT*: uint64
CHURN_LIMIT_QUOTIENT*: uint64
DEPOSIT_CHAIN_ID*: uint64
DEPOSIT_NETWORK_ID*: uint64
DEPOSIT_CONTRACT_ADDRESS*: Eth1Address
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/specs/phase0/beacon-chain.md#constants
# GENESIS_SLOT
# GENESIS_EPOCH
# FAR_FUTURE_EPOCH
# BASE_REWARDS_PER_EPOCH
# DEPOSIT_CONTRACT_TREE_DEPTH
# JUSTIFICATION_BITS_LENGTH
# ENDIANNESS
BLS_WITHDRAWAL_PREFIX*: byte
ETH1_ADDRESS_WITHDRAWAL_PREFIX*: byte
DOMAIN_BEACON_PROPOSER*: DomainType DOMAIN_BEACON_PROPOSER*: DomainType
DOMAIN_BEACON_ATTESTER*: DomainType DOMAIN_BEACON_ATTESTER*: DomainType
DOMAIN_RANDAO*: DomainType DOMAIN_RANDAO*: DomainType
@ -302,9 +320,31 @@ type
DOMAIN_VOLUNTARY_EXIT*: DomainType DOMAIN_VOLUNTARY_EXIT*: DomainType
DOMAIN_SELECTION_PROOF*: DomainType DOMAIN_SELECTION_PROOF*: DomainType
DOMAIN_AGGREGATE_AND_PROOF*: DomainType DOMAIN_AGGREGATE_AND_PROOF*: DomainType
DOMAIN_CONTRIBUTION_AND_PROOF*: DomainType
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/specs/altair/beacon-chain.md#constants
TIMELY_SOURCE_FLAG_INDEX*: byte
TIMELY_TARGET_FLAG_INDEX*: byte
TIMELY_HEAD_FLAG_INDEX*: byte
TIMELY_SOURCE_WEIGHT*: uint64
TIMELY_TARGET_WEIGHT*: uint64
TIMELY_HEAD_WEIGHT*: uint64
SYNC_REWARD_WEIGHT*: uint64
PROPOSER_WEIGHT*: uint64
WEIGHT_DENOMINATOR*: uint64
DOMAIN_SYNC_COMMITTEE*: DomainType DOMAIN_SYNC_COMMITTEE*: DomainType
DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF*: DomainType DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF*: DomainType
DOMAIN_CONTRIBUTION_AND_PROOF*: DomainType
# PARTICIPATION_FLAG_WEIGHTS
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/specs/phase0/validator.md#constants
TARGET_AGGREGATORS_PER_COMMITTEE*: uint64
RANDOM_SUBNETS_PER_VALIDATOR*: uint64
EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION*: uint64
ATTESTATION_SUBNET_COUNT*: uint64
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/specs/altair/validator.md#constants
TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE*: uint64
SYNC_COMMITTEE_SUBNET_COUNT*: uint64
# The `RestSpec` is a dynamic dictionary that includes version-specific spec # The `RestSpec` is a dynamic dictionary that includes version-specific spec
# constants. New versions may introduce new constants, and remove old ones. # constants. New versions may introduce new constants, and remove old ones.

View File

@ -15,7 +15,9 @@ export
toBytesBE toBytesBE
const const
# https://github.com/ethereum/consensus-specs/blob/v1.1.3/specs/phase0/beacon-chain.md#withdrawal-prefixes
BLS_WITHDRAWAL_PREFIX*: byte = 0 BLS_WITHDRAWAL_PREFIX*: byte = 0
ETH1_ADDRESS_WITHDRAWAL_PREFIX*: byte = 1
# Constants from `validator.md` not covered by config/presets in the spec # Constants from `validator.md` not covered by config/presets in the spec
TARGET_AGGREGATORS_PER_COMMITTEE*: uint64 = 16 TARGET_AGGREGATORS_PER_COMMITTEE*: uint64 = 16
@ -29,7 +31,7 @@ type
Eth1Address* = ethtypes.Address Eth1Address* = ethtypes.Address
RuntimeConfig* = object RuntimeConfig* = object
## https://github.com/ethereum/consensus-specs/tree/v1.1.1/configs ## https://github.com/ethereum/consensus-specs/tree/v1.1.3/configs
PRESET_BASE*: string PRESET_BASE*: string

View File

@ -2670,7 +2670,7 @@
"response": { "response": {
"status": {"operator": "equals", "value": "200"}, "status": {"operator": "equals", "value": "200"},
"headers": [{"key": "Content-Type", "value": "application/json", "operator": "equals"}], "headers": [{"key": "Content-Type", "value": "application/json", "operator": "equals"}],
"body": [{"operator": "jstructcmps", "start": ["data"], "value": {"CONFIG_NAME":"","PRESET_BASE":"","ALTAIR_FORK_EPOCH":"","ALTAIR_FORK_VERSION":"","MAX_COMMITTEES_PER_SLOT":"","TARGET_COMMITTEE_SIZE":"","MAX_VALIDATORS_PER_COMMITTEE":"","MIN_PER_EPOCH_CHURN_LIMIT":"","CHURN_LIMIT_QUOTIENT":"","SHUFFLE_ROUND_COUNT":"","MIN_GENESIS_ACTIVE_VALIDATOR_COUNT":"","MIN_GENESIS_TIME":"","HYSTERESIS_QUOTIENT":"","HYSTERESIS_DOWNWARD_MULTIPLIER":"","HYSTERESIS_UPWARD_MULTIPLIER":"","SAFE_SLOTS_TO_UPDATE_JUSTIFIED":"","ETH1_FOLLOW_DISTANCE":"","TARGET_AGGREGATORS_PER_COMMITTEE":"","TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE":"","RANDOM_SUBNETS_PER_VALIDATOR":"","EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION":"","SECONDS_PER_ETH1_BLOCK":"","DEPOSIT_CHAIN_ID":"","DEPOSIT_NETWORK_ID":"","DEPOSIT_CONTRACT_ADDRESS":"","MIN_DEPOSIT_AMOUNT":"","MAX_EFFECTIVE_BALANCE":"","EJECTION_BALANCE":"","EFFECTIVE_BALANCE_INCREMENT":"","GENESIS_FORK_VERSION":"","BLS_WITHDRAWAL_PREFIX":"","GENESIS_DELAY":"","SECONDS_PER_SLOT":"","MIN_ATTESTATION_INCLUSION_DELAY":"","SLOTS_PER_EPOCH":"","MIN_SEED_LOOKAHEAD":"","MAX_SEED_LOOKAHEAD":"","EPOCHS_PER_ETH1_VOTING_PERIOD":"","SLOTS_PER_HISTORICAL_ROOT":"","SYNC_COMMITTEE_SIZE":"","SYNC_COMMITTEE_SUBNET_COUNT":"","MIN_VALIDATOR_WITHDRAWABILITY_DELAY":"","SHARD_COMMITTEE_PERIOD":"","MIN_EPOCHS_TO_INACTIVITY_PENALTY":"","EPOCHS_PER_HISTORICAL_VECTOR":"","EPOCHS_PER_SLASHINGS_VECTOR":"","EPOCHS_PER_SYNC_COMMITTEE_PERIOD":"","HISTORICAL_ROOTS_LIMIT":"","VALIDATOR_REGISTRY_LIMIT":"","BASE_REWARD_FACTOR":"","WHISTLEBLOWER_REWARD_QUOTIENT":"","PROPOSER_REWARD_QUOTIENT":"","INACTIVITY_PENALTY_QUOTIENT":"","INACTIVITY_PENALTY_QUOTIENT_ALTAIR":"","INACTIVITY_SCORE_BIAS":"","INACTIVITY_SCORE_RECOVERY_RATE":"","MIN_SLASHING_PENALTY_QUOTIENT":"","MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR":"","MIN_SYNC_COMMITTEE_PARTICIPANTS":"","PROPORTIONAL_SLASHING_MULTIPLIER":"","PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR":"","MAX_PROPOSER_SLASHINGS":"","MAX_ATTESTER_SLASHINGS":"","MAX_ATTESTATIONS":"","MAX_DEPOSITS":"","MAX_VOLUNTARY_EXITS":"","DOMAIN_BEACON_PROPOSER":"","DOMAIN_BEACON_ATTESTER":"","DOMAIN_RANDAO":"","DOMAIN_DEPOSIT":"","DOMAIN_VOLUNTARY_EXIT":"","DOMAIN_SELECTION_PROOF":"","DOMAIN_AGGREGATE_AND_PROOF":"","DOMAIN_CONTRIBUTION_AND_PROOF":"","DOMAIN_SYNC_COMMITTEE":"","DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF":""}}] "body": [{"operator": "jstructcmps", "start": ["data"], "value": {"CONFIG_NAME":"","MAX_COMMITTEES_PER_SLOT":"","TARGET_COMMITTEE_SIZE":"","MAX_VALIDATORS_PER_COMMITTEE":"","SHUFFLE_ROUND_COUNT":"","HYSTERESIS_QUOTIENT":"","HYSTERESIS_DOWNWARD_MULTIPLIER":"","HYSTERESIS_UPWARD_MULTIPLIER":"","SAFE_SLOTS_TO_UPDATE_JUSTIFIED":"","MIN_DEPOSIT_AMOUNT":"","MAX_EFFECTIVE_BALANCE":"","EFFECTIVE_BALANCE_INCREMENT":"","MIN_ATTESTATION_INCLUSION_DELAY":"","SLOTS_PER_EPOCH":"","MIN_SEED_LOOKAHEAD":"","MAX_SEED_LOOKAHEAD":"","EPOCHS_PER_ETH1_VOTING_PERIOD":"","SLOTS_PER_HISTORICAL_ROOT":"","MIN_EPOCHS_TO_INACTIVITY_PENALTY":"","EPOCHS_PER_HISTORICAL_VECTOR":"","EPOCHS_PER_SLASHINGS_VECTOR":"","HISTORICAL_ROOTS_LIMIT":"","VALIDATOR_REGISTRY_LIMIT":"","BASE_REWARD_FACTOR":"","WHISTLEBLOWER_REWARD_QUOTIENT":"","PROPOSER_REWARD_QUOTIENT":"","INACTIVITY_PENALTY_QUOTIENT":"","MIN_SLASHING_PENALTY_QUOTIENT":"","PROPORTIONAL_SLASHING_MULTIPLIER":"","MAX_PROPOSER_SLASHINGS":"","MAX_ATTESTER_SLASHINGS":"","MAX_ATTESTATIONS":"","MAX_DEPOSITS":"","MAX_VOLUNTARY_EXITS":"","INACTIVITY_PENALTY_QUOTIENT_ALTAIR":"","MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR":"","PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR":"","SYNC_COMMITTEE_SIZE":"","EPOCHS_PER_SYNC_COMMITTEE_PERIOD":"","MIN_SYNC_COMMITTEE_PARTICIPANTS":"","PRESET_BASE":"","TERMINAL_TOTAL_DIFFICULTY":"","TERMINAL_BLOCK_HASH":"","MIN_GENESIS_ACTIVE_VALIDATOR_COUNT":"","MIN_GENESIS_TIME":"","GENESIS_FORK_VERSION":"","GENESIS_DELAY":"","ALTAIR_FORK_VERSION":"","ALTAIR_FORK_EPOCH":"","MERGE_FORK_VERSION":"","MERGE_FORK_EPOCH":"","SHARDING_FORK_VERSION":"","SHARDING_FORK_EPOCH":"","SECONDS_PER_SLOT":"","SECONDS_PER_ETH1_BLOCK":"","MIN_VALIDATOR_WITHDRAWABILITY_DELAY":"","SHARD_COMMITTEE_PERIOD":"","ETH1_FOLLOW_DISTANCE":"","INACTIVITY_SCORE_BIAS":"","INACTIVITY_SCORE_RECOVERY_RATE":"","EJECTION_BALANCE":"","MIN_PER_EPOCH_CHURN_LIMIT":"","CHURN_LIMIT_QUOTIENT":"","DEPOSIT_CHAIN_ID":"","DEPOSIT_NETWORK_ID":"","DEPOSIT_CONTRACT_ADDRESS":"","BLS_WITHDRAWAL_PREFIX":"","ETH1_ADDRESS_WITHDRAWAL_PREFIX":"","DOMAIN_BEACON_PROPOSER":"","DOMAIN_BEACON_ATTESTER":"","DOMAIN_RANDAO":"","DOMAIN_DEPOSIT":"","DOMAIN_VOLUNTARY_EXIT":"","DOMAIN_SELECTION_PROOF":"","DOMAIN_AGGREGATE_AND_PROOF":"","TIMELY_SOURCE_FLAG_INDEX":"","TIMELY_TARGET_FLAG_INDEX":"","TIMELY_HEAD_FLAG_INDEX":"","TIMELY_SOURCE_WEIGHT":"","TIMELY_TARGET_WEIGHT":"","TIMELY_HEAD_WEIGHT":"","SYNC_REWARD_WEIGHT":"","PROPOSER_WEIGHT":"","WEIGHT_DENOMINATOR":"","DOMAIN_SYNC_COMMITTEE":"","DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF":"","DOMAIN_CONTRIBUTION_AND_PROOF":"","TARGET_AGGREGATORS_PER_COMMITTEE":"","RANDOM_SUBNETS_PER_VALIDATOR":"","EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION":"","ATTESTATION_SUBNET_COUNT":"","TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE":"","SYNC_COMMITTEE_SUBNET_COUNT":""}}]
} }
}, },
{ {