diff --git a/specs/phase1/shard-fork-choice.md b/specs/phase1/shard-fork-choice.md index 411ad9b6b..8d64eb842 100644 --- a/specs/phase1/shard-fork-choice.md +++ b/specs/phase1/shard-fork-choice.md @@ -169,14 +169,14 @@ def on_shard_block(store: Store, shard_store: ShardStore, signed_shard_block: Si ) # Check the block is valid and compute the post-state - assert verify_shard_block_message(beacon_parent_state, shard_parent_state, shard_block) - assert verify_shard_block_signature(beacon_parent_state, signed_shard_block) - - post_state = get_post_shard_state(shard_parent_state, shard_block) + shard_state = shard_parent_state.copy() + shard_state_transition( + shard_state, signed_shard_block, + validate=True, beacon_parent_state=beacon_parent_state) # Add new block to the store shard_store.blocks[hash_tree_root(shard_block)] = shard_block # Add new state for this block to the store - shard_store.block_states[hash_tree_root(shard_block)] = post_state + shard_store.block_states[hash_tree_root(shard_block)] = shard_state ``` diff --git a/specs/phase1/shard-transition.md b/specs/phase1/shard-transition.md index bb3e76a4f..05f986000 100644 --- a/specs/phase1/shard-transition.md +++ b/specs/phase1/shard-transition.md @@ -50,10 +50,10 @@ def verify_shard_block_message(beacon_parent_state: BeaconState, ``` ```python -def verify_shard_block_signature(beacon_state: BeaconState, +def verify_shard_block_signature(beacon_parent_state: BeaconState, signed_block: SignedShardBlock) -> bool: - proposer = beacon_state.validators[signed_block.message.proposer_index] - domain = get_domain(beacon_state, DOMAIN_SHARD_PROPOSAL, compute_epoch_at_slot(signed_block.message.slot)) + proposer = beacon_parent_state.validators[signed_block.message.proposer_index] + domain = get_domain(beacon_parent_state, DOMAIN_SHARD_PROPOSAL, compute_epoch_at_slot(signed_block.message.slot)) signing_root = compute_signing_root(signed_block.message, domain) return bls.Verify(proposer.pubkey, signing_root, signed_block.signature) ``` @@ -62,7 +62,21 @@ def verify_shard_block_signature(beacon_state: BeaconState, ```python def shard_state_transition(shard_state: ShardState, - block: ShardBlock) -> None: + signed_block: SignedShardBlock, + validate: bool = True, + beacon_parent_state: Optional[BeaconState] = None) -> ShardState: + if validate: + assert beacon_parent_state is not None + assert verify_shard_block_message(beacon_parent_state, shard_state, signed_block.message) + assert verify_shard_block_signature(beacon_parent_state, signed_block) + + process_shard_block(shard_state, signed_block.message) + return shard_state +``` + +```python +def process_shard_block(shard_state: ShardState, + block: ShardBlock) -> None: """ Update ``shard_state`` with shard ``block``. """ @@ -77,19 +91,6 @@ def shard_state_transition(shard_state: ShardState, shard_state.latest_block_root = latest_block_root ``` -We have a pure function `get_post_shard_state` for describing the fraud proof verification and honest validator behavior. - -```python -def get_post_shard_state(shard_state: ShardState, - block: ShardBlock) -> ShardState: - """ - A pure function that returns a new post ShardState instead of modifying the given `shard_state`. - """ - post_state = shard_state.copy() - shard_state_transition(post_state, block) - return post_state -``` - ## Fraud proofs ### Verifying the proof @@ -127,7 +128,7 @@ def is_valid_fraud_proof(beacon_state: BeaconState, else: shard_state = transition.shard_states[offset_index - 1] # Not doing the actual state updates here. - shard_state = get_post_shard_state(shard_state, block) + shard_state_transition(shard_state, block, validate=False) if shard_state != transition.shard_states[offset_index]: return True diff --git a/specs/phase1/validator.md b/specs/phase1/validator.md index fd3b7fef6..8b7ade60b 100644 --- a/specs/phase1/validator.md +++ b/specs/phase1/validator.md @@ -280,7 +280,6 @@ def get_shard_transition_fields( beacon_state: BeaconState, shard: Shard, shard_blocks: Sequence[SignedShardBlock], - validate_signature: bool=True, ) -> Tuple[Sequence[uint64], Sequence[Root], Sequence[ShardState]]: shard_states = [] shard_data_roots = [] @@ -299,7 +298,8 @@ def get_shard_transition_fields( else: shard_block = SignedShardBlock(message=ShardBlock(slot=slot, shard=shard)) shard_data_roots.append(Root()) - shard_state = get_post_shard_state(shard_state, shard_block.message) + shard_state = shard_state.copy() + shard_state_transition(shard_state, shard_block, validate=False) shard_states.append(shard_state) shard_block_lengths.append(len(shard_block.message.body))