Update `ExecutionLayerExit` fields: replace `validator_index` with `validator_pubkey`

This commit is contained in:
Hsiao-Wei Wang 2023-05-15 20:07:11 +08:00
parent 6e08327d1f
commit a11cc094ee
No known key found for this signature in database
GPG Key ID: AE3D6B174F971DE4
6 changed files with 20 additions and 9 deletions

View File

@ -53,7 +53,7 @@ This mechanism relies on the changes proposed by [EIP-7002](http://eips.ethereum
```python
class ExecutionLayerExit(Container):
source_address: ExecutionAddress
validator_index: ValidatorIndex
validator_pubkey: BLSPubkey
```
### Extended Containers
@ -238,7 +238,9 @@ def process_operations(state: BeaconState, body: BeaconBlockBody) -> None:
```python
def process_execution_layer_exit(state: BeaconState, execution_layer_exit: ExecutionLayerExit) -> None:
validator = state.validators[execution_layer_exit.validator_index]
validator_pubkeys = [v.pubkey for v in state.validators]
validator_index = ValidatorIndex(validator_pubkeys.index(execution_layer_exit.validator_pubkey))
validator = state.validators[validator_index]
# Verify withdrawal credentials
is_correct_source_address = (
@ -258,7 +260,7 @@ def process_execution_layer_exit(state: BeaconState, execution_layer_exit: Execu
return
# Initiate exit
initiate_validator_exit(state, execution_layer_exit.validator_index)
initiate_validator_exit(state, validator_index)
```
## Testing

View File

@ -11,11 +11,12 @@ def test_basic_exit(spec, state):
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)
execution_layer_exit = spec.ExecutionLayerExit(
source_address=address,
validator_index=validator_index,
validator_pubkey=validator_pubkey,
)
yield from run_execution_layer_exit_processing(spec, state, execution_layer_exit)
@ -29,12 +30,13 @@ def test_incorrect_source_address(spec, state):
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
incorrect_address = b'\x33' * 20
set_eth1_withdrawal_credential_with_balance(spec, state, validator_index, address=address)
execution_layer_exit = spec.ExecutionLayerExit(
source_address=incorrect_address,
validator_index=validator_index,
validator_pubkey=validator_pubkey,
)
yield from run_execution_layer_exit_processing(spec, state, execution_layer_exit, success=False)

View File

@ -24,11 +24,12 @@ def test_basic_exit(spec, state):
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)
execution_layer_exit = spec.ExecutionLayerExit(
source_address=address,
validator_index=validator_index,
validator_pubkey=validator_pubkey,
)
yield 'pre', state

View File

@ -1,4 +1,5 @@
from eth2spec.test.context import expect_assertion_error
from eth2spec.test.helpers.state import get_validator_index_by_pubkey
#
@ -14,7 +15,7 @@ def run_execution_layer_exit_processing(spec, state, execution_layer_exit, valid
- post-state ('post').
If ``valid == False``, run expecting ``AssertionError``
"""
validator_index = execution_layer_exit.validator_index
validator_index = get_validator_index_by_pubkey(state, execution_layer_exit.validator_pubkey)
yield 'pre', state
yield 'execution_layer_exit', execution_layer_exit

View File

@ -141,8 +141,8 @@ def get_exit_rlp(exit):
exit_rlp = [
# source_address
(Binary(20, 20), exit.source_address),
# validator_index
(big_endian_int, exit.validator_index),
# validator_pubkey
(Binary(48, 48), exit.validator_pubkey),
]
sedes = List([schema for schema, _ in exit_rlp])

View File

@ -166,3 +166,8 @@ def has_active_balance_differential(spec, state):
active_balance = spec.get_total_active_balance(state)
total_balance = spec.get_total_balance(state, set(range(len(state.validators))))
return active_balance // spec.EFFECTIVE_BALANCE_INCREMENT != total_balance // spec.EFFECTIVE_BALANCE_INCREMENT
def get_validator_index_by_pubkey(state, pubkey):
index = next((i for i, validator in enumerate(state.validators) if validator.pubkey == pubkey), None)
return index