Merge branch 'dev' into refactor-spec-builder2

This commit is contained in:
Hsiao-Wei Wang 2021-04-16 11:03:57 +08:00
commit e8c3d28a86
No known key found for this signature in database
GPG Key ID: 1111A8A81778319E
60 changed files with 328 additions and 129 deletions

View File

@ -1,7 +1,5 @@
# Mainnet preset - Altair # Mainnet preset - Altair
CONFIG_NAME: "mainnet"
# Updated penalty values # Updated penalty values
# --------------------------------------------------------------- # ---------------------------------------------------------------
# 3 * 2**24 (= 50,331,648) # 3 * 2**24 (= 50,331,648)
@ -51,3 +49,9 @@ MIN_SYNC_COMMITTEE_PARTICIPANTS: 1
MAX_VALID_LIGHT_CLIENT_UPDATES: 8192 MAX_VALID_LIGHT_CLIENT_UPDATES: 8192
# 2**13 (=8192) # 2**13 (=8192)
LIGHT_CLIENT_UPDATE_TIMEOUT: 8192 LIGHT_CLIENT_UPDATE_TIMEOUT: 8192
# Validator
# ---------------------------------------------------------------
# 2**2 (= 4)
TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE: 4

View File

@ -1,7 +1,5 @@
# Mainnet preset - Custody Game # Mainnet preset - Custody Game
CONFIG_NAME: "mainnet"
# Time parameters # Time parameters
# --------------------------------------------------------------- # ---------------------------------------------------------------
# 2**1 (= 2) epochs, 12.8 minutes # 2**1 (= 2) epochs, 12.8 minutes

View File

@ -1,7 +1,5 @@
# Mainnet preset - The Merge # Mainnet preset - The Merge
CONFIG_NAME: "mainnet"
# Fork # Fork
# --------------------------------------------------------------- # ---------------------------------------------------------------
MERGE_FORK_VERSION: 0x02000000 MERGE_FORK_VERSION: 0x02000000

View File

@ -1,7 +1,5 @@
# Mainnet preset # Mainnet preset
CONFIG_NAME: "mainnet"
# Misc # Misc
# --------------------------------------------------------------- # ---------------------------------------------------------------
# 2**6 (= 64) # 2**6 (= 64)

View File

@ -1,7 +1,5 @@
# Mainnet preset - Sharding # Mainnet preset - Sharding
CONFIG_NAME: "mainnet"
# Fork # Fork
# --------------------------------------------------------------- # ---------------------------------------------------------------
SHARDING_FORK_VERSION: 0x03000000 SHARDING_FORK_VERSION: 0x03000000

View File

@ -1,7 +1,5 @@
# Minimal preset - Altair # Minimal preset - Altair
CONFIG_NAME: "minimal"
# Updated penalty values # Updated penalty values
# --------------------------------------------------------------- # ---------------------------------------------------------------
# 3 * 2**24 (= 50,331,648) # 3 * 2**24 (= 50,331,648)
@ -51,3 +49,8 @@ MIN_SYNC_COMMITTEE_PARTICIPANTS: 1
MAX_VALID_LIGHT_CLIENT_UPDATES: 32 MAX_VALID_LIGHT_CLIENT_UPDATES: 32
# [customized] # [customized]
LIGHT_CLIENT_UPDATE_TIMEOUT: 32 LIGHT_CLIENT_UPDATE_TIMEOUT: 32
# Validator
# ---------------------------------------------------------------
# 2**2 (= 4)
TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE: 4

View File

@ -1,7 +1,5 @@
# Minimal preset - Custody Game # Minimal preset - Custody Game
CONFIG_NAME: "minimal"
# Time parameters # Time parameters
# --------------------------------------------------------------- # ---------------------------------------------------------------
# 2**1 (= 2) epochs, 12.8 minutes # 2**1 (= 2) epochs, 12.8 minutes

View File

@ -1,7 +1,5 @@
# Minimal preset - The Merge # Minimal preset - The Merge
CONFIG_NAME: "minimal"
# Fork # Fork
# --------------------------------------------------------------- # ---------------------------------------------------------------
MERGE_FORK_VERSION: 0x02000001 MERGE_FORK_VERSION: 0x02000001

View File

@ -1,7 +1,5 @@
# Minimal preset # Minimal preset
CONFIG_NAME: "minimal"
# Misc # Misc
# --------------------------------------------------------------- # ---------------------------------------------------------------

View File

@ -1,7 +1,5 @@
# Minimal preset - Sharding # Minimal preset - Sharding
CONFIG_NAME: "minimal"
# Fork # Fork
# --------------------------------------------------------------- # ---------------------------------------------------------------
SHARDING_FORK_VERSION: 0x03000001 SHARDING_FORK_VERSION: 0x03000001

View File

@ -396,11 +396,11 @@ def get_pow_chain_head() -> PowBlock:
pass pass
def execution_state_transition(execution_state: ExecutionState, execution_payload: ExecutionPayload) -> None: def verify_execution_state_transition(execution_payload: ExecutionPayload) -> bool:
pass return True
def produce_execution_payload(parent_hash: Bytes32) -> ExecutionPayload: def produce_execution_payload(parent_hash: Hash32, timestamp: uint64) -> ExecutionPayload:
pass""" pass"""
@ -743,7 +743,7 @@ setup(
"py_ecc==5.2.0", "py_ecc==5.2.0",
"milagro_bls_binding==1.6.3", "milagro_bls_binding==1.6.3",
"dataclasses==0.6", "dataclasses==0.6",
"remerkleable==0.1.18", "remerkleable==0.1.19",
"ruamel.yaml==0.16.5", "ruamel.yaml==0.16.5",
"lru-dict==1.1.6", "lru-dict==1.1.6",
] ]

View File

