Add HW and Danny comments

This commit is contained in:
Justin Drake 2019-05-03 21:21:42 +01:00
parent 9f2cdd9c78
commit 197a7200ef
4 changed files with 36 additions and 37 deletions

View File

@ -96,7 +96,6 @@
- [`slash_validator`](#slash_validator) - [`slash_validator`](#slash_validator)
- [On genesis](#on-genesis) - [On genesis](#on-genesis)
- [Beacon chain state transition function](#beacon-chain-state-transition-function) - [Beacon chain state transition function](#beacon-chain-state-transition-function)
- [State caching](#state-caching)
- [Epoch processing](#epoch-processing) - [Epoch processing](#epoch-processing)
- [Helper functions](#helper-functions-1) - [Helper functions](#helper-functions-1)
- [Justification and finalization](#justification-and-finalization) - [Justification and finalization](#justification-and-finalization)
@ -1267,36 +1266,36 @@ The post-state corresponding to a pre-state `state` and a block `block` is defin
```python ```python
def state_transition(state: BeaconState, block: BeaconBlock) -> BeaconBlock: def state_transition(state: BeaconState, block: BeaconBlock) -> BeaconBlock:
# Block must post-date the state
assert state.slot < block.slot
# Process slots (including those with no blocks) since block # Process slots (including those with no blocks) since block
while state.slot < block.slot: process_slots(state, block.slot)
# Cache state at the start of every slot
cache_state(state)
# Process epoch at the start of the first slot of every epoch
if (state.slot + 1) % SLOTS_PER_EPOCH == 0:
process_epoch(state)
# Increment slot number
state.slot += 1
# Process block # Process block
process_block(state, block) process_block(state, block)
# Return post-state # Return post-state
return state return state
``` ```
### State caching ```python
def process_slots(state: BeaconState, slot: Slot) -> None:
assert state.slot < slot
while state.slot < slot:
process_slot(state)
# Process epoch on the last slot of every epoch
if (state.slot + 1) % SLOTS_PER_EPOCH == 0:
process_epoch(state)
state.slot += 1
```
```python ```python
def cache_state(state: BeaconState) -> None: def process_slot(state: BeaconState) -> None:
# Cache state root of previous slot # Cache state root
previous_state_root = hash_tree_root(state) previous_state_root = hash_tree_root(state)
state.latest_state_roots[state.slot % SLOTS_PER_HISTORICAL_ROOT] = previous_state_root state.latest_state_roots[state.slot % SLOTS_PER_HISTORICAL_ROOT] = previous_state_root
# Cache previous state root in latest_block_header, if empty # Cache latest block header state root
if state.latest_block_header.state_root == ZERO_HASH: if state.latest_block_header.state_root == ZERO_HASH:
state.latest_block_header.state_root = previous_state_root state.latest_block_header.state_root = previous_state_root
# Cache block root of previous slot # Cache block root
previous_block_root = signing_root(state.latest_block_header) previous_block_root = signing_root(state.latest_block_header)
state.latest_block_roots[state.slot % SLOTS_PER_HISTORICAL_ROOT] = previous_block_root state.latest_block_roots[state.slot % SLOTS_PER_HISTORICAL_ROOT] = previous_block_root
@ -1631,10 +1630,10 @@ def process_final_updates(state: BeaconState) -> None:
```python ```python
def process_block(state: BeaconState, block: BeaconBlock) -> None: def process_block(state: BeaconState, block: BeaconBlock) -> None:
process_block_header(state, block) process_block_header(state, block)
process_randao(state, block) process_randao(state, block.body)
process_eth1_data(state, block) process_eth1_data(state, block.body)
process_operations(state, block.body) process_operations(state, block.body)
# verify_block_state_root(state, block) # process_state_root(state, block)
``` ```
#### Block header #### Block header
@ -1661,31 +1660,33 @@ def process_block_header(state: BeaconState, block: BeaconBlock) -> None:
#### RANDAO #### RANDAO
```python ```python
def process_randao(state: BeaconState, block: BeaconBlock) -> None: def process_randao(state: BeaconState, body: BeaconBlockBody) -> None:
proposer = state.validator_registry[get_beacon_proposer_index(state)] proposer = state.validator_registry[get_beacon_proposer_index(state)]
# Verify that the provided randao value is valid # Verify that the provided randao value is valid
assert bls_verify(proposer.pubkey, hash_tree_root(get_current_epoch(state)), block.body.randao_reveal, get_domain(state, DOMAIN_RANDAO)) assert bls_verify(proposer.pubkey, hash_tree_root(get_current_epoch(state)), body.randao_reveal, get_domain(state, DOMAIN_RANDAO))
# Mix it in # Mix it in
state.latest_randao_mixes[get_current_epoch(state) % LATEST_RANDAO_MIXES_LENGTH] = ( state.latest_randao_mixes[get_current_epoch(state) % LATEST_RANDAO_MIXES_LENGTH] = (
xor(get_randao_mix(state, get_current_epoch(state)), xor(get_randao_mix(state, get_current_epoch(state)),
hash(block.body.randao_reveal)) hash(body.randao_reveal))
) )
``` ```
#### Eth1 data #### Eth1 data
```python ```python
def process_eth1_data(state: BeaconState, block: BeaconBlock) -> None: def process_eth1_data(state: BeaconState, body: BeaconBlockBody) -> None:
state.eth1_data_votes.append(block.body.eth1_data) state.eth1_data_votes.append(body.eth1_data)
if state.eth1_data_votes.count(block.body.eth1_data) * 2 > SLOTS_PER_ETH1_VOTING_PERIOD: if state.eth1_data_votes.count(body.eth1_data) * 2 > SLOTS_PER_ETH1_VOTING_PERIOD:
state.latest_eth1_data = block.body.eth1_data state.latest_eth1_data = body.eth1_data
``` ```
#### Operations #### Operations
```python ```python
def process_operations(state: BeaconState, body: BeaconBlockBody) -> None: def process_operations(state: BeaconState, body: BeaconBlockBody) -> None:
# Verify that outstanding deposits are processed up to the maximum number of deposits
assert len(body.deposits) == min(MAX_DEPOSITS, state.latest_eth1_data.deposit_count - state.deposit_index) assert len(body.deposits) == min(MAX_DEPOSITS, state.latest_eth1_data.deposit_count - state.deposit_index)
# Verify that there are no duplicate transfers
assert len(body.transfers) == len(set(body.transfers)) assert len(body.transfers) == len(set(body.transfers))
for operations, max_operations, function in ( for operations, max_operations, function in (
@ -1704,8 +1705,7 @@ def process_operations(state: BeaconState, body: BeaconBlockBody) -> None:
##### Proposer slashings ##### Proposer slashings
```python ```python
def process_proposer_slashing(state: BeaconState, def process_proposer_slashing(state: BeaconState, proposer_slashing: ProposerSlashing) -> None:
proposer_slashing: ProposerSlashing) -> None:
""" """
Process ``ProposerSlashing`` operation. Process ``ProposerSlashing`` operation.
Note that this function mutates ``state``. Note that this function mutates ``state``.
@ -1728,8 +1728,7 @@ def process_proposer_slashing(state: BeaconState,
##### Attester slashings ##### Attester slashings
```python ```python
def process_attester_slashing(state: BeaconState, def process_attester_slashing(state: BeaconState, attester_slashing: AttesterSlashing) -> None:
attester_slashing: AttesterSlashing) -> None:
""" """
Process ``AttesterSlashing`` operation. Process ``AttesterSlashing`` operation.
Note that this function mutates ``state``. Note that this function mutates ``state``.
@ -1904,6 +1903,6 @@ def process_transfer(state: BeaconState, transfer: Transfer) -> None:
#### State root verification #### State root verification
```python ```python
def verify_block_state_root(state: BeaconState, block: BeaconBlock) -> None: def process_state_root(state: BeaconState, block: BeaconBlock) -> None:
assert block.state_root == hash_tree_root(state) assert block.state_root == hash_tree_root(state)
``` ```

View File

@ -4,7 +4,7 @@ import pytest
from eth2spec.phase0.spec import ( from eth2spec.phase0.spec import (
get_beacon_proposer_index, get_beacon_proposer_index,
cache_state, process_slot,
process_block_header, process_block_header,
) )
from tests.helpers import ( from tests.helpers import (
@ -18,7 +18,7 @@ pytestmark = pytest.mark.header
def prepare_state_for_header_processing(state): def prepare_state_for_header_processing(state):
cache_state(state) process_slot(state)
advance_slot(state) advance_slot(state)

View File

@ -4,7 +4,7 @@ import pytest
import eth2spec.phase0.spec as spec import eth2spec.phase0.spec as spec
from eth2spec.phase0.spec import ( from eth2spec.phase0.spec import (
cache_state, process_slot,
get_crosslink_deltas, get_crosslink_deltas,
process_crosslinks, process_crosslinks,
state_transition, state_transition,
@ -33,7 +33,7 @@ def run_process_crosslinks(state, valid=True):
state_transition(state, block) state_transition(state, block)
# cache state before epoch transition # cache state before epoch transition
cache_state(state) process_slot(state)
post_state = deepcopy(state) post_state = deepcopy(state)
process_crosslinks(post_state) process_crosslinks(post_state)

View File

@ -20,7 +20,7 @@ from eth2spec.phase0.spec import (
get_state_root, get_state_root,
get_current_epoch, get_current_epoch,
get_domain, get_domain,
cache_state, process_slot,
verify_merkle_branch, verify_merkle_branch,
state_transition, state_transition,
hash, hash,
@ -51,7 +51,7 @@ pytestmark = pytest.mark.sanity
def test_slot_transition(state): def test_slot_transition(state):
test_state = deepcopy(state) test_state = deepcopy(state)
cache_state(test_state) process_slot(test_state)
advance_slot(test_state) advance_slot(test_state)
assert test_state.slot == state.slot + 1 assert test_state.slot == state.slot + 1
assert get_state_root(test_state, state.slot) == state.hash_tree_root() assert get_state_root(test_state, state.slot) == state.hash_tree_root()