Merge pull request #1560 from ethereum/vbuterin-patch-1
Remove shard block chunking
This commit is contained in:
commit
b7004a961c
|
@ -48,7 +48,7 @@ from dataclasses import (
|
||||||
from eth2spec.utils.ssz.ssz_impl import hash_tree_root
|
from eth2spec.utils.ssz.ssz_impl import hash_tree_root
|
||||||
from eth2spec.utils.ssz.ssz_typing import (
|
from eth2spec.utils.ssz.ssz_typing import (
|
||||||
View, boolean, Container, List, Vector, uint64, uint8, bit,
|
View, boolean, Container, List, Vector, uint64, uint8, bit,
|
||||||
ByteVector, ByteList, Bytes1, Bytes4, Bytes8, Bytes32, Bytes48, Bytes96, Bitlist, Bitvector,
|
ByteList, Bytes1, Bytes4, Bytes8, Bytes32, Bytes48, Bytes96, Bitlist, Bitvector,
|
||||||
)
|
)
|
||||||
from eth2spec.utils import bls
|
from eth2spec.utils import bls
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
- [`get_previous_slot`](#get_previous_slot)
|
- [`get_previous_slot`](#get_previous_slot)
|
||||||
- [`pack_compact_validator`](#pack_compact_validator)
|
- [`pack_compact_validator`](#pack_compact_validator)
|
||||||
- [`committee_to_compact_committee`](#committee_to_compact_committee)
|
- [`committee_to_compact_committee`](#committee_to_compact_committee)
|
||||||
- [`chunks_to_body_root`](#chunks_to_body_root)
|
|
||||||
- [`compute_shard_from_committee_index`](#compute_shard_from_committee_index)
|
- [`compute_shard_from_committee_index`](#compute_shard_from_committee_index)
|
||||||
- [Beacon state accessors](#beacon-state-accessors)
|
- [Beacon state accessors](#beacon-state-accessors)
|
||||||
- [`get_active_shard_count`](#get_active_shard_count)
|
- [`get_active_shard_count`](#get_active_shard_count)
|
||||||
|
@ -97,9 +96,8 @@ Configuration is not namespaced. Instead it is strictly an extension;
|
||||||
| `LIGHT_CLIENT_COMMITTEE_SIZE` | `2**7` (= 128) |
|
| `LIGHT_CLIENT_COMMITTEE_SIZE` | `2**7` (= 128) |
|
||||||
| `LIGHT_CLIENT_COMMITTEE_PERIOD` | `Epoch(2**8)` (= 256) | epochs | ~27 hours |
|
| `LIGHT_CLIENT_COMMITTEE_PERIOD` | `Epoch(2**8)` (= 256) | epochs | ~27 hours |
|
||||||
| `SHARD_COMMITTEE_PERIOD` | `Epoch(2**8)` (= 256) | epochs | ~27 hours |
|
| `SHARD_COMMITTEE_PERIOD` | `Epoch(2**8)` (= 256) | epochs | ~27 hours |
|
||||||
| `SHARD_BLOCK_CHUNK_SIZE` | `2**18` (= 262,144) | |
|
| `MAX_SHARD_BLOCK_SIZE` | `2**20` (= 1,048,576) | |
|
||||||
| `MAX_SHARD_BLOCK_CHUNKS` | `2**2` (= 4) | |
|
| `TARGET_SHARD_BLOCK_SIZE` | `2**18` (= 262,144) | |
|
||||||
| `TARGET_SHARD_BLOCK_SIZE` | `3 * 2**16` (= 196,608) | |
|
|
||||||
| `SHARD_BLOCK_OFFSETS` | `[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]` | |
|
| `SHARD_BLOCK_OFFSETS` | `[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]` | |
|
||||||
| `MAX_SHARD_BLOCKS_PER_ATTESTATION` | `len(SHARD_BLOCK_OFFSETS)` | |
|
| `MAX_SHARD_BLOCKS_PER_ATTESTATION` | `len(SHARD_BLOCK_OFFSETS)` | |
|
||||||
| `MAX_GASPRICE` | `Gwei(2**14)` (= 16,384) | Gwei | |
|
| `MAX_GASPRICE` | `Gwei(2**14)` (= 16,384) | Gwei | |
|
||||||
|
@ -297,7 +295,7 @@ class ShardBlockWrapper(Container):
|
||||||
shard_parent_root: Root
|
shard_parent_root: Root
|
||||||
beacon_parent_root: Root
|
beacon_parent_root: Root
|
||||||
slot: Slot
|
slot: Slot
|
||||||
body: ByteList[MAX_SHARD_BLOCK_CHUNKS * SHARD_BLOCK_CHUNK_SIZE]
|
body: ByteList[MAX_SHARD_BLOCK_SIZE]
|
||||||
signature: BLSSignature
|
signature: BLSSignature
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -330,7 +328,7 @@ class ShardTransition(Container):
|
||||||
# Shard block lengths
|
# Shard block lengths
|
||||||
shard_block_lengths: List[uint64, MAX_SHARD_BLOCKS_PER_ATTESTATION]
|
shard_block_lengths: List[uint64, MAX_SHARD_BLOCKS_PER_ATTESTATION]
|
||||||
# Shard data roots
|
# Shard data roots
|
||||||
shard_data_roots: List[List[Bytes32, MAX_SHARD_BLOCK_CHUNKS], MAX_SHARD_BLOCKS_PER_ATTESTATION]
|
shard_data_roots: List[Bytes32, MAX_SHARD_BLOCKS_PER_ATTESTATION]
|
||||||
# Intermediate shard states
|
# Intermediate shard states
|
||||||
shard_states: List[ShardState, MAX_SHARD_BLOCKS_PER_ATTESTATION]
|
shard_states: List[ShardState, MAX_SHARD_BLOCKS_PER_ATTESTATION]
|
||||||
# Proposer signature aggregate
|
# Proposer signature aggregate
|
||||||
|
@ -396,16 +394,6 @@ def committee_to_compact_committee(state: BeaconState, committee: Sequence[Valid
|
||||||
return CompactCommittee(pubkeys=pubkeys, compact_validators=compact_validators)
|
return CompactCommittee(pubkeys=pubkeys, compact_validators=compact_validators)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `chunks_to_body_root`
|
|
||||||
|
|
||||||
```python
|
|
||||||
def chunks_to_body_root(chunks: List[Bytes32, MAX_SHARD_BLOCK_CHUNKS]) -> Root:
|
|
||||||
empty_chunk_root = hash_tree_root(ByteList[SHARD_BLOCK_CHUNK_SIZE]())
|
|
||||||
return hash_tree_root(Vector[Bytes32, MAX_SHARD_BLOCK_CHUNKS](
|
|
||||||
chunks + [empty_chunk_root] * (MAX_SHARD_BLOCK_CHUNKS - len(chunks))
|
|
||||||
))
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `compute_shard_from_committee_index`
|
#### `compute_shard_from_committee_index`
|
||||||
|
|
||||||
```python
|
```python
|
||||||
|
@ -666,20 +654,18 @@ def apply_shard_transition(state: BeaconState, shard: Shard, transition: ShardTr
|
||||||
shard_parent_root=shard_parent_root,
|
shard_parent_root=shard_parent_root,
|
||||||
parent_hash=get_block_root_at_slot(state, get_previous_slot(state.slot)),
|
parent_hash=get_block_root_at_slot(state, get_previous_slot(state.slot)),
|
||||||
slot=offset_slots[i],
|
slot=offset_slots[i],
|
||||||
body_root=chunks_to_body_root(transition.shard_data_roots[i])
|
body_root=transition.shard_data_roots[i]
|
||||||
))
|
))
|
||||||
proposers.append(get_shard_proposer_index(state, shard, offset_slots[i]))
|
proposers.append(get_shard_proposer_index(state, shard, offset_slots[i]))
|
||||||
shard_parent_root = hash_tree_root(headers[-1])
|
shard_parent_root = hash_tree_root(headers[-1])
|
||||||
|
|
||||||
# Verify correct calculation of gas prices and slots and chunk roots
|
# Verify correct calculation of gas prices and slots
|
||||||
prev_gasprice = state.shard_states[shard].gasprice
|
prev_gasprice = state.shard_states[shard].gasprice
|
||||||
for i in range(len(offset_slots)):
|
for i in range(len(offset_slots)):
|
||||||
shard_state = transition.shard_states[i]
|
shard_state = transition.shard_states[i]
|
||||||
block_length = transition.shard_block_lengths[i]
|
block_length = transition.shard_block_lengths[i]
|
||||||
chunks = transition.shard_data_roots[i]
|
|
||||||
assert shard_state.gasprice == get_updated_gasprice(prev_gasprice, block_length)
|
assert shard_state.gasprice == get_updated_gasprice(prev_gasprice, block_length)
|
||||||
assert shard_state.slot == offset_slots[i]
|
assert shard_state.slot == offset_slots[i]
|
||||||
assert len(chunks) == block_length // SHARD_BLOCK_CHUNK_SIZE
|
|
||||||
prev_gasprice = shard_state.gasprice
|
prev_gasprice = shard_state.gasprice
|
||||||
|
|
||||||
pubkeys = [state.validators[proposer].pubkey for proposer in proposers]
|
pubkeys = [state.validators[proposer].pubkey for proposer in proposers]
|
||||||
|
@ -724,10 +710,7 @@ def process_crosslink_for_shard(state: BeaconState,
|
||||||
|
|
||||||
# Attestation <-> shard transition consistency
|
# Attestation <-> shard transition consistency
|
||||||
assert shard_transition_root == hash_tree_root(shard_transition)
|
assert shard_transition_root == hash_tree_root(shard_transition)
|
||||||
assert (
|
assert attestation.data.head_shard_root == shard_transition.shard_data_roots[-1]
|
||||||
attestation.data.head_shard_root
|
|
||||||
== chunks_to_body_root(shard_transition.shard_data_roots[-1])
|
|
||||||
)
|
|
||||||
|
|
||||||
# Apply transition
|
# Apply transition
|
||||||
apply_shard_transition(state, shard, shard_transition)
|
apply_shard_transition(state, shard, shard_transition)
|
||||||
|
@ -921,4 +904,3 @@ def process_light_client_committee_updates(state: BeaconState) -> None:
|
||||||
new_committee = get_light_client_committee(state, get_current_epoch(state) + LIGHT_CLIENT_COMMITTEE_PERIOD)
|
new_committee = get_light_client_committee(state, get_current_epoch(state) + LIGHT_CLIENT_COMMITTEE_PERIOD)
|
||||||
state.next_light_committee = committee_to_compact_committee(state, new_committee)
|
state.next_light_committee = committee_to_compact_committee(state, new_committee)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ class CustodySlashing(Container):
|
||||||
whistleblower_index: ValidatorIndex
|
whistleblower_index: ValidatorIndex
|
||||||
shard_transition: ShardTransition
|
shard_transition: ShardTransition
|
||||||
attestation: Attestation
|
attestation: Attestation
|
||||||
data: ByteList[MAX_SHARD_BLOCK_CHUNKS * SHARD_BLOCK_CHUNK_SIZE]
|
data: ByteList[MAX_SHARD_BLOCK_SIZE]
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `SignedCustodySlashing`
|
#### `SignedCustodySlashing`
|
||||||
|
@ -366,8 +366,7 @@ def process_custody_slashing(state: BeaconState, signed_custody_slashing: Signed
|
||||||
shard_transition = custody_slashing.shard_transition
|
shard_transition = custody_slashing.shard_transition
|
||||||
assert hash_tree_root(shard_transition) == attestation.shard_transition_root
|
assert hash_tree_root(shard_transition) == attestation.shard_transition_root
|
||||||
# Verify that the provided data matches the shard-transition
|
# Verify that the provided data matches the shard-transition
|
||||||
shard_chunk_roots = shard_transition.shard_data_roots[custody_slashing.data_index]
|
assert hash_tree_root(custody_slashing.data) == shard_transition.shard_data_roots[custody_slashing.data_index]
|
||||||
assert hash_tree_root(custody_slashing.data) == chunks_to_body_root(shard_chunk_roots)
|
|
||||||
|
|
||||||
# Verify existence and participation of claimed malefactor
|
# Verify existence and participation of claimed malefactor
|
||||||
attesters = get_attesting_indices(state, attestation.data, attestation.aggregation_bits)
|
attesters = get_attesting_indices(state, attestation.data, attestation.aggregation_bits)
|
||||||
|
|
|
@ -50,7 +50,7 @@ def shard_state_transition(shard: Shard,
|
||||||
pre_state: Root,
|
pre_state: Root,
|
||||||
previous_beacon_root: Root,
|
previous_beacon_root: Root,
|
||||||
proposer_pubkey: BLSPubkey,
|
proposer_pubkey: BLSPubkey,
|
||||||
block_data: ByteVector[MAX_SHARD_BLOCK_CHUNKS * SHARD_BLOCK_CHUNK_SIZE]) -> Root:
|
block_data: ByteList[MAX_SHARD_BLOCK_SIZE]) -> Root:
|
||||||
# We will add something more substantive in phase 2
|
# We will add something more substantive in phase 2
|
||||||
return hash(pre_state + hash_tree_root(previous_beacon_root) + hash_tree_root(block_data))
|
return hash(pre_state + hash_tree_root(previous_beacon_root) + hash_tree_root(block_data))
|
||||||
```
|
```
|
||||||
|
|
Loading…
Reference in New Issue