@ -26,10 +26,10 @@
- [Misc](#misc) - [Misc](#misc)
- [`is_transition_completed`](#is_transition_completed) - [`is_transition_completed`](#is_transition_completed)
- [`is_transition_block`](#is_transition_block) - [`is_transition_block`](#is_transition_block)
- [`compute_time_at_slot`](#compute_time_at_slot)
- [Block processing](#block-processing) - [Block processing](#block-processing)
- [Execution payload processing](#execution-payload-processing) - [Execution payload processing](#execution-payload-processing)
- [`get_execution_state`](#get_execution_state) - [`verify_execution_state_transition`](#verify_execution_state_transition)
- [`execution_state_transition`](#execution_state_transition)
- [`process_execution_payload`](#process_execution_payload) - [`process_execution_payload`](#process_execution_payload)
<!-- END doctoc generated TOC please keep comment here to allow auto update --> <!-- END doctoc generated TOC please keep comment here to allow auto update -->
@ -98,13 +98,14 @@ The execution payload included in a `BeaconBlockBody`.
```python ```python
class ExecutionPayload(Container): class ExecutionPayload(Container):
block_hash: Bytes32 # Hash of execution block block_hash: Hash32 # Hash of execution block
parent_hash: Bytes32 parent_hash: Hash32
coinbase: Bytes20 coinbase: Bytes20
state_root: Bytes32 state_root: Bytes32
number: uint64 number: uint64
gas_limit: uint64 gas_limit: uint64
gas_used: uint64 gas_used: uint64
timestamp: uint64
receipt_root: Bytes32 receipt_root: Bytes32
logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM] logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM]
transactions: List[OpaqueTransaction, MAX_APPLICATION_TRANSACTIONS] transactions: List[OpaqueTransaction, MAX_APPLICATION_TRANSACTIONS]
@ -118,13 +119,14 @@ The execution payload header included in a `BeaconState`.
```python ```python
class ExecutionPayloadHeader(Container): class ExecutionPayloadHeader(Container):
block_hash: Bytes32 # Hash of execution block block_hash: Hash32 # Hash of execution block
parent_hash: Bytes32 parent_hash: Hash32
coinbase: Bytes20 coinbase: Bytes20
state_root: Bytes32 state_root: Bytes32
number: uint64 number: uint64
gas_limit: uint64 gas_limit: uint64
gas_used: uint64 gas_used: uint64
timestamp: uint64
receipt_root: Bytes32 receipt_root: Bytes32
logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM] logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM]
transactions_root: Root transactions_root: Root
@ -137,17 +139,27 @@ class ExecutionPayloadHeader(Container):
#### `is_transition_completed` #### `is_transition_completed`
```python ```python
def is_transition_completed(state: BeaconState) -> boolean: def is_transition_completed(state: BeaconState) -> bool:
return state.latest_execution_payload_header != ExecutionPayloadHeader() return state.latest_execution_payload_header != ExecutionPayloadHeader()
``` ```
#### `is_transition_block` #### `is_transition_block`
```python ```python
def is_transition_block(state: BeaconState, block_body: BeaconBlockBody) -> boolean: def is_transition_block(state: BeaconState, block_body: BeaconBlockBody) -> bool:
return not is_transition_completed(state) and block_body.execution_payload != ExecutionPayload() return not is_transition_completed(state) and block_body.execution_payload != ExecutionPayload()
``` ```
#### `compute_time_at_slot`
*Note*: This function is unsafe with respect to overflows and underflows.
```python
def compute_time_at_slot(state: BeaconState, slot: Slot) -> uint64:
slots_since_genesis = slot - GENESIS_SLOT
return uint64(state.genesis_time + slots_since_genesis * SECONDS_PER_SLOT)
```
### Block processing ### Block processing
```python ```python
@ -161,20 +173,11 @@ def process_block(state: BeaconState, block: BeaconBlock) -> None:
#### Execution payload processing #### Execution payload processing
##### `get_execution_state` ##### `verify_execution_state_transition`
*Note*: `ExecutionState` class is an abstract class representing Ethereum execution state. Let `verify_execution_state_transition(execution_payload: ExecutionPayload) -> bool` be the function that verifies given `ExecutionPayload` with respect to execution state transition.
Let `get_execution_state(execution_state_root: Bytes32) -> ExecutionState` be the function that given the root hash returns a copy of Ethereum execution state.
The body of the function is implementation dependent. The body of the function is implementation dependent.
##### `execution_state_transition`
Let `execution_state_transition(execution_state: ExecutionState, execution_payload: ExecutionPayload) -> None` be the transition function of Ethereum execution state.
The body of the function is implementation dependent.
*Note*: `execution_state_transition` must throw `AssertionError` if either the transition itself or one of the pre or post conditions has failed.
##### `process_execution_payload` ##### `process_execution_payload`
```python ```python
@ -192,8 +195,9 @@ def process_execution_payload(state: BeaconState, body: BeaconBlockBody) -> None
assert execution_payload.parent_hash == state.latest_execution_payload_header.block_hash assert execution_payload.parent_hash == state.latest_execution_payload_header.block_hash
assert execution_payload.number == state.latest_execution_payload_header.number + 1 assert execution_payload.number == state.latest_execution_payload_header.number + 1
execution_state = get_execution_state(state.latest_execution_payload_header.state_root) assert execution_payload.timestamp == compute_time_at_slot(state, state.slot)
execution_state_transition(execution_state, execution_payload)
assert verify_execution_state_transition(execution_payload)
state.latest_execution_payload_header = ExecutionPayloadHeader( state.latest_execution_payload_header = ExecutionPayloadHeader(
block_hash=execution_payload.block_hash, block_hash=execution_payload.block_hash,
@ -203,6 +207,7 @@ def process_execution_payload(state: BeaconState, body: BeaconBlockBody) -> None
number=execution_payload.number, number=execution_payload.number,
gas_limit=execution_payload.gas_limit, gas_limit=execution_payload.gas_limit,
gas_used=execution_payload.gas_used, gas_used=execution_payload.gas_used,
timestamp=execution_payload.timestamp,
receipt_root=execution_payload.receipt_root, receipt_root=execution_payload.receipt_root,
logs_bloom=execution_payload.logs_bloom, logs_bloom=execution_payload.logs_bloom,
transactions_root=hash_tree_root(execution_payload.transactions), transactions_root=hash_tree_root(execution_payload.transactions),

View File

@ -30,7 +30,7 @@ This is the modification of the fork choice according to the executable beacon c
```python ```python
class PowBlock(Container): class PowBlock(Container):
block_hash: Bytes32 block_hash: Hash32
is_processed: boolean is_processed: boolean
is_valid: boolean is_valid: boolean
total_difficulty: uint256 total_difficulty: uint256
@ -38,7 +38,7 @@ class PowBlock(Container):
#### `get_pow_block` #### `get_pow_block`
Let `get_pow_block(hash: Bytes32) -> PowBlock` be the function that given the hash of the PoW block returns its data. Let `get_pow_block(block_hash: Hash32) -> PowBlock` be the function that given the hash of the PoW block returns its data.
*Note*: The `eth_getBlockByHash` JSON-RPC method does not distinguish invalid blocks from blocks that haven't been processed yet. Either extending this existing method or implementing a new one is required. *Note*: The `eth_getBlockByHash` JSON-RPC method does not distinguish invalid blocks from blocks that haven't been processed yet. Either extending this existing method or implementing a new one is required.
@ -47,7 +47,7 @@ Let `get_pow_block(hash: Bytes32) -> PowBlock` be the function that given the ha
Used by fork-choice handler, `on_block`. Used by fork-choice handler, `on_block`.
```python ```python
def is_valid_transition_block(block: PowBlock) -> boolean: def is_valid_transition_block(block: PowBlock) -> bool:
is_total_difficulty_reached = block.total_difficulty >= TRANSITION_TOTAL_DIFFICULTY is_total_difficulty_reached = block.total_difficulty >= TRANSITION_TOTAL_DIFFICULTY
return block.is_valid and is_total_difficulty_reached return block.is_valid and is_total_difficulty_reached
``` ```
@ -113,4 +113,3 @@ def on_block(store: Store, signed_block: SignedBeaconBlock) -> None:
if ancestor_at_finalized_slot != store.finalized_checkpoint.root: if ancestor_at_finalized_slot != store.finalized_checkpoint.root:
store.justified_checkpoint = state.current_justified_checkpoint store.justified_checkpoint = state.current_justified_checkpoint
``` ```

View File

@ -48,7 +48,7 @@ Let `get_pow_chain_head() -> PowBlock` be the function that returns the head of
###### `produce_execution_payload` ###### `produce_execution_payload`
Let `produce_execution_payload(parent_hash: Bytes32) -> ExecutionPayload` be the function that produces new instance of execution payload. Let `produce_execution_payload(parent_hash: Hash32, timestamp: uint64) -> ExecutionPayload` be the function that produces new instance of execution payload.
The body of this function is implementation dependent. The body of this function is implementation dependent.
* Set `block.body.execution_payload = get_execution_payload(state)` where: * Set `block.body.execution_payload = get_execution_payload(state)` where:
@ -62,9 +62,11 @@ def get_execution_payload(state: BeaconState) -> ExecutionPayload:
return ExecutionPayload() return ExecutionPayload()
else: else:
# Signify merge via producing on top of the last PoW block # Signify merge via producing on top of the last PoW block
return produce_execution_payload(pow_block.block_hash) timestamp = compute_time_at_slot(state, state.slot)
return produce_execution_payload(pow_block.block_hash, timestamp)
# Post-merge, normal payload # Post-merge, normal payload
execution_parent_hash = state.latest_execution_payload_header.block_hash execution_parent_hash = state.latest_execution_payload_header.block_hash
return produce_execution_payload(execution_parent_hash) timestamp = compute_time_at_slot(state, state.slot)
return produce_execution_payload(execution_parent_hash, timestamp)
``` ```

View File

@ -157,6 +157,7 @@ We define the following Python custom types for type hinting and readability:
| `ValidatorIndex` | `uint64` | a validator registry index | | `ValidatorIndex` | `uint64` | a validator registry index |
| `Gwei` | `uint64` | an amount in Gwei | | `Gwei` | `uint64` | an amount in Gwei |
| `Root` | `Bytes32` | a Merkle root | | `Root` | `Bytes32` | a Merkle root |
| `Hash32` | `Bytes32` | a 256-bit hash |
| `Version` | `Bytes4` | a fork version number | | `Version` | `Bytes4` | a fork version number |
| `DomainType` | `Bytes4` | a domain type | | `DomainType` | `Bytes4` | a domain type |
| `ForkDigest` | `Bytes4` | a digest of the current fork data | | `ForkDigest` | `Bytes4` | a digest of the current fork data |
@ -164,6 +165,7 @@ We define the following Python custom types for type hinting and readability:
| `BLSPubkey` | `Bytes48` | a BLS12-381 public key | | `BLSPubkey` | `Bytes48` | a BLS12-381 public key |
| `BLSSignature` | `Bytes96` | a BLS12-381 signature | | `BLSSignature` | `Bytes96` | a BLS12-381 signature |
## Constants ## Constants
The following values are (non-configurable) constants used throughout the specification. The following values are (non-configurable) constants used throughout the specification.
@ -374,7 +376,7 @@ class PendingAttestation(Container):
class Eth1Data(Container): class Eth1Data(Container):
deposit_root: Root deposit_root: Root
deposit_count: uint64 deposit_count: uint64
block_hash: Bytes32 block_hash: Hash32
``` ```
#### `HistoricalBatch` #### `HistoricalBatch`

View File

@ -54,8 +54,7 @@ def load_config_file(configs_dir: str, presets_name: str) -> Dict[str, Any]:
out[k] = [int(item) if item.isdigit() else item for item in v] out[k] = [int(item) if item.isdigit() else item for item in v]
elif isinstance(v, str) and v.startswith("0x"): elif isinstance(v, str) and v.startswith("0x"):
out[k] = bytes.fromhex(v[2:]) out[k] = bytes.fromhex(v[2:])
elif k == "CONFIG_NAME":
out[k] = str(v)
else: else:
out[k] = int(v) out[k] = int(v)
out['CONFIG_NAME'] = presets_name
return out return out

View File

@ -4,7 +4,8 @@ from typing import Any, Callable, Dict, Iterable, Optional
from eth2spec.config import config_util from eth2spec.config import config_util
from eth2spec.utils import bls from eth2spec.utils import bls
from eth2spec.test.context import ALL_CONFIGS, TESTGEN_FORKS, SpecForkName, ConfigName from eth2spec.test.helpers.constants import ALL_CONFIGS, TESTGEN_FORKS
from eth2spec.test.helpers.typing import SpecForkName, ConfigName
from eth2spec.gen_helpers.gen_base import gen_runner from eth2spec.gen_helpers.gen_base import gen_runner
from eth2spec.gen_helpers.gen_base.gen_typing import TestCase, TestProvider from eth2spec.gen_helpers.gen_base.gen_typing import TestCase, TestProvider

View File

@ -8,12 +8,14 @@ from eth2spec.test.helpers.state import (
state_transition_and_sign_block, state_transition_and_sign_block,
transition_to, transition_to,
) )
from eth2spec.test.helpers.constants import (
PHASE0,
MAINNET, MINIMAL,
)
from eth2spec.test.helpers.sync_committee import ( from eth2spec.test.helpers.sync_committee import (
compute_aggregate_sync_committee_signature, compute_aggregate_sync_committee_signature,
) )
from eth2spec.test.context import ( from eth2spec.test.context import (
PHASE0,
MAINNET, MINIMAL,
expect_assertion_error, expect_assertion_error,
with_all_phases_except, with_all_phases_except,
with_configs, with_configs,

View File

@ -1,10 +1,12 @@
from eth2spec.test.context import ( from eth2spec.test.context import (
PHASE0,
MINIMAL,
spec_state_test, spec_state_test,
with_all_phases_except, with_all_phases_except,
with_configs, with_configs,
) )
from eth2spec.test.helpers.constants import (
PHASE0,
MINIMAL,
)
from eth2spec.test.helpers.state import transition_to from eth2spec.test.helpers.state import transition_to
from eth2spec.test.helpers.epoch_processing import ( from eth2spec.test.helpers.epoch_processing import (
run_epoch_processing_with, run_epoch_processing_with,

View File

@ -1,6 +1,4 @@
from eth2spec.test.context import ( from eth2spec.test.context import (
PHASE0, ALTAIR,
MINIMAL,
with_phases, with_phases,
with_custom_state, with_custom_state,
with_configs, with_configs,
@ -8,6 +6,10 @@ from eth2spec.test.context import (
low_balances, misc_balances, large_validator_set, low_balances, misc_balances, large_validator_set,
) )
from eth2spec.test.utils import with_meta_tags from eth2spec.test.utils import with_meta_tags
from eth2spec.test.helpers.constants import (
PHASE0, ALTAIR,
MINIMAL,
)
from eth2spec.test.helpers.state import ( from eth2spec.test.helpers.state import (
next_epoch, next_epoch,
next_epoch_via_block, next_epoch_via_block,

View File

@ -11,8 +11,8 @@ from eth2spec.test.helpers.block import (
from eth2spec.test.helpers.sync_committee import ( from eth2spec.test.helpers.sync_committee import (
compute_aggregate_sync_committee_signature, compute_aggregate_sync_committee_signature,
) )
from eth2spec.test.helpers.constants import PHASE0
from eth2spec.test.context import ( from eth2spec.test.context import (
PHASE0,
with_all_phases_except, with_all_phases_except,
spec_state_test, spec_state_test,
) )

View File

@ -1,8 +1,8 @@
from eth2spec.test.context import ( from eth2spec.test.context import (
spec_state_test, spec_state_test,
with_phases, with_phases,
ALTAIR,
) )
from eth2spec.test.helpers.constants import ALTAIR
from eth2spec.test.helpers.merkle import build_proof from eth2spec.test.helpers.merkle import build_proof

View File

@ -1,6 +1,4 @@
from eth2spec.test.context import ( from eth2spec.test.context import (
ALTAIR,
MINIMAL,
spec_state_test, spec_state_test,
with_configs, with_configs,
with_phases, with_phases,
@ -10,6 +8,10 @@ from eth2spec.test.helpers.block import (
build_empty_block, build_empty_block,
build_empty_block_for_next_slot, build_empty_block_for_next_slot,
) )
from eth2spec.test.helpers.constants import (
ALTAIR,
MINIMAL,
)
from eth2spec.test.helpers.state import ( from eth2spec.test.helpers.state import (
next_slots, next_slots,
state_transition_and_sign_block, state_transition_and_sign_block,

View File

@ -0,0 +1,166 @@
import random
from collections import defaultdict
from eth2spec.utils.ssz.ssz_typing import Bitvector
from eth2spec.test.helpers.block import build_empty_block
from eth2spec.test.helpers.keys import pubkey_to_privkey
from eth2spec.test.helpers.state import transition_to
from eth2spec.utils import bls
from eth2spec.utils.bls import only_with_bls
from eth2spec.test.context import (
PHASE0,
with_all_phases_except,
with_state,
)
rng = random.Random(1337)
def ensure_assignments_in_sync_committee(
spec, state, epoch, sync_committee, active_pubkeys
):
assert len(sync_committee.pubkeys) >= 3
some_pubkeys = rng.sample(sync_committee.pubkeys, 3)
for pubkey in some_pubkeys:
validator_index = active_pubkeys.index(pubkey)
assert spec.is_assigned_to_sync_committee(state, epoch, validator_index)
@with_all_phases_except([PHASE0])
@with_state
def test_is_assigned_to_sync_committee(phases, spec, state):
epoch = spec.get_current_epoch(state)
validator_indices = spec.get_active_validator_indices(state, epoch)
validator_count = len(validator_indices)
query_epoch = epoch + 1
next_query_epoch = query_epoch + spec.EPOCHS_PER_SYNC_COMMITTEE_PERIOD
active_pubkeys = [state.validators[index].pubkey for index in validator_indices]
ensure_assignments_in_sync_committee(
spec, state, query_epoch, state.current_sync_committee, active_pubkeys
)
ensure_assignments_in_sync_committee(
spec, state, next_query_epoch, state.next_sync_committee, active_pubkeys
)
sync_committee_pubkeys = set(
list(state.current_sync_committee.pubkeys)
+ list(state.next_sync_committee.pubkeys)
)
disqualified_pubkeys = set(
filter(lambda key: key not in sync_committee_pubkeys, active_pubkeys)
)
# NOTE: only check `disqualified_pubkeys` if SYNC_COMMITEE_SIZE < validator count
if disqualified_pubkeys:
sample_size = 3
assert validator_count >= sample_size
some_pubkeys = rng.sample(disqualified_pubkeys, sample_size)
for pubkey in some_pubkeys:
validator_index = active_pubkeys.index(pubkey)
is_current = spec.is_assigned_to_sync_committee(
state, query_epoch, validator_index
)
is_next = spec.is_assigned_to_sync_committee(
state, next_query_epoch, validator_index
)
is_current_or_next = is_current or is_next
assert not is_current_or_next
def _get_sync_committee_signature(
spec,
state,
target_slot,
target_block_root,
subcommittee_index,
index_in_subcommittee,
):
subcommittee_size = spec.SYNC_COMMITTEE_SIZE // spec.SYNC_COMMITTEE_SUBNET_COUNT
sync_committee_index = (
subcommittee_index * subcommittee_size + index_in_subcommittee
)
pubkey = state.current_sync_committee.pubkeys[sync_committee_index]
privkey = pubkey_to_privkey[pubkey]
domain = spec.get_domain(
state,
spec.DOMAIN_SYNC_COMMITTEE,
)
signing_data = spec.compute_signing_root(target_block_root, domain)
return bls.Sign(privkey, spec.hash_tree_root(signing_data))
@only_with_bls()
@with_all_phases_except([PHASE0])
@with_state
def test_process_sync_committee_contributions(phases, spec, state):
# skip over slots at genesis
transition_to(spec, state, state.slot + 3)
# build a block and attempt to assemble a sync aggregate
# from some sync committee contributions
block = build_empty_block(spec, state)
previous_slot = state.slot - 1
target_block_root = spec.get_block_root_at_slot(state, previous_slot)
aggregation_bits = Bitvector[
spec.SYNC_COMMITTEE_SIZE // spec.SYNC_COMMITTEE_SUBNET_COUNT
]()
aggregation_index = 0
aggregation_bits[aggregation_index] = True
contributions = [
spec.SyncCommitteeContribution(
slot=block.slot,
beacon_block_root=target_block_root,
subcommittee_index=i,
aggregation_bits=aggregation_bits,
signature=_get_sync_committee_signature(
spec, state, previous_slot, target_block_root, i, aggregation_index
),
)
for i in range(spec.SYNC_COMMITTEE_SUBNET_COUNT)
]
# ensure the block has an empty sync aggregate...
empty_sync_aggregate = spec.SyncAggregate()
empty_sync_aggregate.sync_committee_signature = spec.G2_POINT_AT_INFINITY
assert block.body.sync_aggregate == empty_sync_aggregate
spec.process_sync_committee_contributions(block, set(contributions))
# and that after processing, it is no longer empty
assert len(block.body.sync_aggregate.sync_committee_bits) != 0
assert (
block.body.sync_aggregate.sync_committee_signature != spec.G2_POINT_AT_INFINITY
)
# moreover, ensure the sync aggregate is valid if the block is accepted
spec.process_block(state, block)
def _validator_index_for_pubkey(state, pubkey):
return list(map(lambda v: v.pubkey, state.validators)).index(pubkey)
def _subnet_for_sync_committee_index(spec, i):
return i // (spec.SYNC_COMMITTEE_SIZE // spec.SYNC_COMMITTEE_SUBNET_COUNT)
@with_all_phases_except([PHASE0])
@with_state
def test_compute_subnets_for_sync_committee(state, spec, phases):
some_sync_committee_members = list(
(
_subnet_for_sync_committee_index(spec, i),
pubkey,
)
for i, pubkey in enumerate(state.current_sync_committee.pubkeys)
)
expected_subnets_by_pubkey = defaultdict(list)
for (subnet, pubkey) in some_sync_committee_members:
expected_subnets_by_pubkey[pubkey].append(subnet)
for _, pubkey in some_sync_committee_members:
validator_index = _validator_index_for_pubkey(state, pubkey)
subnets = spec.compute_subnets_for_sync_committee(state, validator_index)
expected_subnets = expected_subnets_by_pubkey[pubkey]
assert subnets == expected_subnets

View File

@ -6,11 +6,15 @@ from eth2spec.merge import spec as spec_merge
from eth2spec.utils import bls from eth2spec.utils import bls
from .exceptions import SkippedTest from .exceptions import SkippedTest
from .helpers.constants import (
PHASE0, ALTAIR, MERGE, SHARDING, CUSTODY_GAME, DAS,
ALL_PHASES,
)
from .helpers.genesis import create_genesis_state from .helpers.genesis import create_genesis_state
from .utils import vector_test, with_meta_tags from .utils import vector_test, with_meta_tags
from random import Random from random import Random
from typing import Any, Callable, NewType, Sequence, TypedDict, Protocol from typing import Any, Callable, Sequence, TypedDict, Protocol
from lru import LRU from lru import LRU
@ -23,30 +27,6 @@ def reload_specs():
reload(spec_merge) reload(spec_merge)
# Some of the Spec module functionality is exposed here to deal with phase-specific changes.
SpecForkName = NewType("SpecForkName", str)
ConfigName = NewType("ConfigName", str)
PHASE0 = SpecForkName('phase0')
ALTAIR = SpecForkName('altair')
# Experimental phases (not included in default "ALL_PHASES"):
MERGE = SpecForkName('merge')
SHARDING = SpecForkName('sharding')
CUSTODY_GAME = SpecForkName('custody_game')
DAS = SpecForkName('das')
ALL_PHASES = (PHASE0, ALTAIR)
MAINNET = ConfigName('mainnet')
MINIMAL = ConfigName('minimal')
ALL_CONFIGS = (MINIMAL, MAINNET)
# The forks that output to the test vectors.
TESTGEN_FORKS = (PHASE0, ALTAIR)
# TODO: currently phases are defined as python modules. # TODO: currently phases are defined as python modules.
# It would be better if they would be more well-defined interfaces for stronger typing. # It would be better if they would be more well-defined interfaces for stronger typing.

View File

@ -1,9 +1,9 @@
from eth2spec.test.context import ( from eth2spec.test.context import (
CUSTODY_GAME,
with_phases, with_phases,
spec_state_test, spec_state_test,
always_bls, always_bls,
) )
from eth2spec.test.helpers.constants import CUSTODY_GAME
from eth2spec.test.helpers.state import transition_to from eth2spec.test.helpers.state import transition_to
from eth2spec.test.helpers.attestations import ( from eth2spec.test.helpers.attestations import (
run_attestation_processing, run_attestation_processing,

View File

@ -6,10 +6,12 @@ from eth2spec.test.helpers.custody import (
from eth2spec.test.helpers.attestations import ( from eth2spec.test.helpers.attestations import (
get_valid_on_time_attestation, get_valid_on_time_attestation,
) )
from eth2spec.test.helpers.state import transition_to, transition_to_valid_shard_slot from eth2spec.test.helpers.constants import (
from eth2spec.test.context import (
CUSTODY_GAME, CUSTODY_GAME,
MINIMAL, MINIMAL,
)
from eth2spec.test.helpers.state import transition_to, transition_to_valid_shard_slot
from eth2spec.test.context import (
expect_assertion_error, expect_assertion_error,
disable_process_reveal_deadlines, disable_process_reveal_deadlines,
spec_state_test, spec_state_test,

View File

@ -1,6 +1,6 @@
from eth2spec.test.helpers.constants import CUSTODY_GAME
from eth2spec.test.helpers.custody import get_valid_custody_key_reveal from eth2spec.test.helpers.custody import get_valid_custody_key_reveal
from eth2spec.test.context import ( from eth2spec.test.context import (
CUSTODY_GAME,
with_phases, with_phases,
spec_state_test, spec_state_test,
expect_assertion_error, expect_assertion_error,

View File

@ -5,12 +5,14 @@ from eth2spec.test.helpers.custody import (
from eth2spec.test.helpers.attestations import ( from eth2spec.test.helpers.attestations import (
get_valid_on_time_attestation, get_valid_on_time_attestation,
) )
from eth2spec.test.helpers.constants import (
CUSTODY_GAME,
MINIMAL,
)
from eth2spec.test.helpers.keys import privkeys from eth2spec.test.helpers.keys import privkeys
from eth2spec.utils.ssz.ssz_typing import ByteList from eth2spec.utils.ssz.ssz_typing import ByteList
from eth2spec.test.helpers.state import get_balance, transition_to from eth2spec.test.helpers.state import get_balance, transition_to
from eth2spec.test.context import ( from eth2spec.test.context import (
MINIMAL,
CUSTODY_GAME,
with_phases, with_phases,
spec_state_test, spec_state_test,
expect_assertion_error, expect_assertion_error,

View File

@ -1,7 +1,7 @@
from eth2spec.test.helpers.constants import CUSTODY_GAME
from eth2spec.test.helpers.custody import get_valid_early_derived_secret_reveal from eth2spec.test.helpers.custody import get_valid_early_derived_secret_reveal
from eth2spec.test.helpers.state import next_epoch_via_block, get_balance from eth2spec.test.helpers.state import next_epoch_via_block, get_balance
from eth2spec.test.context import ( from eth2spec.test.context import (
CUSTODY_GAME,
with_phases, with_phases,
spec_state_test, spec_state_test,
expect_assertion_error, expect_assertion_error,

View File

@ -7,13 +7,15 @@ from eth2spec.test.helpers.attestations import (
) )
from eth2spec.test.helpers.state import transition_to, transition_to_valid_shard_slot from eth2spec.test.helpers.state import transition_to, transition_to_valid_shard_slot
from eth2spec.test.context import ( from eth2spec.test.context import (
CUSTODY_GAME,
MINIMAL,
spec_state_test, spec_state_test,
with_phases, with_phases,
with_configs, with_configs,
) )
from eth2spec.test.phase0.block_processing.test_process_attestation import run_attestation_processing from eth2spec.test.phase0.block_processing.test_process_attestation import run_attestation_processing
from eth2spec.test.helpers.constants import (
CUSTODY_GAME,
MINIMAL,
)
from eth2spec.test.helpers.epoch_processing import run_epoch_processing_with from eth2spec.test.helpers.epoch_processing import run_epoch_processing_with
from eth2spec.test.custody_game.block_processing.test_process_chunk_challenge import ( from eth2spec.test.custody_game.block_processing.test_process_chunk_challenge import (

View File

@ -1,4 +1,4 @@
from eth2spec.test.context import ( from eth2spec.test.helpers.constants import (
CUSTODY_GAME, CUSTODY_GAME,
) )
from eth2spec.test.helpers.custody import ( from eth2spec.test.helpers.custody import (

View File

@ -3,12 +3,14 @@ from eth2spec.test.helpers.custody import (
) )
from eth2spec.test.helpers.state import transition_to from eth2spec.test.helpers.state import transition_to
from eth2spec.test.context import ( from eth2spec.test.context import (
CUSTODY_GAME,
MINIMAL,
with_phases, with_phases,
with_configs, with_configs,
spec_state_test, spec_state_test,
) )
from eth2spec.test.helpers.constants import (
CUSTODY_GAME,
MINIMAL,
)
from eth2spec.test.helpers.epoch_processing import run_epoch_processing_with from eth2spec.test.helpers.epoch_processing import run_epoch_processing_with
from eth2spec.test.custody_game.block_processing.test_process_custody_key_reveal import ( from eth2spec.test.custody_game.block_processing.test_process_custody_key_reveal import (
run_custody_key_reveal_processing, run_custody_key_reveal_processing,

View File

@ -1,14 +1,16 @@
from typing import Dict, Sequence from typing import Dict, Sequence
from eth2spec.test.context import ( from eth2spec.test.context import (
CUSTODY_GAME,
MINIMAL,
with_phases, with_phases,
spec_state_test, spec_state_test,
with_configs, with_configs,
) )
from eth2spec.test.helpers.attestations import get_valid_on_time_attestation from eth2spec.test.helpers.attestations import get_valid_on_time_attestation
from eth2spec.test.helpers.block import build_empty_block from eth2spec.test.helpers.block import build_empty_block
from eth2spec.test.helpers.constants import (
CUSTODY_GAME,
MINIMAL,
)
from eth2spec.test.helpers.custody import ( from eth2spec.test.helpers.custody import (
get_custody_slashable_test_vector, get_custody_slashable_test_vector,
get_valid_chunk_challenge, get_valid_chunk_challenge,

View File

@ -0,0 +1,29 @@
from .typing import SpecForkName, ConfigName
#
# SpecForkName
#
# Some of the Spec module functionality is exposed here to deal with phase-specific changes.
PHASE0 = SpecForkName('phase0')
ALTAIR = SpecForkName('altair')
# Experimental phases (not included in default "ALL_PHASES"):
MERGE = SpecForkName('merge')
SHARDING = SpecForkName('sharding')
CUSTODY_GAME = SpecForkName('custody_game')
DAS = SpecForkName('das')
# The forks that pytest runs with.
ALL_PHASES = (PHASE0, ALTAIR)
# The forks that output to the test vectors.
TESTGEN_FORKS = (PHASE0, ALTAIR)
#
# Config
#
MAINNET = ConfigName('mainnet')
MINIMAL = ConfigName('minimal')
ALL_CONFIGS = (MINIMAL, MAINNET)

View File

@ -0,0 +1,4 @@
from typing import NewType
SpecForkName = NewType("SpecForkName", str)
ConfigName = NewType("ConfigName", str)

View File

@ -1,4 +1,5 @@
from eth2spec.test.context import PHASE0, spec_state_test, with_phases from eth2spec.test.context import spec_state_test, with_phases
from eth2spec.test.helpers.constants import PHASE0
from eth2spec.test.helpers.epoch_processing import ( from eth2spec.test.helpers.epoch_processing import (
run_epoch_processing_with run_epoch_processing_with
) )

View File

@ -1,7 +1,6 @@
from eth_utils import encode_hex from eth_utils import encode_hex
from eth2spec.test.context import ( from eth2spec.test.context import (
MINIMAL,
is_post_altair, is_post_altair,
spec_state_test, spec_state_test,
with_all_phases, with_all_phases,
@ -9,6 +8,7 @@ from eth2spec.test.context import (
) )
from eth2spec.test.helpers.attestations import get_valid_attestation, next_epoch_with_attestations from eth2spec.test.helpers.attestations import get_valid_attestation, next_epoch_with_attestations
from eth2spec.test.helpers.block import build_empty_block_for_next_slot from eth2spec.test.helpers.block import build_empty_block_for_next_slot
from eth2spec.test.helpers.constants import MINIMAL
from eth2spec.test.helpers.fork_choice import ( from eth2spec.test.helpers.fork_choice import (
tick_and_run_on_attestation, tick_and_run_on_attestation,
tick_and_run_on_block, tick_and_run_on_block,

View File

@ -1,11 +1,11 @@
from eth2spec.test.context import ( from eth2spec.test.context import (
MINIMAL,
is_post_altair, is_post_altair,
single_phase, single_phase,
spec_test, spec_test,
with_configs, with_configs,
with_all_phases, with_all_phases,
) )
from eth2spec.test.helpers.constants import MINIMAL
from eth2spec.test.helpers.deposits import ( from eth2spec.test.helpers.deposits import (
prepare_full_genesis_deposits, prepare_full_genesis_deposits,
prepare_random_genesis_deposits, prepare_random_genesis_deposits,

View File

@ -1,11 +1,11 @@
from eth2spec.test.context import ( from eth2spec.test.context import (
MINIMAL,
is_post_altair, is_post_altair,
spec_test, spec_test,
single_phase, single_phase,
with_configs, with_configs,
with_all_phases, with_all_phases,
) )
from eth2spec.test.helpers.constants import MINIMAL
from eth2spec.test.helpers.deposits import ( from eth2spec.test.helpers.deposits import (
prepare_full_genesis_deposits, prepare_full_genesis_deposits,
) )

View File

@ -1,4 +1,5 @@
from eth2spec.test.context import PHASE0, with_all_phases, with_phases, spec_state_test from eth2spec.test.context import with_all_phases, with_phases, spec_state_test
from eth2spec.test.helpers.constants import PHASE0
import eth2spec.test.helpers.rewards as rewards_helpers import eth2spec.test.helpers.rewards as rewards_helpers

View File

@ -1,4 +1,5 @@
from eth2spec.test.context import PHASE0, with_all_phases, with_phases, spec_state_test from eth2spec.test.context import with_all_phases, with_phases, spec_state_test
from eth2spec.test.helpers.constants import PHASE0
from eth2spec.test.helpers.rewards import leaking from eth2spec.test.helpers.rewards import leaking
import eth2spec.test.helpers.rewards as rewards_helpers import eth2spec.test.helpers.rewards as rewards_helpers

View File

@ -24,9 +24,8 @@ from eth2spec.test.helpers.multi_operations import (
run_slash_and_exit, run_slash_and_exit,
run_test_full_random_operations, run_test_full_random_operations,
) )
from eth2spec.test.helpers.constants import PHASE0, MINIMAL
from eth2spec.test.context import ( from eth2spec.test.context import (
PHASE0, MINIMAL,
spec_test, spec_state_test, dump_skipping_message, spec_test, spec_state_test, dump_skipping_message,
with_phases, with_all_phases, single_phase, with_phases, with_all_phases, single_phase,
expect_assertion_error, always_bls, expect_assertion_error, always_bls,

View File

@ -1,6 +1,7 @@
from eth2spec.test.context import PHASE0, ALTAIR, with_all_phases, spec_state_test from eth2spec.test.context import with_all_phases, spec_state_test
from eth2spec.test.helpers.block import build_empty_block_for_next_slot from eth2spec.test.helpers.block import build_empty_block_for_next_slot
from eth2spec.test.helpers.attestations import get_valid_attestation, sign_attestation from eth2spec.test.helpers.attestations import get_valid_attestation, sign_attestation
from eth2spec.test.helpers.constants import PHASE0, ALTAIR
from eth2spec.test.helpers.state import transition_to, state_transition_and_sign_block, next_epoch, next_slot from eth2spec.test.helpers.state import transition_to, state_transition_and_sign_block, next_epoch, next_slot
from eth2spec.test.helpers.fork_choice import get_genesis_forkchoice_store from eth2spec.test.helpers.fork_choice import get_genesis_forkchoice_store

View File

@ -1,8 +1,8 @@
from eth2spec.test.context import ( from eth2spec.test.context import (
spec_state_test, spec_state_test,
always_bls, with_phases, with_all_phases, always_bls, with_phases, with_all_phases,
PHASE0,
) )
from eth2spec.test.helpers.constants import PHASE0
from eth2spec.test.helpers.attestations import build_attestation_data, get_valid_attestation from eth2spec.test.helpers.attestations import build_attestation_data, get_valid_attestation
from eth2spec.test.helpers.block import build_empty_block from eth2spec.test.helpers.block import build_empty_block
from eth2spec.test.helpers.deposits import prepare_state_and_deposit from eth2spec.test.helpers.deposits import prepare_state_and_deposit

View File

@ -1,8 +1,8 @@
from eth2spec.test.context import ( from eth2spec.test.context import (
SHARDING,
with_phases, with_phases,
spec_state_test, spec_state_test,
) )
from eth2spec.test.helpers.constants import SHARDING
from eth2spec.test.helpers.state import next_epoch from eth2spec.test.helpers.state import next_epoch

View File

@ -164,7 +164,7 @@ Another example, to generate tests from pytests:
```python ```python
from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase0 import spec as spec_phase0
from eth2spec.altair import spec as spec_altair from eth2spec.altair import spec as spec_altair
from eth2spec.test.context import PHASE0, ALTAIR from eth2spec.test.helpers.constants import PHASE0, ALTAIR
from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators

View File

@ -12,7 +12,7 @@ from eth_utils import (
import milagro_bls_binding as milagro_bls import milagro_bls_binding as milagro_bls
from eth2spec.utils import bls from eth2spec.utils import bls
from eth2spec.test.context import PHASE0 from eth2spec.test.helpers.constants import PHASE0
from eth2spec.gen_helpers.gen_base import gen_runner, gen_typing from eth2spec.gen_helpers.gen_base import gen_runner, gen_typing

View File

@ -1,7 +1,7 @@
from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators
from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase0 import spec as spec_phase0
from eth2spec.altair import spec as spec_altair from eth2spec.altair import spec as spec_altair
from eth2spec.test.context import PHASE0, ALTAIR from eth2spec.test.helpers.constants import PHASE0, ALTAIR
specs = (spec_phase0, spec_altair) specs = (spec_phase0, spec_altair)

View File

@ -1,7 +1,7 @@
from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators
from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase0 import spec as spec_phase0
from eth2spec.altair import spec as spec_altair from eth2spec.altair import spec as spec_altair
from eth2spec.test.context import PHASE0, ALTAIR from eth2spec.test.helpers.constants import PHASE0, ALTAIR
specs = (spec_phase0, spec_altair) specs = (spec_phase0, spec_altair)

View File

@ -1,7 +1,7 @@
from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators
from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase0 import spec as spec_phase0
from eth2spec.altair import spec as spec_altair from eth2spec.altair import spec as spec_altair
from eth2spec.test.context import PHASE0, ALTAIR from eth2spec.test.helpers.constants import PHASE0, ALTAIR
specs = (spec_phase0, spec_altair) specs = (spec_phase0, spec_altair)

View File

@ -1,7 +1,7 @@
from importlib import reload from importlib import reload
from typing import Iterable from typing import Iterable
from eth2spec.test.context import PHASE0, ALTAIR, MINIMAL, MAINNET from eth2spec.test.helpers.constants import PHASE0, ALTAIR, MINIMAL, MAINNET
from eth2spec.config import config_util from eth2spec.config import config_util
from eth2spec.test.altair.fork import test_fork as test_altair_forks from eth2spec.test.altair.fork import test_fork as test_altair_forks
from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase0 import spec as spec_phase0

View File

@ -1,7 +1,7 @@
from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators
from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase0 import spec as spec_phase0
from eth2spec.altair import spec as spec_altair from eth2spec.altair import spec as spec_altair
from eth2spec.test.context import PHASE0, ALTAIR from eth2spec.test.helpers.constants import PHASE0, ALTAIR
specs = (spec_phase0, spec_altair) specs = (spec_phase0, spec_altair)

View File

@ -1,7 +1,7 @@
from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators
from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase0 import spec as spec_phase0
from eth2spec.altair import spec as spec_altair from eth2spec.altair import spec as spec_altair
from eth2spec.test.context import PHASE0, ALTAIR from eth2spec.test.helpers.constants import PHASE0, ALTAIR
specs = (spec_phase0, spec_altair) specs = (spec_phase0, spec_altair)

View File

@ -1,7 +1,7 @@
from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators
from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase0 import spec as spec_phase0
from eth2spec.altair import spec as spec_altair from eth2spec.altair import spec as spec_altair
from eth2spec.test.context import PHASE0, ALTAIR from eth2spec.test.helpers.constants import PHASE0, ALTAIR
specs = (spec_phase0, spec_altair) specs = (spec_phase0, spec_altair)

View File

@ -1,6 +1,6 @@
from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase0 import spec as spec_phase0
from eth2spec.altair import spec as spec_altair from eth2spec.altair import spec as spec_altair
from eth2spec.test.context import PHASE0, ALTAIR from eth2spec.test.helpers.constants import PHASE0, ALTAIR
from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators

View File

@ -6,7 +6,7 @@ from eth2spec.gen_helpers.gen_base import gen_runner, gen_typing
from eth2spec.config import config_util from eth2spec.config import config_util
from eth2spec.phase0 import spec as spec from eth2spec.phase0 import spec as spec
from eth2spec.test.context import PHASE0 from eth2spec.test.helpers.constants import PHASE0
def shuffling_case_fn(seed, count): def shuffling_case_fn(seed, count):

View File

@ -6,7 +6,7 @@ import ssz_bitvector
import ssz_boolean import ssz_boolean
import ssz_uints import ssz_uints
import ssz_container import ssz_container
from eth2spec.test.context import PHASE0 from eth2spec.test.helpers.constants import PHASE0
def create_provider(handler_name: str, suite_name: str, case_maker) -> gen_typing.TestProvider: def create_provider(handler_name: str, suite_name: str, case_maker) -> gen_typing.TestProvider:

View File

@ -9,7 +9,7 @@ from eth2spec.debug import random_value, encode
from eth2spec.config import config_util from eth2spec.config import config_util
from eth2spec.phase0 import spec as spec_phase0 from eth2spec.phase0 import spec as spec_phase0
from eth2spec.altair import spec as spec_altair from eth2spec.altair import spec as spec_altair
from eth2spec.test.context import ALTAIR, TESTGEN_FORKS, MINIMAL, MAINNET from eth2spec.test.helpers.constants import ALTAIR, TESTGEN_FORKS, MINIMAL, MAINNET
from eth2spec.utils.ssz.ssz_typing import Container from eth2spec.utils.ssz.ssz_typing import Container
from eth2spec.utils.ssz.ssz_impl import ( from eth2spec.utils.ssz.ssz_impl import (
hash_tree_root, hash_tree_root,