use v1.3.0-alpha.2 EF consensus spec test vectors (#4430)

This commit is contained in:
tersec 2022-12-15 01:51:06 +00:00 committed by GitHub
parent e7706768c3
commit d269d82b71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 1353 additions and 1314 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -77,7 +77,7 @@ export
tables, results, json_serialization, timer, sszTypes, beacon_time, crypto,
digest, presets
const SPEC_VERSION* = "1.3.0-alpha.1"
const SPEC_VERSION* = "1.3.0-alpha.2"
## Spec version we're aiming to be compatible with, right now
const

View File

@ -1,5 +1,5 @@
# Mainnet preset - Capella
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.1/presets/mainnet/capella.yaml
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.2/presets/mainnet/capella.yaml
const
# Max operations per block
# ---------------------------------------------------------------
@ -11,3 +11,9 @@ const
# ---------------------------------------------------------------
# 2**4 (= 16) withdrawals
MAX_WITHDRAWALS_PER_PAYLOAD* = 16
# Withdrawals processing
# ---------------------------------------------------------------
# 2**14 (= 16384) validators
MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP* = 16384

View File

@ -1,7 +1,7 @@
# Mainnet preset - EIP-4844
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.1/presets/mainnet/eip4844.yaml
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.2/presets/mainnet/eip4844.yaml
const
# `uint64(4096)`
FIELD_ELEMENTS_PER_BLOB*: uint64 = 4096
# `uint64(2**4)` (= 16)
MAX_BLOBS_PER_BLOCK*: uint64 = 16
# `uint64(2**2)` (= 4)
MAX_BLOBS_PER_BLOCK*: uint64 = 4

View File

@ -1,5 +1,5 @@
# Minimal preset - Capella
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.1/presets/minimal/capella.yaml
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.2/presets/minimal/capella.yaml
const
# Max operations per block
# ---------------------------------------------------------------
@ -11,3 +11,9 @@ const
# ---------------------------------------------------------------
# [customized] 2**2 (= 4)
MAX_WITHDRAWALS_PER_PAYLOAD* = 4
# Withdrawals processing
# ---------------------------------------------------------------
# [customized] 2**4 (= 16) validators
MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP* = 16

View File

@ -1,7 +1,7 @@
# Minimal preset - EIP-4844
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.1/presets/minimal/eip4844.yaml
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.2/presets/minimal/eip4844.yaml
const
# [customized]
FIELD_ELEMENTS_PER_BLOB*: uint64 = 4
# `uint64(2**4)` (= 16)
MAX_BLOBS_PER_BLOCK*: uint64 = 16
# `uint64(2**2)` (= 4)
MAX_BLOBS_PER_BLOCK*: uint64 = 4

View File

@ -702,14 +702,15 @@ func is_partially_withdrawable_validator(
has_eth1_withdrawal_credential(validator) and
has_max_effective_balance and has_excess_balance
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.1/specs/capella/beacon-chain.md#new-get_expected_withdrawals
# https://github.com/ethereum/consensus-specs/blob/v1.3.0-alpha.2/specs/capella/beacon-chain.md#new-get_expected_withdrawals
func get_expected_withdrawals(state: capella.BeaconState): seq[Withdrawal] =
let epoch = get_current_epoch(state)
var
withdrawal_index = state.next_withdrawal_index
validator_index = state.next_withdrawal_validator_index
withdrawals: seq[Withdrawal] = @[]
for _ in 0 ..< len(state.validators):
bound = min(len(state.validators), MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP)
for _ in 0 ..< bound:
let
validator = state.validators[validator_index]
balance = state.balances[validator_index]
@ -762,11 +763,26 @@ func process_withdrawals*(
return err("process_withdrawals: invalid validator index")
decrease_balance(
state, validator_index, expected_withdrawals[i].amount)
if len(expected_withdrawals) > 0:
# Update the next withdrawal index if this block contained withdrawals
if len(expected_withdrawals) != 0:
let latest_withdrawal = expected_withdrawals[^1]
state.next_withdrawal_index = WithdrawalIndex(latest_withdrawal.index + 1)
# Update the next validator index to start the next withdrawal sweep
if len(expected_withdrawals) == MAX_WITHDRAWALS_PER_PAYLOAD:
# Next sweep starts after the latest withdrawal's validator index
let next_validator_index =
(latest_withdrawal.validator_index + 1) mod lenu64(state.validators)
(expected_withdrawals[^1].validator_index + 1) mod
lenu64(state.validators)
state.next_withdrawal_validator_index = next_validator_index
else:
# Advance sweep by the max length of the sweep if there was not a full set
# of withdrawals
let next_index =
state.next_withdrawal_validator_index +
MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP
let next_validator_index = next_index mod lenu64(state.validators)
state.next_withdrawal_validator_index = next_validator_index
ok()
@ -808,15 +824,6 @@ func tx_peek_blob_versioned_hashes(opaque_tx: Transaction):
for x in countup(blob_versioned_hashes_offset.int, len(opaque_tx) - 1, 32):
var versionedHash: VersionedHash
versionedHash[0 .. 31] = opaque_tx.asSeq.toOpenArray(x, x + 31)
# TODO there's otherwise a mismatch here where test vectors show valid but
# the first byte is 0?
# `kzg_commitment_to_versioned_hash` is very clear about the equivalent
# first byte having to be 0x01 for it ever to match
# this is not in spec per se though
if versionedHash[0] == 0:
versionedHash[0] = 0x01'u8
res.add versionedHash
ok res

@ -1 +1 @@
Subproject commit 9706d8ebb1dbbb2939f100fc189a5c853bbffe06
Subproject commit 9a1398ab6409e8bceebdd9aeec659e7e8d1a3538