mirror of
https://github.com/status-im/eth2.0-specs.git
synced 2025-01-12 03:34:20 +00:00
Implement get_start_shard
This commit is contained in:
parent
4cbe51b958
commit
2dc041807a
15
setup.py
15
setup.py
@ -140,7 +140,7 @@ SUNDRY_CONSTANTS_FUNCTIONS = '''
|
|||||||
def ceillog2(x: uint64) -> int:
|
def ceillog2(x: uint64) -> int:
|
||||||
return (x - 1).bit_length()
|
return (x - 1).bit_length()
|
||||||
'''
|
'''
|
||||||
SUNDRY_FUNCTIONS = '''
|
PHASE0_SUNDRY_FUNCTIONS = '''
|
||||||
# Monkey patch hash cache
|
# Monkey patch hash cache
|
||||||
_hash = hash
|
_hash = hash
|
||||||
hash_cache: Dict[bytes, Bytes32] = {}
|
hash_cache: Dict[bytes, Bytes32] = {}
|
||||||
@ -220,6 +220,13 @@ get_attesting_indices = cache_this(
|
|||||||
_get_attesting_indices, lru_size=SLOTS_PER_EPOCH * MAX_COMMITTEES_PER_SLOT * 3)'''
|
_get_attesting_indices, lru_size=SLOTS_PER_EPOCH * MAX_COMMITTEES_PER_SLOT * 3)'''
|
||||||
|
|
||||||
|
|
||||||
|
PHASE1_SUNDRY_FUNCTIONS = '''
|
||||||
|
_get_start_shard = get_start_shard
|
||||||
|
get_start_shard = cache_this(
|
||||||
|
lambda state, slot: (state.validators.hash_tree_root(), slot),
|
||||||
|
_get_start_shard, lru_size=SLOTS_PER_EPOCH * 3)'''
|
||||||
|
|
||||||
|
|
||||||
def objects_to_spec(spec_object: SpecObject, imports: str, fork: str) -> str:
|
def objects_to_spec(spec_object: SpecObject, imports: str, fork: str) -> str:
|
||||||
"""
|
"""
|
||||||
Given all the objects that constitute a spec, combine them into a single pyfile.
|
Given all the objects that constitute a spec, combine them into a single pyfile.
|
||||||
@ -250,9 +257,11 @@ def objects_to_spec(spec_object: SpecObject, imports: str, fork: str) -> str:
|
|||||||
+ '\n\n' + CONFIG_LOADER
|
+ '\n\n' + CONFIG_LOADER
|
||||||
+ '\n\n' + ssz_objects_instantiation_spec
|
+ '\n\n' + ssz_objects_instantiation_spec
|
||||||
+ '\n\n' + functions_spec
|
+ '\n\n' + functions_spec
|
||||||
+ '\n' + SUNDRY_FUNCTIONS
|
+ '\n' + PHASE0_SUNDRY_FUNCTIONS
|
||||||
+ '\n'
|
|
||||||
)
|
)
|
||||||
|
if fork == 'phase1':
|
||||||
|
spec += '\n' + PHASE1_SUNDRY_FUNCTIONS
|
||||||
|
spec += '\n'
|
||||||
return spec
|
return spec
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
- [`get_light_client_committee`](#get_light_client_committee)
|
- [`get_light_client_committee`](#get_light_client_committee)
|
||||||
- [`get_shard_proposer_index`](#get_shard_proposer_index)
|
- [`get_shard_proposer_index`](#get_shard_proposer_index)
|
||||||
- [`get_indexed_attestation`](#get_indexed_attestation)
|
- [`get_indexed_attestation`](#get_indexed_attestation)
|
||||||
|
- [`get_committee_count_delta`](#get_committee_count_delta)
|
||||||
- [`get_start_shard`](#get_start_shard)
|
- [`get_start_shard`](#get_start_shard)
|
||||||
- [`get_shard`](#get_shard)
|
- [`get_shard`](#get_shard)
|
||||||
- [`get_latest_slot_for_shard`](#get_latest_slot_for_shard)
|
- [`get_latest_slot_for_shard`](#get_latest_slot_for_shard)
|
||||||
@ -69,6 +70,7 @@
|
|||||||
- [Shard transition false positives](#shard-transition-false-positives)
|
- [Shard transition false positives](#shard-transition-false-positives)
|
||||||
- [Light client processing](#light-client-processing)
|
- [Light client processing](#light-client-processing)
|
||||||
- [Epoch transition](#epoch-transition)
|
- [Epoch transition](#epoch-transition)
|
||||||
|
- [Phase 1 final updates](#phase-1-final-updates)
|
||||||
- [Custody game updates](#custody-game-updates)
|
- [Custody game updates](#custody-game-updates)
|
||||||
- [Online-tracking](#online-tracking)
|
- [Online-tracking](#online-tracking)
|
||||||
- [Light client committee updates](#light-client-committee-updates)
|
- [Light client committee updates](#light-client-committee-updates)
|
||||||
@ -280,6 +282,7 @@ class BeaconState(Container):
|
|||||||
current_justified_checkpoint: Checkpoint
|
current_justified_checkpoint: Checkpoint
|
||||||
finalized_checkpoint: Checkpoint
|
finalized_checkpoint: Checkpoint
|
||||||
# Phase 1
|
# Phase 1
|
||||||
|
current_epoch_start_shard: Shard
|
||||||
shard_states: List[ShardState, MAX_SHARDS]
|
shard_states: List[ShardState, MAX_SHARDS]
|
||||||
online_countdown: List[OnlineEpochs, VALIDATOR_REGISTRY_LIMIT] # not a raw byte array, considered its large size.
|
online_countdown: List[OnlineEpochs, VALIDATOR_REGISTRY_LIMIT] # not a raw byte array, considered its large size.
|
||||||
current_light_committee: CompactCommittee
|
current_light_committee: CompactCommittee
|
||||||
@ -530,18 +533,53 @@ def get_indexed_attestation(beacon_state: BeaconState, attestation: Attestation)
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### `get_committee_count_delta`
|
||||||
|
|
||||||
|
```python
|
||||||
|
def get_committee_count_delta(state: BeaconState, start_slot: Slot, stop_slot: Slot) -> uint64:
|
||||||
|
"""
|
||||||
|
Return the sum of committee counts between ``[start_slot, stop_slot)``.
|
||||||
|
"""
|
||||||
|
committee_sum = 0
|
||||||
|
for slot in range(start_slot, stop_slot):
|
||||||
|
count = get_committee_count_at_slot(state, Slot(slot))
|
||||||
|
committee_sum += count
|
||||||
|
return committee_sum
|
||||||
|
```
|
||||||
|
|
||||||
#### `get_start_shard`
|
#### `get_start_shard`
|
||||||
|
|
||||||
```python
|
```python
|
||||||
def get_start_shard(state: BeaconState, slot: Slot) -> Shard:
|
def get_start_shard(state: BeaconState, slot: Slot) -> Shard:
|
||||||
# TODO: implement start shard logic
|
"""
|
||||||
return Shard(0)
|
Return the start shard at ``slot``.
|
||||||
|
"""
|
||||||
|
current_epoch_start_slot = compute_start_slot_at_epoch(get_current_epoch(state))
|
||||||
|
active_shard_count = get_active_shard_count(state)
|
||||||
|
if current_epoch_start_slot == slot:
|
||||||
|
return state.current_epoch_start_shard
|
||||||
|
elif current_epoch_start_slot > slot:
|
||||||
|
# Current epoch or the next epoch lookahead
|
||||||
|
shard_delta = get_committee_count_delta(state, start_slot=current_epoch_start_slot, stop_slot=slot)
|
||||||
|
return Shard((state.current_epoch_start_shard + shard_delta) % active_shard_count)
|
||||||
|
else:
|
||||||
|
# Previous epoch
|
||||||
|
shard_delta = get_committee_count_delta(state, start_slot=slot, stop_slot=current_epoch_start_slot)
|
||||||
|
max_committees_per_epoch = MAX_COMMITTEES_PER_SLOT * SLOTS_PER_EPOCH
|
||||||
|
return Shard(
|
||||||
|
# Ensure positive
|
||||||
|
(state.current_epoch_start_shard + max_committees_per_epoch * active_shard_count - shard_delta)
|
||||||
|
% active_shard_count
|
||||||
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `get_shard`
|
#### `get_shard`
|
||||||
|
|
||||||
```python
|
```python
|
||||||
def get_shard(state: BeaconState, attestation: Attestation) -> Shard:
|
def get_shard(state: BeaconState, attestation: Attestation) -> Shard:
|
||||||
|
"""
|
||||||
|
Return the shard that the given attestation is attesting.
|
||||||
|
"""
|
||||||
return compute_shard_from_committee_index(state, attestation.data.index, attestation.data.slot)
|
return compute_shard_from_committee_index(state, attestation.data.index, attestation.data.slot)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -549,6 +587,9 @@ def get_shard(state: BeaconState, attestation: Attestation) -> Shard:
|
|||||||
|
|
||||||
```python
|
```python
|
||||||
def get_latest_slot_for_shard(state: BeaconState, shard: Shard) -> Slot:
|
def get_latest_slot_for_shard(state: BeaconState, shard: Shard) -> Slot:
|
||||||
|
"""
|
||||||
|
Return the latest slot number of the given shard.
|
||||||
|
"""
|
||||||
return state.shard_states[shard].slot
|
return state.shard_states[shard].slot
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -556,7 +597,11 @@ def get_latest_slot_for_shard(state: BeaconState, shard: Shard) -> Slot:
|
|||||||
|
|
||||||
```python
|
```python
|
||||||
def get_offset_slots(state: BeaconState, shard: Shard) -> Sequence[Slot]:
|
def get_offset_slots(state: BeaconState, shard: Shard) -> Sequence[Slot]:
|
||||||
return compute_offset_slots(state.shard_states[shard].slot, state.slot)
|
"""
|
||||||
|
Return the offset slots of the given shard.
|
||||||
|
The offset slot are after the latest slot and before current slot.
|
||||||
|
"""
|
||||||
|
return compute_offset_slots(get_latest_slot_for_shard(state, shard), state.slot)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Predicates
|
### Predicates
|
||||||
@ -993,9 +1038,19 @@ def process_epoch(state: BeaconState) -> None:
|
|||||||
process_reveal_deadlines(state)
|
process_reveal_deadlines(state)
|
||||||
process_slashings(state)
|
process_slashings(state)
|
||||||
process_final_updates(state)
|
process_final_updates(state)
|
||||||
|
process_phase_1_final_updates(state)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Phase 1 final updates
|
||||||
|
|
||||||
|
```python
|
||||||
|
def process_phase_1_final_updates(state: BeaconState) -> None:
|
||||||
process_custody_final_updates(state)
|
process_custody_final_updates(state)
|
||||||
process_online_tracking(state)
|
process_online_tracking(state)
|
||||||
process_light_client_committee_updates(state)
|
process_light_client_committee_updates(state)
|
||||||
|
|
||||||
|
# Update current_epoch_start_shard
|
||||||
|
state.current_epoch_start_shard = get_start_shard(state, state.slot)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Custody game updates
|
#### Custody game updates
|
||||||
|
@ -99,6 +99,7 @@ def upgrade_to_phase1(pre: phase0.BeaconState) -> BeaconState:
|
|||||||
current_justified_checkpoint=pre.current_justified_checkpoint,
|
current_justified_checkpoint=pre.current_justified_checkpoint,
|
||||||
finalized_checkpoint=pre.finalized_checkpoint,
|
finalized_checkpoint=pre.finalized_checkpoint,
|
||||||
# Phase 1
|
# Phase 1
|
||||||
|
current_epoch_start_shard=Shard(0),
|
||||||
shard_states=List[ShardState, MAX_SHARDS](
|
shard_states=List[ShardState, MAX_SHARDS](
|
||||||
ShardState(
|
ShardState(
|
||||||
slot=pre.slot,
|
slot=pre.slot,
|
||||||
|
@ -18,7 +18,7 @@ def run_basic_crosslink_tests(spec, state, target_len_offset_slot, valid=True):
|
|||||||
# At the beginning, let `x = state.slot`, `state.shard_states[shard].slot == x - 1`
|
# At the beginning, let `x = state.slot`, `state.shard_states[shard].slot == x - 1`
|
||||||
slot_x = state.slot
|
slot_x = state.slot
|
||||||
committee_index = spec.CommitteeIndex(0)
|
committee_index = spec.CommitteeIndex(0)
|
||||||
shard = spec.compute_shard_from_committee_index(state, committee_index, state.slot)
|
shard = spec.compute_shard_from_committee_index(state, committee_index, state.slot + target_len_offset_slot)
|
||||||
assert state.shard_states[shard].slot == slot_x - 1
|
assert state.shard_states[shard].slot == slot_x - 1
|
||||||
|
|
||||||
# Create SignedShardBlock
|
# Create SignedShardBlock
|
||||||
|
@ -67,7 +67,7 @@ def test_process_beacon_block_with_normal_shard_transition(spec, state):
|
|||||||
|
|
||||||
target_len_offset_slot = 1
|
target_len_offset_slot = 1
|
||||||
committee_index = spec.CommitteeIndex(0)
|
committee_index = spec.CommitteeIndex(0)
|
||||||
shard = spec.compute_shard_from_committee_index(state, committee_index, state.slot)
|
shard = spec.compute_shard_from_committee_index(state, committee_index, state.slot + target_len_offset_slot)
|
||||||
assert state.shard_states[shard].slot == state.slot - 1
|
assert state.shard_states[shard].slot == state.slot - 1
|
||||||
|
|
||||||
pre_gasprice = state.shard_states[shard].gasprice
|
pre_gasprice = state.shard_states[shard].gasprice
|
||||||
@ -93,7 +93,7 @@ def test_process_beacon_block_with_empty_proposal_transition(spec, state):
|
|||||||
|
|
||||||
target_len_offset_slot = 1
|
target_len_offset_slot = 1
|
||||||
committee_index = spec.CommitteeIndex(0)
|
committee_index = spec.CommitteeIndex(0)
|
||||||
shard = spec.compute_shard_from_committee_index(state, committee_index, state.slot)
|
shard = spec.compute_shard_from_committee_index(state, committee_index, state.slot + target_len_offset_slot)
|
||||||
assert state.shard_states[shard].slot == state.slot - 1
|
assert state.shard_states[shard].slot == state.slot - 1
|
||||||
|
|
||||||
# No new shard block
|
# No new shard block
|
||||||
|
Loading…
x
Reference in New Issue
Block a user