Apply PR feedback from @djrtwo and add more tests
This commit is contained in:
parent
a11cc094ee
commit
8ecf89a2eb
|
@ -42,7 +42,7 @@ This mechanism relies on the changes proposed by [EIP-7002](http://eips.ethereum
|
||||||
|
|
||||||
| Name | Value |
|
| Name | Value |
|
||||||
| - | - |
|
| - | - |
|
||||||
| `MAX_EXITS_PER_BLOCK` | `2**4` (= 16) |
|
| `MAX_EXECUTION_LAYER_EXITS` | `2**4` (= 16) |
|
||||||
|
|
||||||
## Containers
|
## Containers
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ class ExecutionPayload(Container):
|
||||||
transactions: List[Transaction, MAX_TRANSACTIONS_PER_PAYLOAD]
|
transactions: List[Transaction, MAX_TRANSACTIONS_PER_PAYLOAD]
|
||||||
withdrawals: List[Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD]
|
withdrawals: List[Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD]
|
||||||
excess_data_gas: uint256
|
excess_data_gas: uint256
|
||||||
exits: List[ExecutionLayerExit, MAX_EXITS_PER_BLOCK] # [New in EIP7002]
|
exits: List[ExecutionLayerExit, MAX_EXECUTION_LAYER_EXITS] # [New in EIP7002]
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `ExecutionPayloadHeader`
|
#### `ExecutionPayloadHeader`
|
||||||
|
@ -243,11 +243,9 @@ def process_execution_layer_exit(state: BeaconState, execution_layer_exit: Execu
|
||||||
validator = state.validators[validator_index]
|
validator = state.validators[validator_index]
|
||||||
|
|
||||||
# Verify withdrawal credentials
|
# Verify withdrawal credentials
|
||||||
is_correct_source_address = (
|
is_execution_address = validator.withdrawal_credentials[:1] == ETH1_ADDRESS_WITHDRAWAL_PREFIX
|
||||||
validator.withdrawal_credentials[:1] == ETH1_ADDRESS_WITHDRAWAL_PREFIX
|
is_correct_source_address = validator.withdrawal_credentials[12:] == execution_layer_exit.source_address
|
||||||
and validator.withdrawal_credentials[12:] == execution_layer_exit.source_address
|
if not (is_execution_address and is_correct_source_address):
|
||||||
)
|
|
||||||
if not is_correct_source_address:
|
|
||||||
return
|
return
|
||||||
# Verify the validator is active
|
# Verify the validator is active
|
||||||
if not is_active_validator(validator, get_current_epoch(state)):
|
if not is_active_validator(validator, get_current_epoch(state)):
|
||||||
|
|
|
@ -89,6 +89,7 @@ def upgrade_to_eip7002(pre: deneb.BeaconState) -> BeaconState:
|
||||||
transactions_root=pre.latest_execution_payload_header.transactions_root,
|
transactions_root=pre.latest_execution_payload_header.transactions_root,
|
||||||
withdrawals_root=pre.latest_execution_payload_header.withdrawals_root,
|
withdrawals_root=pre.latest_execution_payload_header.withdrawals_root,
|
||||||
excess_data_gas=uint256(0),
|
excess_data_gas=uint256(0),
|
||||||
|
exits_root=Root(), # [New in EIP-7002]
|
||||||
)
|
)
|
||||||
post = BeaconState(
|
post = BeaconState(
|
||||||
# Versioning
|
# Versioning
|
||||||
|
|
|
@ -40,3 +40,48 @@ def test_incorrect_source_address(spec, state):
|
||||||
)
|
)
|
||||||
|
|
||||||
yield from run_execution_layer_exit_processing(spec, state, execution_layer_exit, success=False)
|
yield from run_execution_layer_exit_processing(spec, state, execution_layer_exit, success=False)
|
||||||
|
|
||||||
|
|
||||||
|
@with_eip7002_and_later
|
||||||
|
@spec_state_test
|
||||||
|
def test_incorrect_withdrawal_credential_prefix(spec, state):
|
||||||
|
# move state forward SHARD_COMMITTEE_PERIOD epochs to allow for exit
|
||||||
|
state.slot += spec.config.SHARD_COMMITTEE_PERIOD * spec.SLOTS_PER_EPOCH
|
||||||
|
|
||||||
|
current_epoch = spec.get_current_epoch(state)
|
||||||
|
validator_index = spec.get_active_validator_indices(state, current_epoch)[0]
|
||||||
|
validator_pubkey = state.validators[validator_index].pubkey
|
||||||
|
address = b'\x22' * 20
|
||||||
|
set_eth1_withdrawal_credential_with_balance(spec, state, validator_index, address=address)
|
||||||
|
# Set incorrect prefix
|
||||||
|
state.validators[validator_index].withdrawal_credentials = (
|
||||||
|
spec.BLS_WITHDRAWAL_PREFIX
|
||||||
|
+ state.validators[validator_index].withdrawal_credentials[1:]
|
||||||
|
)
|
||||||
|
execution_layer_exit = spec.ExecutionLayerExit(
|
||||||
|
source_address=address,
|
||||||
|
validator_pubkey=validator_pubkey,
|
||||||
|
)
|
||||||
|
|
||||||
|
yield from run_execution_layer_exit_processing(spec, state, execution_layer_exit, success=False)
|
||||||
|
|
||||||
|
|
||||||
|
@with_eip7002_and_later
|
||||||
|
@spec_state_test
|
||||||
|
def test_on_exit_initiated_validator(spec, state):
|
||||||
|
# move state forward SHARD_COMMITTEE_PERIOD epochs to allow for exit
|
||||||
|
state.slot += spec.config.SHARD_COMMITTEE_PERIOD * spec.SLOTS_PER_EPOCH
|
||||||
|
|
||||||
|
current_epoch = spec.get_current_epoch(state)
|
||||||
|
validator_index = spec.get_active_validator_indices(state, current_epoch)[0]
|
||||||
|
validator_pubkey = state.validators[validator_index].pubkey
|
||||||
|
address = b'\x22' * 20
|
||||||
|
set_eth1_withdrawal_credential_with_balance(spec, state, validator_index, address=address)
|
||||||
|
# Initiate exit earlier
|
||||||
|
spec.initiate_validator_exit(state, validator_index)
|
||||||
|
execution_layer_exit = spec.ExecutionLayerExit(
|
||||||
|
source_address=address,
|
||||||
|
validator_pubkey=validator_pubkey,
|
||||||
|
)
|
||||||
|
|
||||||
|
yield from run_execution_layer_exit_processing(spec, state, execution_layer_exit, success=False)
|
||||||
|
|
|
@ -14,6 +14,7 @@ def run_execution_layer_exit_processing(spec, state, execution_layer_exit, valid
|
||||||
- execution_layer_exit ('execution_layer_exit')
|
- execution_layer_exit ('execution_layer_exit')
|
||||||
- post-state ('post').
|
- post-state ('post').
|
||||||
If ``valid == False``, run expecting ``AssertionError``
|
If ``valid == False``, run expecting ``AssertionError``
|
||||||
|
If ``success == False``, it doesn't initiate exit successfully
|
||||||
"""
|
"""
|
||||||
validator_index = get_validator_index_by_pubkey(state, execution_layer_exit.validator_pubkey)
|
validator_index = get_validator_index_by_pubkey(state, execution_layer_exit.validator_pubkey)
|
||||||
|
|
||||||
|
|
|
@ -162,6 +162,8 @@ def do_fork(state, spec, post_spec, fork_epoch, with_block=True, sync_aggregate=
|
||||||
state = post_spec.upgrade_to_deneb(state)
|
state = post_spec.upgrade_to_deneb(state)
|
||||||
elif post_spec.fork == EIP6110:
|
elif post_spec.fork == EIP6110:
|
||||||
state = post_spec.upgrade_to_eip6110(state)
|
state = post_spec.upgrade_to_eip6110(state)
|
||||||
|
elif post_spec.fork == EIP7002:
|
||||||
|
state = post_spec.upgrade_to_eip7002(state)
|
||||||
|
|
||||||
assert state.fork.epoch == fork_epoch
|
assert state.fork.epoch == fork_epoch
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue