enforce beacon state at epoch boundary slot

This commit is contained in:
Danny Ryan 2019-10-05 07:22:20 +09:00
parent dc4869349c
commit 3c3ae9ac02
No known key found for this signature in database
GPG Key ID: 2765A792E42CE07A
2 changed files with 15 additions and 12 deletions

View File

@ -339,12 +339,16 @@ def process_shard_block_header(beacon_state: BeaconState, shard_state: ShardStat
assert block.slot == shard_state.slot
# Verify the beacon chain root
epoch = compute_epoch_of_shard_slot(shard_state.slot)
assert epoch == compute_epoch_of_slot(beacon_state.slot)
if epoch * SLOTS_PER_EPOCH == beacon_state.slot:
beacon_block_root = signing_root(beacon_state.latest_block_header)
else:
beacon_block_root = get_block_root(beacon_state, epoch)
assert block.beacon_block_root == beacon_block_root
assert epoch * SLOTS_PER_EPOCH == beacon_state.slot
beacon_block_header = BeaconBlockHeader(
slot=beacon_state.latest_block_header.slot,
parent_root=beacon_state.latest_block_header.parent_root,
state_root=beacon_state.latest_block_header.state_root,
body_root=beacon_state.latest_block_header.body_root,
)
if beacon_block_header.state_root == Bytes32():
beacon_block_header.state_root = hash_tree_root(beacon_state)
assert block.beacon_block_root == signing_root(beacon_block_header)
# Verify the parent root
assert block.parent_root == signing_root(shard_state.latest_block_header)
# Save current block as the new latest block

View File

@ -41,14 +41,13 @@ def build_empty_shard_block(spec,
if slot is None:
slot = shard_state.slot
epoch = spec.compute_epoch_of_shard_slot(slot)
if epoch * spec.SLOTS_PER_EPOCH == beacon_state.slot:
beacon_block_root = spec.signing_root(beacon_state.latest_block_header)
else:
beacon_block_root = spec.get_block_root(beacon_state, epoch)
previous_beacon_header = deepcopy(beacon_state.latest_block_header)
if previous_beacon_header.state_root == spec.Bytes32():
previous_beacon_header.state_root = beacon_state.hash_tree_root()
beacon_block_root = spec.signing_root(previous_beacon_header)
previous_block_header = deepcopy(shard_state.latest_block_header)
if previous_block_header.state_root == spec.Hash():
if previous_block_header.state_root == spec.Bytes32():
previous_block_header.state_root = shard_state.hash_tree_root()
parent_root = signing_root(previous_block_header)