minor withdrawals renamings

This commit is contained in:
Danny Ryan 2022-03-10 10:38:47 -07:00
parent 507f550cb1
commit 3dd83cf4ee
No known key found for this signature in database
GPG Key ID: 2765A792E42CE07A
5 changed files with 24 additions and 32 deletions

View File

@ -26,8 +26,7 @@ We define the following Python custom types for type hinting and readability:
| Name | SSZ equivalent | Description |
| - | - | - |
| `TransactionType` | `Bytes1` | an EIP-2718 type |
| `WithdrawalIndex` | `uint64` | an index of a `WithdrawalTransaction`|
| `WithdrawalIndex` | `uint64` | an index of a `Withdrawal`|
## Preset
@ -35,14 +34,13 @@ We define the following Python custom types for type hinting and readability:
| Name | Value | Unit | Duration |
| - | - | :-: | :-: |
| `WITHDRAWAL_TRANSACTION_LIMIT` | `uint64(2**40)` (= 1,099,511,627,776) | withdrawal transactions enqueued in state|
| `WITHDRAWALS_QUEUE_LIMIT` | `uint64(2**40)` (= 1,099,511,627,776) | withdrawals enqueued in state|
### Execution
| Name | Value | Description |
| - | - | - |
| `TX_TYPE_WITHDRAWAL` | `TransactionType('0x03')` | EIP-2718 TX Type |
| `MAX_WITHDRAWAL_TRANSACTIONS_PER_PAYLOAD` | `uint64(2**4)` (= 16) | Maximum amount of withdrawal transactions allowed in each payload |
| `MAX_WITHDRAWALS_PER_PAYLOAD` | `uint64(2**4)` (= 16) | Maximum amount of withdrawals allowed in each payload |
## Configuration
@ -108,7 +106,7 @@ class BeaconState(Container):
latest_execution_payload_header: ExecutionPayloadHeader
# Withdrawals
withdrawal_index: WithdrawalIndex
withdrawal_receipts: List[WithdrawalTransaction, WITHDRAWAL_TRANSACTION_LIMIT] # [New in Capella]
withdrawals_queue: List[Withdrawal, WITHDRAWALS_QUEUE_LIMIT] # [New in Capella]
```
#### `ExecutionPayload`
@ -131,7 +129,7 @@ class ExecutionPayload(Container):
# Extra payload fields
block_hash: Hash32 # Hash of execution block
transactions: List[Transaction, MAX_TRANSACTIONS_PER_PAYLOAD]
withdrawal_transactions: List[WithdrawalTransaction, MAX_WITHDRAWAL_TRANSACTIONS_PER_PAYLOAD] # [New in Capella]
withdrawals: List[Withdrawal, MAX_WITHDRAWALS_PER_PAYLOAD] # [New in Capella]
```
#### `ExecutionPayloadHeader`
@ -154,21 +152,15 @@ class ExecutionPayloadHeader(Container):
# Extra payload fields
block_hash: Hash32 # Hash of execution block
transactions_root: Root
withdrawal_transactions_root: Root # [New in Capella]
withdrawals_root: Root # [New in Capella]
```
### New containers
#### `WithdrawalTransaction`
New EIP-2718 transaction type, with the format being the single byte `TX_TYPE_WITHDRAWAL`
followed by an SSZ encoding of the `WithdrawalTransaction` container comprising the transaction contents.
*Note*: This container is used for both a special TX that goes into an `ExecutionPayload`
as well as in the `BeaconState`'s `withdrawal_receipts` queue.
#### `Withdrawal`
```python
class WithdrawalTransaction(Container):
class Withdrawal(Container):
index: WithdrawalIndex
address: ExecutionAddress
amount: Gwei
@ -185,13 +177,13 @@ def withdraw(state: BeaconState, index: ValidatorIndex, amount: Gwei) -> None:
# Decrease the validator's balance
decrease_balance(state, index, amount)
# Create a corresponding withdrawal receipt
receipt = WithdrawalTransaction(
withdrawal = Withdrawal(
index=state.withdrawal_index,
address=state.validators[index].withdrawal_credentials[12:],
amount=amount,
)
state.withdrawal_index = WithdrawalIndex(state.withdrawal_index + 1)
state.withdrawal_receipts.append(receipt)
state.withdrawals_queue.append(withdrawal)
```
### Predicates
@ -248,7 +240,7 @@ def process_full_withdrawals(state: BeaconState) -> None:
def process_block(state: BeaconState, block: BeaconBlock) -> None:
process_block_header(state, block)
if is_execution_enabled(state, block.body):
process_withdrawal_transactions(state, block.body.execution_payload) # [New in Capella]
process_withdrawals(state, block.body.execution_payload) # [New in Capella]
process_execution_payload(state, block.body.execution_payload, EXECUTION_ENGINE) # [Modified in Capella]
process_randao(state, block.body)
process_eth1_data(state, block.body)
@ -256,22 +248,22 @@ def process_block(state: BeaconState, block: BeaconBlock) -> None:
process_sync_aggregate(state, block.body.sync_aggregate)
```
#### New `process_withdrawal_transactions`
#### New `process_withdrawals`
```python
def process_withdrawal_transactions(state: BeaconState, payload: ExecutionPayload) -> None:
num_withdrawal_transactions = min(MAX_WITHDRAWAL_TRANSACTIONS_PER_PAYLOAD, len(state.withdrawal_receipts))
dequeued_withdrawal_receipts = state.withdrawal_receipts[:num_withdrawal_transactions]
def process_withdrawals(state: BeaconState, payload: ExecutionPayload) -> None:
num_withdrawals = min(MAX_WITHDRAWALS_PER_PAYLOAD, len(state.withdrawals_queue))
dequeued_withdrawals = state.withdrawals_queue[:num_withdrawals]
assert len(dequeued_withdrawal_receipts) == len(payload.withdrawal_transactions)
for dequeued_receipt, withdrawal_transaction in zip(dequeued_withdrawal_receipts, payload.withdrawal_transactions):
assert len(dequeued_withdrawals) == len(payload.withdrawals)
for dequeued_receipt, withdrawal_transaction in zip(dequeued_withdrawals, payload.withdrawals):
assert dequeued_receipt == withdrawal_transaction
# Ensure no withdrawal type transactions in the normal payload transactions
# assert no_withdrawal_type_transactions_in(payload.transactions)
# Remove dequeued receipts from state
state.withdrawal_receipts = state.withdrawal_receipts[num_withdrawal_transactions:]
state.withdrawals_queue = state.withdrawals_queue[num_withdrawals:]
```
#### Modified `process_execution_payload`
@ -305,6 +297,6 @@ def process_execution_payload(state: BeaconState, payload: ExecutionPayload, exe
base_fee_per_gas=payload.base_fee_per_gas,
block_hash=payload.block_hash,
transactions_root=hash_tree_root(payload.transactions),
withdrawal_transactions_root=hash_tree_root(payload.withdrawal_transactions),
withdrawals_root=hash_tree_root(payload.withdrawals),
)
```

View File

@ -84,7 +84,7 @@ def upgrade_to_capella(pre: bellatrix.BeaconState) -> BeaconState:
latest_execution_payload_header=pre.latest_execution_payload_header,
# Withdrawals
withdrawal_index=WithdrawalIndex(0),
withdrawal_receipts=[],
withdrawals_queue=[],
)
for pre_validator in pre.validators:

View File

@ -18,7 +18,7 @@ def set_validator_withdrawable(spec, state, index, withdrawable_epoch=None):
def run_process_full_withdrawals(spec, state, num_expected_withdrawals=None):
pre_withdrawal_index = state.withdrawal_index
pre_withdrawal_receipts = state.withdrawal_receipts
pre_withdrawals_queue = state.withdrawals_queue
to_be_withdrawn_indices = [
index for index, validator in enumerate(state.validators)
if spec.is_fully_withdrawable_validator(validator, spec.get_current_epoch(state))
@ -34,7 +34,7 @@ def run_process_full_withdrawals(spec, state, num_expected_withdrawals=None):
assert validator.withdrawn_epoch == spec.get_current_epoch(state)
assert state.balances[index] == 0
assert len(state.withdrawal_receipts) == len(pre_withdrawal_receipts) + num_expected_withdrawals
assert len(state.withdrawals_queue) == len(pre_withdrawals_queue) + num_expected_withdrawals
assert state.withdrawal_index == pre_withdrawal_index + num_expected_withdrawals

View File

@ -28,7 +28,7 @@ def get_process_calls(spec):
'process_participation_record_updates'
),
'process_sync_committee_updates', # altair
'process_withdrawals', # capella
'process_full_withdrawals', # capella
# TODO: add sharding processing functions when spec stabilizes.
]

View File

@ -52,7 +52,7 @@ def get_execution_payload_header(spec, execution_payload):
transactions_root=spec.hash_tree_root(execution_payload.transactions)
)
if spec.fork not in FORKS_BEFORE_CAPELLA:
payload_header.withdrawal_transactions_root = spec.hash_tree_root(execution_payload.withdrawal_transactions)
payload_header.withdrawals_root = spec.hash_tree_root(execution_payload.withdrawals)
return payload_header