mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-02-20 02:08:12 +00:00
add EF consensus spec test Electra consolidation operations fixture (#6235)
This commit is contained in:
parent
824bb17115
commit
b0f58a58b6
@ -2598,6 +2598,21 @@ OK: 14/14 Fail: 0/14 Skip: 0/14
|
|||||||
+ [Valid] EF - Electra - Operations - Block Header - basic_block_header OK
|
+ [Valid] EF - Electra - Operations - Block Header - basic_block_header OK
|
||||||
```
|
```
|
||||||
OK: 6/6 Fail: 0/6 Skip: 0/6
|
OK: 6/6 Fail: 0/6 Skip: 0/6
|
||||||
|
## EF - Electra - Operations - Consolidation [Preset: mainnet]
|
||||||
|
```diff
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_before_specified_epoch OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_different_credentials OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_exited_source OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_exited_target OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_inactive_source OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_inactive_target OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_no_execution_withdrawal_cred OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_not_enough_consolidation_chu OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_source_equals_target OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_source_signature OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_target_signature OK
|
||||||
|
```
|
||||||
|
OK: 11/11 Fail: 0/11 Skip: 0/11
|
||||||
## EF - Electra - Operations - Execution Layer Withdrawal Request [Preset: mainnet]
|
## EF - Electra - Operations - Execution Layer Withdrawal Request [Preset: mainnet]
|
||||||
```diff
|
```diff
|
||||||
+ [Valid] EF - Electra - Operations - Execution Layer Withdrawal Request - activation_epoc OK
|
+ [Valid] EF - Electra - Operations - Execution Layer Withdrawal Request - activation_epoc OK
|
||||||
@ -3382,4 +3397,4 @@ OK: 69/88 Fail: 0/88 Skip: 19/88
|
|||||||
OK: 3/3 Fail: 0/3 Skip: 0/3
|
OK: 3/3 Fail: 0/3 Skip: 0/3
|
||||||
|
|
||||||
---TOTAL---
|
---TOTAL---
|
||||||
OK: 2705/2724 Fail: 0/2724 Skip: 19/2724
|
OK: 2716/2735 Fail: 0/2735 Skip: 19/2735
|
||||||
|
@ -2725,6 +2725,30 @@ OK: 14/14 Fail: 0/14 Skip: 0/14
|
|||||||
+ [Valid] EF - Electra - Operations - Block Header - basic_block_header OK
|
+ [Valid] EF - Electra - Operations - Block Header - basic_block_header OK
|
||||||
```
|
```
|
||||||
OK: 6/6 Fail: 0/6 Skip: 0/6
|
OK: 6/6 Fail: 0/6 Skip: 0/6
|
||||||
|
## EF - Electra - Operations - Consolidation [Preset: minimal]
|
||||||
|
```diff
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_before_specified_epoch OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_different_credentials OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_exited_source OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_exited_target OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_inactive_source OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_inactive_target OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_no_execution_withdrawal_cred OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_not_enough_consolidation_chu OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_source_equals_target OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_source_signature OK
|
||||||
|
+ [Invalid] EF - Electra - Operations - Consolidation - invalid_target_signature OK
|
||||||
|
+ [Valid] EF - Electra - Operations - Consolidation - basic_consolidation_in_current_conso OK
|
||||||
|
+ [Valid] EF - Electra - Operations - Consolidation - basic_consolidation_in_new_consolida OK
|
||||||
|
+ [Valid] EF - Electra - Operations - Consolidation - basic_consolidation_with_compounding OK
|
||||||
|
+ [Valid] EF - Electra - Operations - Consolidation - basic_consolidation_with_insufficien OK
|
||||||
|
+ [Valid] EF - Electra - Operations - Consolidation - basic_consolidation_with_preexisting OK
|
||||||
|
+ [Valid] EF - Electra - Operations - Consolidation - consolidation_balance_larger_than_ch OK
|
||||||
|
+ [Valid] EF - Electra - Operations - Consolidation - consolidation_balance_through_two_ch OK
|
||||||
|
+ [Valid] EF - Electra - Operations - Consolidation - consolidation_churn_limit_balance OK
|
||||||
|
+ [Valid] EF - Electra - Operations - Consolidation - multiple_consolidations_above_churn OK
|
||||||
|
```
|
||||||
|
OK: 20/20 Fail: 0/20 Skip: 0/20
|
||||||
## EF - Electra - Operations - Execution Layer Withdrawal Request [Preset: minimal]
|
## EF - Electra - Operations - Execution Layer Withdrawal Request [Preset: minimal]
|
||||||
```diff
|
```diff
|
||||||
+ [Valid] EF - Electra - Operations - Execution Layer Withdrawal Request - activation_epoc OK
|
+ [Valid] EF - Electra - Operations - Execution Layer Withdrawal Request - activation_epoc OK
|
||||||
@ -3675,4 +3699,4 @@ OK: 185/207 Fail: 0/207 Skip: 22/207
|
|||||||
OK: 3/3 Fail: 0/3 Skip: 0/3
|
OK: 3/3 Fail: 0/3 Skip: 0/3
|
||||||
|
|
||||||
---TOTAL---
|
---TOTAL---
|
||||||
OK: 2967/2989 Fail: 0/2989 Skip: 22/2989
|
OK: 2987/3009 Fail: 0/3009 Skip: 22/3009
|
||||||
|
@ -189,6 +189,13 @@ func get_activation_exit_churn_limit*(
|
|||||||
cfg.MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT.Gwei,
|
cfg.MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT.Gwei,
|
||||||
get_balance_churn_limit(cfg, state, cache))
|
get_balance_churn_limit(cfg, state, cache))
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#new-get_consolidation_churn_limit
|
||||||
|
func get_consolidation_churn_limit*(
|
||||||
|
cfg: RuntimeConfig, state: electra.BeaconState, cache: var StateCache):
|
||||||
|
Gwei =
|
||||||
|
get_balance_churn_limit(cfg, state, cache) -
|
||||||
|
get_activation_exit_churn_limit(cfg, state, cache)
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#new-compute_exit_epoch_and_update_churn
|
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#new-compute_exit_epoch_and_update_churn
|
||||||
func compute_exit_epoch_and_update_churn*(
|
func compute_exit_epoch_and_update_churn*(
|
||||||
cfg: RuntimeConfig, state: var electra.BeaconState, exit_balance: Gwei,
|
cfg: RuntimeConfig, state: var electra.BeaconState, exit_balance: Gwei,
|
||||||
@ -218,6 +225,36 @@ func compute_exit_epoch_and_update_churn*(
|
|||||||
|
|
||||||
state.earliest_exit_epoch
|
state.earliest_exit_epoch
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#new-compute_consolidation_epoch_and_update_churn
|
||||||
|
func compute_consolidation_epoch_and_update_churn*(
|
||||||
|
cfg: RuntimeConfig, state: var electra.BeaconState,
|
||||||
|
consolidation_balance: Gwei, cache: var StateCache): Epoch =
|
||||||
|
var earliest_consolidation_epoch = max(state.earliest_consolidation_epoch,
|
||||||
|
compute_activation_exit_epoch(get_current_epoch(state)))
|
||||||
|
let per_epoch_consolidation_churn =
|
||||||
|
get_consolidation_churn_limit(cfg, state, cache)
|
||||||
|
|
||||||
|
# New epoch for consolidations.
|
||||||
|
var consolidation_balance_to_consume =
|
||||||
|
if state.earliest_consolidation_epoch < earliest_consolidation_epoch:
|
||||||
|
per_epoch_consolidation_churn
|
||||||
|
else:
|
||||||
|
state.consolidation_balance_to_consume
|
||||||
|
|
||||||
|
# Consolidation doesn't fit in the current earliest epoch.
|
||||||
|
if consolidation_balance > consolidation_balance_to_consume:
|
||||||
|
let
|
||||||
|
balance_to_process = consolidation_balance - consolidation_balance_to_consume
|
||||||
|
additional_epochs = (balance_to_process - 1.Gwei) div per_epoch_consolidation_churn + 1
|
||||||
|
earliest_consolidation_epoch += additional_epochs
|
||||||
|
consolidation_balance_to_consume += additional_epochs * per_epoch_consolidation_churn
|
||||||
|
|
||||||
|
# Consume the balance and update state variables.
|
||||||
|
state.consolidation_balance_to_consume = consolidation_balance_to_consume - consolidation_balance
|
||||||
|
state.earliest_consolidation_epoch = earliest_consolidation_epoch
|
||||||
|
|
||||||
|
state.earliest_consolidation_epoch
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#updated--initiate_validator_exit
|
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#updated--initiate_validator_exit
|
||||||
func initiate_validator_exit*(
|
func initiate_validator_exit*(
|
||||||
cfg: RuntimeConfig, state: var electra.BeaconState,
|
cfg: RuntimeConfig, state: var electra.BeaconState,
|
||||||
|
@ -962,6 +962,84 @@ func process_execution_layer_withdrawal_request*(
|
|||||||
withdrawable_epoch: withdrawable_epoch,
|
withdrawable_epoch: withdrawable_epoch,
|
||||||
))
|
))
|
||||||
|
|
||||||
|
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.0/specs/electra/beacon-chain.md#consolidations
|
||||||
|
func process_consolidation*(
|
||||||
|
cfg: RuntimeConfig, state: var electra.BeaconState,
|
||||||
|
signed_consolidation: SignedConsolidation, cache: var StateCache):
|
||||||
|
Result[void, cstring] =
|
||||||
|
# If the pending consolidations queue is full, no consolidations are allowed
|
||||||
|
# in the block
|
||||||
|
if not(lenu64(state.pending_consolidations) < PENDING_CONSOLIDATIONS_LIMIT):
|
||||||
|
return err("Consolidation: too many pending consolidations already")
|
||||||
|
|
||||||
|
# If there is too little available consolidation churn limit, no
|
||||||
|
# consolidations are allowed in the block
|
||||||
|
if not (get_consolidation_churn_limit(cfg, state, cache) >
|
||||||
|
static(MIN_ACTIVATION_BALANCE.Gwei)):
|
||||||
|
return err("Consolidation: insufficient available consolidation churn limit")
|
||||||
|
|
||||||
|
let consolidation = signed_consolidation.message
|
||||||
|
|
||||||
|
# Verify that source != target, so a consolidation cannot be used as an exit.
|
||||||
|
if not(consolidation.source_index != consolidation.target_index):
|
||||||
|
return err("Consolidation: a consolidation cannot be used as an exit")
|
||||||
|
|
||||||
|
let
|
||||||
|
source_validator = addr state.validators.mitem(consolidation.source_index)
|
||||||
|
target_validator = state.validators.item(consolidation.target_index)
|
||||||
|
|
||||||
|
# Verify the source and the target are active
|
||||||
|
let current_epoch = get_current_epoch(state)
|
||||||
|
|
||||||
|
if not is_active_validator(source_validator[], current_epoch):
|
||||||
|
return err("Consolidation: source validator not active")
|
||||||
|
if not is_active_validator(target_validator, current_epoch):
|
||||||
|
return err("Consolidation: target validator not active")
|
||||||
|
|
||||||
|
# Verify exits for source and target have not been initiated
|
||||||
|
if not (source_validator[].exit_epoch == FAR_FUTURE_EPOCH):
|
||||||
|
return err("Consolidation: exit for source validator already initiated")
|
||||||
|
if not (target_validator.exit_epoch == FAR_FUTURE_EPOCH):
|
||||||
|
return err("Consolidation: exit for target validator already initiated")
|
||||||
|
|
||||||
|
# Consolidations must specify an epoch when they become valid; they are not
|
||||||
|
# valid before then
|
||||||
|
if not (current_epoch >= consolidation.epoch):
|
||||||
|
return err("Consolidation: consolidation not valid before specified epoch")
|
||||||
|
|
||||||
|
# Verify the source and the target have Execution layer withdrawal credentials
|
||||||
|
if not has_execution_withdrawal_credential(source_validator[]):
|
||||||
|
return err("Consolidation: source doesn't have execution layer withdrawal credentials")
|
||||||
|
if not has_execution_withdrawal_credential(target_validator):
|
||||||
|
return err("Consolidation: target doesn't have execution layer withdrawal credentials")
|
||||||
|
|
||||||
|
# Verify the same withdrawal address
|
||||||
|
if not (source_validator[].withdrawal_credentials.data.toOpenArray(12, 31) ==
|
||||||
|
target_validator.withdrawal_credentials.data.toOpenArray(12, 31)):
|
||||||
|
return err("Consolidation: source and target don't have same withdrawal address")
|
||||||
|
|
||||||
|
debugRaiseAssert "add signature checking for process_consolidation, which oddly isn't tested"
|
||||||
|
# Verify consolidation is signed by the source and the target
|
||||||
|
#let
|
||||||
|
# domain = compute_domain(
|
||||||
|
# DOMAIN_CONSOLIDATION, genesis_validators_root=state.genesis_validators_root)
|
||||||
|
# signing_root = compute_signing_root(consolidation, domain)
|
||||||
|
# pubkeys = [source_validator.pubkey, target_validator.pubkey]
|
||||||
|
#assert bls.FastAggregateVerify(pubkeys, signing_root, signed_consolidation.signature)
|
||||||
|
|
||||||
|
# Initiate source validator exit and append pending consolidation
|
||||||
|
source_validator[].exit_epoch = compute_consolidation_epoch_and_update_churn(
|
||||||
|
cfg, state, source_validator[].effective_balance, cache)
|
||||||
|
source_validator[].withdrawable_epoch =
|
||||||
|
source_validator[].exit_epoch + cfg.MIN_VALIDATOR_WITHDRAWABILITY_DELAY
|
||||||
|
debugRaiseAssert "check HashList add return value"
|
||||||
|
discard state.pending_consolidations.add(PendingConsolidation(
|
||||||
|
source_index: consolidation.source_index,
|
||||||
|
target_index: consolidation.target_index
|
||||||
|
))
|
||||||
|
|
||||||
|
ok()
|
||||||
|
|
||||||
# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/deneb/beacon-chain.md#kzg_commitment_to_versioned_hash
|
# https://github.com/ethereum/consensus-specs/blob/v1.4.0/specs/deneb/beacon-chain.md#kzg_commitment_to_versioned_hash
|
||||||
func kzg_commitment_to_versioned_hash*(
|
func kzg_commitment_to_versioned_hash*(
|
||||||
kzg_commitment: KzgCommitment): VersionedHash =
|
kzg_commitment: KzgCommitment): VersionedHash =
|
||||||
|
@ -148,7 +148,26 @@ suite baseDescription & "BLS to execution change " & preset():
|
|||||||
OpBlsToExecutionChangeDir, suiteName, "BLS to execution change", "address_change",
|
OpBlsToExecutionChangeDir, suiteName, "BLS to execution change", "address_change",
|
||||||
applyBlsToExecutionChange, path)
|
applyBlsToExecutionChange, path)
|
||||||
|
|
||||||
debugRaiseAssert "consolidations tests"
|
suite baseDescription & "Consolidation " & preset():
|
||||||
|
proc applyConsolidation(
|
||||||
|
preState: var electra.BeaconState,
|
||||||
|
signed_consolidation: SignedConsolidation):
|
||||||
|
Result[void, cstring] =
|
||||||
|
var cache: StateCache
|
||||||
|
process_consolidation(
|
||||||
|
defaultRuntimeConfig, preState, signed_consolidation, cache)
|
||||||
|
|
||||||
|
for path in walkTests(OpConsolidationDir):
|
||||||
|
if path in [
|
||||||
|
"multiple_consolidations_below_churn", # missing consolidation.ssz
|
||||||
|
"multiple_consolidations_equal_churn", # missing consolidation.ssz
|
||||||
|
"multiple_consolidations_equal_twice_churn", # missing consolidation.ssz
|
||||||
|
"invalid_exceed_pending_consolidations_limit", # apparently invalid prestate SSZ
|
||||||
|
]:
|
||||||
|
continue
|
||||||
|
runTest[SignedConsolidation, typeof applyConsolidation](
|
||||||
|
OpConsolidationDir, suiteName, "Consolidation", "consolidation",
|
||||||
|
applyConsolidation, path)
|
||||||
|
|
||||||
when false:
|
when false:
|
||||||
from ".."/".."/".."/beacon_chain/bloomfilter import constructBloomFilter
|
from ".."/".."/".."/beacon_chain/bloomfilter import constructBloomFilter
|
||||||
|
Loading…
x
Reference in New Issue
Block a user