diff --git a/configs/mainnet/altair.yaml b/configs/mainnet/altair.yaml index 2a2552da4..44490f982 100644 --- a/configs/mainnet/altair.yaml +++ b/configs/mainnet/altair.yaml @@ -1,7 +1,5 @@ # Mainnet preset - Altair -CONFIG_NAME: "mainnet" - # Updated penalty values # --------------------------------------------------------------- # 3 * 2**24 (= 50,331,648) @@ -51,3 +49,9 @@ MIN_SYNC_COMMITTEE_PARTICIPANTS: 1 MAX_VALID_LIGHT_CLIENT_UPDATES: 8192 # 2**13 (=8192) LIGHT_CLIENT_UPDATE_TIMEOUT: 8192 + + +# Validator +# --------------------------------------------------------------- +# 2**2 (= 4) +TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE: 4 diff --git a/configs/mainnet/custody_game.yaml b/configs/mainnet/custody_game.yaml index 8039d839b..ecb2dc377 100644 --- a/configs/mainnet/custody_game.yaml +++ b/configs/mainnet/custody_game.yaml @@ -1,7 +1,5 @@ # Mainnet preset - Custody Game -CONFIG_NAME: "mainnet" - # Time parameters # --------------------------------------------------------------- # 2**1 (= 2) epochs, 12.8 minutes diff --git a/configs/mainnet/merge.yaml b/configs/mainnet/merge.yaml index 582e7d642..b4667f5b5 100644 --- a/configs/mainnet/merge.yaml +++ b/configs/mainnet/merge.yaml @@ -1,7 +1,5 @@ # Mainnet preset - The Merge -CONFIG_NAME: "mainnet" - # Fork # --------------------------------------------------------------- MERGE_FORK_VERSION: 0x02000000 diff --git a/configs/mainnet/phase0.yaml b/configs/mainnet/phase0.yaml index ace44dd23..8b902f1c3 100644 --- a/configs/mainnet/phase0.yaml +++ b/configs/mainnet/phase0.yaml @@ -1,7 +1,5 @@ # Mainnet preset -CONFIG_NAME: "mainnet" - # Misc # --------------------------------------------------------------- # 2**6 (= 64) diff --git a/configs/mainnet/sharding.yaml b/configs/mainnet/sharding.yaml index 0e59a674b..4773aa5f5 100644 --- a/configs/mainnet/sharding.yaml +++ b/configs/mainnet/sharding.yaml @@ -1,7 +1,5 @@ # Mainnet preset - Sharding -CONFIG_NAME: "mainnet" - # Fork # --------------------------------------------------------------- SHARDING_FORK_VERSION: 0x03000000 diff --git a/configs/minimal/altair.yaml b/configs/minimal/altair.yaml index b852e13c0..10bdf318b 100644 --- a/configs/minimal/altair.yaml +++ b/configs/minimal/altair.yaml @@ -1,7 +1,5 @@ # Minimal preset - Altair -CONFIG_NAME: "minimal" - # Updated penalty values # --------------------------------------------------------------- # 3 * 2**24 (= 50,331,648) @@ -51,3 +49,8 @@ MIN_SYNC_COMMITTEE_PARTICIPANTS: 1 MAX_VALID_LIGHT_CLIENT_UPDATES: 32 # [customized] LIGHT_CLIENT_UPDATE_TIMEOUT: 32 + +# Validator +# --------------------------------------------------------------- +# 2**2 (= 4) +TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE: 4 diff --git a/configs/minimal/custody_game.yaml b/configs/minimal/custody_game.yaml index 1d9393e80..8b8992fb6 100644 --- a/configs/minimal/custody_game.yaml +++ b/configs/minimal/custody_game.yaml @@ -1,7 +1,5 @@ # Minimal preset - Custody Game -CONFIG_NAME: "minimal" - # Time parameters # --------------------------------------------------------------- # 2**1 (= 2) epochs, 12.8 minutes diff --git a/configs/minimal/merge.yaml b/configs/minimal/merge.yaml index e2857917f..394595d02 100644 --- a/configs/minimal/merge.yaml +++ b/configs/minimal/merge.yaml @@ -1,7 +1,5 @@ # Minimal preset - The Merge -CONFIG_NAME: "minimal" - # Fork # --------------------------------------------------------------- MERGE_FORK_VERSION: 0x02000001 diff --git a/configs/minimal/phase0.yaml b/configs/minimal/phase0.yaml index 93337adf8..3624a2702 100644 --- a/configs/minimal/phase0.yaml +++ b/configs/minimal/phase0.yaml @@ -1,7 +1,5 @@ # Minimal preset -CONFIG_NAME: "minimal" - # Misc # --------------------------------------------------------------- diff --git a/configs/minimal/sharding.yaml b/configs/minimal/sharding.yaml index ca1cc1d6b..f32e2827d 100644 --- a/configs/minimal/sharding.yaml +++ b/configs/minimal/sharding.yaml @@ -1,7 +1,5 @@ # Minimal preset - Sharding -CONFIG_NAME: "minimal" - # Fork # --------------------------------------------------------------- SHARDING_FORK_VERSION: 0x03000001 diff --git a/setup.py b/setup.py index 2101eebc4..c6e9f55ae 100644 --- a/setup.py +++ b/setup.py @@ -396,11 +396,11 @@ def get_pow_chain_head() -> PowBlock: pass -def execution_state_transition(execution_state: ExecutionState, execution_payload: ExecutionPayload) -> None: - pass +def verify_execution_state_transition(execution_payload: ExecutionPayload) -> bool: + return True -def produce_execution_payload(parent_hash: Bytes32) -> ExecutionPayload: +def produce_execution_payload(parent_hash: Hash32, timestamp: uint64) -> ExecutionPayload: pass""" @@ -743,7 +743,7 @@ setup( "py_ecc==5.2.0", "milagro_bls_binding==1.6.3", "dataclasses==0.6", - "remerkleable==0.1.18", + "remerkleable==0.1.19", "ruamel.yaml==0.16.5", "lru-dict==1.1.6", ] diff --git a/specs/merge/beacon-chain.md b/specs/merge/beacon-chain.md index be79cf5b5..a508cb670 100644 --- a/specs/merge/beacon-chain.md +++ b/specs/merge/beacon-chain.md @@ -26,10 +26,10 @@ - [Misc](#misc) - [`is_transition_completed`](#is_transition_completed) - [`is_transition_block`](#is_transition_block) + - [`compute_time_at_slot`](#compute_time_at_slot) - [Block processing](#block-processing) - [Execution payload processing](#execution-payload-processing) - - [`get_execution_state`](#get_execution_state) - - [`execution_state_transition`](#execution_state_transition) + - [`verify_execution_state_transition`](#verify_execution_state_transition) - [`process_execution_payload`](#process_execution_payload) @@ -98,13 +98,14 @@ The execution payload included in a `BeaconBlockBody`. ```python class ExecutionPayload(Container): - block_hash: Bytes32 # Hash of execution block - parent_hash: Bytes32 + block_hash: Hash32 # Hash of execution block + parent_hash: Hash32 coinbase: Bytes20 state_root: Bytes32 number: uint64 gas_limit: uint64 gas_used: uint64 + timestamp: uint64 receipt_root: Bytes32 logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM] transactions: List[OpaqueTransaction, MAX_APPLICATION_TRANSACTIONS] @@ -118,13 +119,14 @@ The execution payload header included in a `BeaconState`. ```python class ExecutionPayloadHeader(Container): - block_hash: Bytes32 # Hash of execution block - parent_hash: Bytes32 + block_hash: Hash32 # Hash of execution block + parent_hash: Hash32 coinbase: Bytes20 state_root: Bytes32 number: uint64 gas_limit: uint64 gas_used: uint64 + timestamp: uint64 receipt_root: Bytes32 logs_bloom: ByteVector[BYTES_PER_LOGS_BLOOM] transactions_root: Root @@ -137,17 +139,27 @@ class ExecutionPayloadHeader(Container): #### `is_transition_completed` ```python -def is_transition_completed(state: BeaconState) -> boolean: +def is_transition_completed(state: BeaconState) -> bool: return state.latest_execution_payload_header != ExecutionPayloadHeader() ``` #### `is_transition_block` ```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() ``` +#### `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 ```python @@ -161,20 +173,11 @@ def process_block(state: BeaconState, block: BeaconBlock) -> None: #### Execution payload processing -##### `get_execution_state` +##### `verify_execution_state_transition` -*Note*: `ExecutionState` class is an abstract class representing Ethereum execution state. - -Let `get_execution_state(execution_state_root: Bytes32) -> ExecutionState` be the function that given the root hash returns a copy of 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. 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` ```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.number == state.latest_execution_payload_header.number + 1 - execution_state = get_execution_state(state.latest_execution_payload_header.state_root) - execution_state_transition(execution_state, execution_payload) + assert execution_payload.timestamp == compute_time_at_slot(state, state.slot) + + assert verify_execution_state_transition(execution_payload) state.latest_execution_payload_header = ExecutionPayloadHeader( block_hash=execution_payload.block_hash, @@ -203,6 +207,7 @@ def process_execution_payload(state: BeaconState, body: BeaconBlockBody) -> None number=execution_payload.number, gas_limit=execution_payload.gas_limit, gas_used=execution_payload.gas_used, + timestamp=execution_payload.timestamp, receipt_root=execution_payload.receipt_root, logs_bloom=execution_payload.logs_bloom, transactions_root=hash_tree_root(execution_payload.transactions), diff --git a/specs/merge/fork-choice.md b/specs/merge/fork-choice.md index 647a663c2..34647f45d 100644 --- a/specs/merge/fork-choice.md +++ b/specs/merge/fork-choice.md @@ -30,7 +30,7 @@ This is the modification of the fork choice according to the executable beacon c ```python class PowBlock(Container): - block_hash: Bytes32 + block_hash: Hash32 is_processed: boolean is_valid: boolean total_difficulty: uint256 @@ -38,7 +38,7 @@ class PowBlock(Container): #### `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. @@ -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`. ```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 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: store.justified_checkpoint = state.current_justified_checkpoint ``` - diff --git a/specs/merge/validator.md b/specs/merge/validator.md index 5b26a21dd..dccc5727b 100644 --- a/specs/merge/validator.md +++ b/specs/merge/validator.md @@ -48,7 +48,7 @@ Let `get_pow_chain_head() -> PowBlock` be the function that returns the head of ###### `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. * Set `block.body.execution_payload = get_execution_payload(state)` where: @@ -62,9 +62,11 @@ def get_execution_payload(state: BeaconState) -> ExecutionPayload: return ExecutionPayload() else: # 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 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) ``` diff --git a/specs/phase0/beacon-chain.md b/specs/phase0/beacon-chain.md index cbd085bd3..3176d543c 100644 --- a/specs/phase0/beacon-chain.md +++ b/specs/phase0/beacon-chain.md @@ -157,6 +157,7 @@ We define the following Python custom types for type hinting and readability: | `ValidatorIndex` | `uint64` | a validator registry index | | `Gwei` | `uint64` | an amount in Gwei | | `Root` | `Bytes32` | a Merkle root | +| `Hash32` | `Bytes32` | a 256-bit hash | | `Version` | `Bytes4` | a fork version number | | `DomainType` | `Bytes4` | a domain type | | `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 | | `BLSSignature` | `Bytes96` | a BLS12-381 signature | + ## Constants The following values are (non-configurable) constants used throughout the specification. @@ -374,7 +376,7 @@ class PendingAttestation(Container): class Eth1Data(Container): deposit_root: Root deposit_count: uint64 - block_hash: Bytes32 + block_hash: Hash32 ``` #### `HistoricalBatch` diff --git a/tests/core/pyspec/eth2spec/config/config_util.py b/tests/core/pyspec/eth2spec/config/config_util.py index ee2007600..917cf3a60 100644 --- a/tests/core/pyspec/eth2spec/config/config_util.py +++ b/tests/core/pyspec/eth2spec/config/config_util.py @@ -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] elif isinstance(v, str) and v.startswith("0x"): out[k] = bytes.fromhex(v[2:]) - elif k == "CONFIG_NAME": - out[k] = str(v) else: out[k] = int(v) + out['CONFIG_NAME'] = presets_name return out diff --git a/tests/core/pyspec/eth2spec/gen_helpers/gen_from_tests/gen.py b/tests/core/pyspec/eth2spec/gen_helpers/gen_from_tests/gen.py index c090869d5..bc63b212b 100644 --- a/tests/core/pyspec/eth2spec/gen_helpers/gen_from_tests/gen.py +++ b/tests/core/pyspec/eth2spec/gen_helpers/gen_from_tests/gen.py @@ -4,7 +4,8 @@ from typing import Any, Callable, Dict, Iterable, Optional from eth2spec.config import config_util 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.gen_typing import TestCase, TestProvider diff --git a/tests/core/pyspec/eth2spec/test/altair/block_processing/test_process_sync_committee.py b/tests/core/pyspec/eth2spec/test/altair/block_processing/test_process_sync_committee.py index ed9bcac9c..307d0f82d 100644 --- a/tests/core/pyspec/eth2spec/test/altair/block_processing/test_process_sync_committee.py +++ b/tests/core/pyspec/eth2spec/test/altair/block_processing/test_process_sync_committee.py @@ -8,12 +8,14 @@ from eth2spec.test.helpers.state import ( state_transition_and_sign_block, transition_to, ) +from eth2spec.test.helpers.constants import ( + PHASE0, + MAINNET, MINIMAL, +) from eth2spec.test.helpers.sync_committee import ( compute_aggregate_sync_committee_signature, ) from eth2spec.test.context import ( - PHASE0, - MAINNET, MINIMAL, expect_assertion_error, with_all_phases_except, with_configs, diff --git a/tests/core/pyspec/eth2spec/test/altair/epoch_processing/test_process_sync_committee_updates.py b/tests/core/pyspec/eth2spec/test/altair/epoch_processing/test_process_sync_committee_updates.py index 4c5ac0633..7ba2645a2 100644 --- a/tests/core/pyspec/eth2spec/test/altair/epoch_processing/test_process_sync_committee_updates.py +++ b/tests/core/pyspec/eth2spec/test/altair/epoch_processing/test_process_sync_committee_updates.py @@ -1,10 +1,12 @@ from eth2spec.test.context import ( - PHASE0, - MINIMAL, spec_state_test, with_all_phases_except, with_configs, ) +from eth2spec.test.helpers.constants import ( + PHASE0, + MINIMAL, +) from eth2spec.test.helpers.state import transition_to from eth2spec.test.helpers.epoch_processing import ( run_epoch_processing_with, diff --git a/tests/core/pyspec/eth2spec/test/altair/fork/test_fork.py b/tests/core/pyspec/eth2spec/test/altair/fork/test_fork.py index fb056b72a..1ad39209c 100644 --- a/tests/core/pyspec/eth2spec/test/altair/fork/test_fork.py +++ b/tests/core/pyspec/eth2spec/test/altair/fork/test_fork.py @@ -1,6 +1,4 @@ from eth2spec.test.context import ( - PHASE0, ALTAIR, - MINIMAL, with_phases, with_custom_state, with_configs, @@ -8,6 +6,10 @@ from eth2spec.test.context import ( low_balances, misc_balances, large_validator_set, ) from eth2spec.test.utils import with_meta_tags +from eth2spec.test.helpers.constants import ( + PHASE0, ALTAIR, + MINIMAL, +) from eth2spec.test.helpers.state import ( next_epoch, next_epoch_via_block, diff --git a/tests/core/pyspec/eth2spec/test/altair/sanity/test_blocks.py b/tests/core/pyspec/eth2spec/test/altair/sanity/test_blocks.py index 9f28926d4..48ab6956b 100644 --- a/tests/core/pyspec/eth2spec/test/altair/sanity/test_blocks.py +++ b/tests/core/pyspec/eth2spec/test/altair/sanity/test_blocks.py @@ -11,8 +11,8 @@ from eth2spec.test.helpers.block import ( from eth2spec.test.helpers.sync_committee import ( compute_aggregate_sync_committee_signature, ) +from eth2spec.test.helpers.constants import PHASE0 from eth2spec.test.context import ( - PHASE0, with_all_phases_except, spec_state_test, ) diff --git a/tests/core/pyspec/eth2spec/test/altair/unittests/test_helpers.py b/tests/core/pyspec/eth2spec/test/altair/unittests/test_helpers.py index d89ff6d84..c837f06c3 100644 --- a/tests/core/pyspec/eth2spec/test/altair/unittests/test_helpers.py +++ b/tests/core/pyspec/eth2spec/test/altair/unittests/test_helpers.py @@ -1,8 +1,8 @@ from eth2spec.test.context import ( spec_state_test, with_phases, - ALTAIR, ) +from eth2spec.test.helpers.constants import ALTAIR from eth2spec.test.helpers.merkle import build_proof diff --git a/tests/core/pyspec/eth2spec/test/altair/unittests/test_sync_protocol.py b/tests/core/pyspec/eth2spec/test/altair/unittests/test_sync_protocol.py index 4c9b98e0a..9b8c35e76 100644 --- a/tests/core/pyspec/eth2spec/test/altair/unittests/test_sync_protocol.py +++ b/tests/core/pyspec/eth2spec/test/altair/unittests/test_sync_protocol.py @@ -1,6 +1,4 @@ from eth2spec.test.context import ( - ALTAIR, - MINIMAL, spec_state_test, with_configs, with_phases, @@ -10,6 +8,10 @@ from eth2spec.test.helpers.block import ( build_empty_block, build_empty_block_for_next_slot, ) +from eth2spec.test.helpers.constants import ( + ALTAIR, + MINIMAL, +) from eth2spec.test.helpers.state import ( next_slots, state_transition_and_sign_block, diff --git a/tests/core/pyspec/eth2spec/test/altair/unittests/validator/__init__.py b/tests/core/pyspec/eth2spec/test/altair/unittests/validator/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/core/pyspec/eth2spec/test/altair/unittests/validator/test_validator.py b/tests/core/pyspec/eth2spec/test/altair/unittests/validator/test_validator.py new file mode 100644 index 000000000..244e1aa7e --- /dev/null +++ b/tests/core/pyspec/eth2spec/test/altair/unittests/validator/test_validator.py @@ -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 diff --git a/tests/core/pyspec/eth2spec/test/context.py b/tests/core/pyspec/eth2spec/test/context.py index 7ae1b9541..002e84136 100644 --- a/tests/core/pyspec/eth2spec/test/context.py +++ b/tests/core/pyspec/eth2spec/test/context.py @@ -6,11 +6,15 @@ from eth2spec.merge import spec as spec_merge from eth2spec.utils import bls 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 .utils import vector_test, with_meta_tags 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 @@ -23,30 +27,6 @@ def reload_specs(): 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. # It would be better if they would be more well-defined interfaces for stronger typing. diff --git a/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_attestation.py b/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_attestation.py index 92633a8c5..707ac0b2e 100644 --- a/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_attestation.py +++ b/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_attestation.py @@ -1,9 +1,9 @@ from eth2spec.test.context import ( - CUSTODY_GAME, with_phases, spec_state_test, always_bls, ) +from eth2spec.test.helpers.constants import CUSTODY_GAME from eth2spec.test.helpers.state import transition_to from eth2spec.test.helpers.attestations import ( run_attestation_processing, diff --git a/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_chunk_challenge.py b/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_chunk_challenge.py index 69143812f..5a939c108 100644 --- a/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_chunk_challenge.py +++ b/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_chunk_challenge.py @@ -6,10 +6,12 @@ from eth2spec.test.helpers.custody import ( from eth2spec.test.helpers.attestations import ( get_valid_on_time_attestation, ) -from eth2spec.test.helpers.state import transition_to, transition_to_valid_shard_slot -from eth2spec.test.context import ( +from eth2spec.test.helpers.constants import ( CUSTODY_GAME, MINIMAL, +) +from eth2spec.test.helpers.state import transition_to, transition_to_valid_shard_slot +from eth2spec.test.context import ( expect_assertion_error, disable_process_reveal_deadlines, spec_state_test, diff --git a/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_custody_key_reveal.py b/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_custody_key_reveal.py index a825d7c75..fa8401228 100644 --- a/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_custody_key_reveal.py +++ b/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_custody_key_reveal.py @@ -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.context import ( - CUSTODY_GAME, with_phases, spec_state_test, expect_assertion_error, diff --git a/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_custody_slashing.py b/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_custody_slashing.py index 12ac708aa..f554761f3 100644 --- a/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_custody_slashing.py +++ b/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_custody_slashing.py @@ -5,12 +5,14 @@ from eth2spec.test.helpers.custody import ( from eth2spec.test.helpers.attestations import ( get_valid_on_time_attestation, ) +from eth2spec.test.helpers.constants import ( + CUSTODY_GAME, + MINIMAL, +) from eth2spec.test.helpers.keys import privkeys from eth2spec.utils.ssz.ssz_typing import ByteList from eth2spec.test.helpers.state import get_balance, transition_to from eth2spec.test.context import ( - MINIMAL, - CUSTODY_GAME, with_phases, spec_state_test, expect_assertion_error, diff --git a/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_early_derived_secret_reveal.py b/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_early_derived_secret_reveal.py index d3da6c580..904c9af4e 100644 --- a/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_early_derived_secret_reveal.py +++ b/tests/core/pyspec/eth2spec/test/custody_game/block_processing/test_process_early_derived_secret_reveal.py @@ -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.state import next_epoch_via_block, get_balance from eth2spec.test.context import ( - CUSTODY_GAME, with_phases, spec_state_test, expect_assertion_error, diff --git a/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_challenge_deadlines.py b/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_challenge_deadlines.py index f0e353cec..42ff54303 100644 --- a/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_challenge_deadlines.py +++ b/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_challenge_deadlines.py @@ -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.context import ( - CUSTODY_GAME, - MINIMAL, spec_state_test, with_phases, with_configs, ) 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.custody_game.block_processing.test_process_chunk_challenge import ( diff --git a/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_custody_final_updates.py b/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_custody_final_updates.py index acc076bce..92c311a29 100644 --- a/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_custody_final_updates.py +++ b/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_custody_final_updates.py @@ -1,4 +1,4 @@ -from eth2spec.test.context import ( +from eth2spec.test.helpers.constants import ( CUSTODY_GAME, ) from eth2spec.test.helpers.custody import ( diff --git a/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_reveal_deadlines.py b/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_reveal_deadlines.py index c82ebd8bb..aec24bca8 100644 --- a/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_reveal_deadlines.py +++ b/tests/core/pyspec/eth2spec/test/custody_game/epoch_processing/test_process_reveal_deadlines.py @@ -3,12 +3,14 @@ from eth2spec.test.helpers.custody import ( ) from eth2spec.test.helpers.state import transition_to from eth2spec.test.context import ( - CUSTODY_GAME, - MINIMAL, with_phases, with_configs, 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.custody_game.block_processing.test_process_custody_key_reveal import ( run_custody_key_reveal_processing, diff --git a/tests/core/pyspec/eth2spec/test/custody_game/sanity/test_blocks.py b/tests/core/pyspec/eth2spec/test/custody_game/sanity/test_blocks.py index 88dd54bda..5f5eadef3 100644 --- a/tests/core/pyspec/eth2spec/test/custody_game/sanity/test_blocks.py +++ b/tests/core/pyspec/eth2spec/test/custody_game/sanity/test_blocks.py @@ -1,14 +1,16 @@ from typing import Dict, Sequence from eth2spec.test.context import ( - CUSTODY_GAME, - MINIMAL, with_phases, spec_state_test, with_configs, ) from eth2spec.test.helpers.attestations import get_valid_on_time_attestation from eth2spec.test.helpers.block import build_empty_block +from eth2spec.test.helpers.constants import ( + CUSTODY_GAME, + MINIMAL, +) from eth2spec.test.helpers.custody import ( get_custody_slashable_test_vector, get_valid_chunk_challenge, diff --git a/tests/core/pyspec/eth2spec/test/helpers/constants.py b/tests/core/pyspec/eth2spec/test/helpers/constants.py new file mode 100644 index 000000000..bffffe348 --- /dev/null +++ b/tests/core/pyspec/eth2spec/test/helpers/constants.py @@ -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) diff --git a/tests/core/pyspec/eth2spec/test/helpers/typing.py b/tests/core/pyspec/eth2spec/test/helpers/typing.py new file mode 100644 index 000000000..04578f64c --- /dev/null +++ b/tests/core/pyspec/eth2spec/test/helpers/typing.py @@ -0,0 +1,4 @@ +from typing import NewType + +SpecForkName = NewType("SpecForkName", str) +ConfigName = NewType("ConfigName", str) diff --git a/tests/core/pyspec/eth2spec/test/phase0/epoch_processing/test_process_participation_record_updates.py b/tests/core/pyspec/eth2spec/test/phase0/epoch_processing/test_process_participation_record_updates.py index 978ef5739..c4d4332bc 100644 --- a/tests/core/pyspec/eth2spec/test/phase0/epoch_processing/test_process_participation_record_updates.py +++ b/tests/core/pyspec/eth2spec/test/phase0/epoch_processing/test_process_participation_record_updates.py @@ -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 ( run_epoch_processing_with ) diff --git a/tests/core/pyspec/eth2spec/test/phase0/fork_choice/test_get_head.py b/tests/core/pyspec/eth2spec/test/phase0/fork_choice/test_get_head.py index c598a3a7f..0822d44c2 100644 --- a/tests/core/pyspec/eth2spec/test/phase0/fork_choice/test_get_head.py +++ b/tests/core/pyspec/eth2spec/test/phase0/fork_choice/test_get_head.py @@ -1,7 +1,6 @@ from eth_utils import encode_hex from eth2spec.test.context import ( - MINIMAL, is_post_altair, spec_state_test, 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.block import build_empty_block_for_next_slot +from eth2spec.test.helpers.constants import MINIMAL from eth2spec.test.helpers.fork_choice import ( tick_and_run_on_attestation, tick_and_run_on_block, diff --git a/tests/core/pyspec/eth2spec/test/phase0/genesis/test_initialization.py b/tests/core/pyspec/eth2spec/test/phase0/genesis/test_initialization.py index 41fbd7726..be9d120b4 100644 --- a/tests/core/pyspec/eth2spec/test/phase0/genesis/test_initialization.py +++ b/tests/core/pyspec/eth2spec/test/phase0/genesis/test_initialization.py @@ -1,11 +1,11 @@ from eth2spec.test.context import ( - MINIMAL, is_post_altair, single_phase, spec_test, with_configs, with_all_phases, ) +from eth2spec.test.helpers.constants import MINIMAL from eth2spec.test.helpers.deposits import ( prepare_full_genesis_deposits, prepare_random_genesis_deposits, diff --git a/tests/core/pyspec/eth2spec/test/phase0/genesis/test_validity.py b/tests/core/pyspec/eth2spec/test/phase0/genesis/test_validity.py index a7bcaa6d0..91148da1d 100644 --- a/tests/core/pyspec/eth2spec/test/phase0/genesis/test_validity.py +++ b/tests/core/pyspec/eth2spec/test/phase0/genesis/test_validity.py @@ -1,11 +1,11 @@ from eth2spec.test.context import ( - MINIMAL, is_post_altair, spec_test, single_phase, with_configs, with_all_phases, ) +from eth2spec.test.helpers.constants import MINIMAL from eth2spec.test.helpers.deposits import ( prepare_full_genesis_deposits, ) diff --git a/tests/core/pyspec/eth2spec/test/phase0/rewards/test_basic.py b/tests/core/pyspec/eth2spec/test/phase0/rewards/test_basic.py index 82dbccc52..511849f8f 100644 --- a/tests/core/pyspec/eth2spec/test/phase0/rewards/test_basic.py +++ b/tests/core/pyspec/eth2spec/test/phase0/rewards/test_basic.py @@ -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 diff --git a/tests/core/pyspec/eth2spec/test/phase0/rewards/test_leak.py b/tests/core/pyspec/eth2spec/test/phase0/rewards/test_leak.py index f11b2734f..0ad2491f0 100644 --- a/tests/core/pyspec/eth2spec/test/phase0/rewards/test_leak.py +++ b/tests/core/pyspec/eth2spec/test/phase0/rewards/test_leak.py @@ -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 import eth2spec.test.helpers.rewards as rewards_helpers diff --git a/tests/core/pyspec/eth2spec/test/phase0/sanity/test_blocks.py b/tests/core/pyspec/eth2spec/test/phase0/sanity/test_blocks.py index 3efe07b01..9b184b018 100644 --- a/tests/core/pyspec/eth2spec/test/phase0/sanity/test_blocks.py +++ b/tests/core/pyspec/eth2spec/test/phase0/sanity/test_blocks.py @@ -24,9 +24,8 @@ from eth2spec.test.helpers.multi_operations import ( run_slash_and_exit, run_test_full_random_operations, ) - +from eth2spec.test.helpers.constants import PHASE0, MINIMAL from eth2spec.test.context import ( - PHASE0, MINIMAL, spec_test, spec_state_test, dump_skipping_message, with_phases, with_all_phases, single_phase, expect_assertion_error, always_bls, diff --git a/tests/core/pyspec/eth2spec/test/phase0/unittests/fork_choice/test_on_attestation.py b/tests/core/pyspec/eth2spec/test/phase0/unittests/fork_choice/test_on_attestation.py index 4d5f1ca16..fcc5e2d21 100644 --- a/tests/core/pyspec/eth2spec/test/phase0/unittests/fork_choice/test_on_attestation.py +++ b/tests/core/pyspec/eth2spec/test/phase0/unittests/fork_choice/test_on_attestation.py @@ -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.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.fork_choice import get_genesis_forkchoice_store diff --git a/tests/core/pyspec/eth2spec/test/phase0/unittests/validator/test_validator_unittest.py b/tests/core/pyspec/eth2spec/test/phase0/unittests/validator/test_validator_unittest.py index d793db789..fb63839d6 100644 --- a/tests/core/pyspec/eth2spec/test/phase0/unittests/validator/test_validator_unittest.py +++ b/tests/core/pyspec/eth2spec/test/phase0/unittests/validator/test_validator_unittest.py @@ -1,8 +1,8 @@ from eth2spec.test.context import ( spec_state_test, 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.block import build_empty_block from eth2spec.test.helpers.deposits import prepare_state_and_deposit diff --git a/tests/core/pyspec/eth2spec/test/sharding/unittests/test_get_start_shard.py b/tests/core/pyspec/eth2spec/test/sharding/unittests/test_get_start_shard.py index 41ef754b3..c38f28b2b 100644 --- a/tests/core/pyspec/eth2spec/test/sharding/unittests/test_get_start_shard.py +++ b/tests/core/pyspec/eth2spec/test/sharding/unittests/test_get_start_shard.py @@ -1,8 +1,8 @@ from eth2spec.test.context import ( - SHARDING, with_phases, spec_state_test, ) +from eth2spec.test.helpers.constants import SHARDING from eth2spec.test.helpers.state import next_epoch diff --git a/tests/generators/README.md b/tests/generators/README.md index 5e12e6bfe..731184326 100644 --- a/tests/generators/README.md +++ b/tests/generators/README.md @@ -164,7 +164,7 @@ Another example, to generate tests from pytests: ```python from eth2spec.phase0 import spec as spec_phase0 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 diff --git a/tests/generators/bls/main.py b/tests/generators/bls/main.py index fecc2df7d..3d67c9db3 100644 --- a/tests/generators/bls/main.py +++ b/tests/generators/bls/main.py @@ -12,7 +12,7 @@ from eth_utils import ( import milagro_bls_binding as milagro_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 diff --git a/tests/generators/epoch_processing/main.py b/tests/generators/epoch_processing/main.py index e3caf69fa..9efd96534 100644 --- a/tests/generators/epoch_processing/main.py +++ b/tests/generators/epoch_processing/main.py @@ -1,7 +1,7 @@ from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.phase0 import spec as spec_phase0 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) diff --git a/tests/generators/finality/main.py b/tests/generators/finality/main.py index 29ab46c39..e50425da4 100644 --- a/tests/generators/finality/main.py +++ b/tests/generators/finality/main.py @@ -1,7 +1,7 @@ from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.phase0 import spec as spec_phase0 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) diff --git a/tests/generators/fork_choice/main.py b/tests/generators/fork_choice/main.py index f09bbcc0a..445ee629c 100644 --- a/tests/generators/fork_choice/main.py +++ b/tests/generators/fork_choice/main.py @@ -1,7 +1,7 @@ from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.phase0 import spec as spec_phase0 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) diff --git a/tests/generators/forks/main.py b/tests/generators/forks/main.py index 3bec19735..71a4a54de 100644 --- a/tests/generators/forks/main.py +++ b/tests/generators/forks/main.py @@ -1,7 +1,7 @@ from importlib import reload 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.test.altair.fork import test_fork as test_altair_forks from eth2spec.phase0 import spec as spec_phase0 diff --git a/tests/generators/genesis/main.py b/tests/generators/genesis/main.py index 362677c24..3b4d045a3 100644 --- a/tests/generators/genesis/main.py +++ b/tests/generators/genesis/main.py @@ -1,7 +1,7 @@ from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.phase0 import spec as spec_phase0 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) diff --git a/tests/generators/operations/main.py b/tests/generators/operations/main.py index f00c4f894..0c1b84c24 100644 --- a/tests/generators/operations/main.py +++ b/tests/generators/operations/main.py @@ -1,7 +1,7 @@ from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.phase0 import spec as spec_phase0 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) diff --git a/tests/generators/rewards/main.py b/tests/generators/rewards/main.py index d8115f4cb..2a0f14863 100644 --- a/tests/generators/rewards/main.py +++ b/tests/generators/rewards/main.py @@ -1,7 +1,7 @@ from eth2spec.gen_helpers.gen_from_tests.gen import run_state_test_generators from eth2spec.phase0 import spec as spec_phase0 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) diff --git a/tests/generators/sanity/main.py b/tests/generators/sanity/main.py index 90f9a00df..7f7fecc67 100644 --- a/tests/generators/sanity/main.py +++ b/tests/generators/sanity/main.py @@ -1,6 +1,6 @@ from eth2spec.phase0 import spec as spec_phase0 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 diff --git a/tests/generators/shuffling/main.py b/tests/generators/shuffling/main.py index 091207bca..73b714760 100644 --- a/tests/generators/shuffling/main.py +++ b/tests/generators/shuffling/main.py @@ -6,7 +6,7 @@ from eth2spec.gen_helpers.gen_base import gen_runner, gen_typing from eth2spec.config import config_util 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): diff --git a/tests/generators/ssz_generic/main.py b/tests/generators/ssz_generic/main.py index 737f8cda6..e6cd3d976 100644 --- a/tests/generators/ssz_generic/main.py +++ b/tests/generators/ssz_generic/main.py @@ -6,7 +6,7 @@ import ssz_bitvector import ssz_boolean import ssz_uints 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: diff --git a/tests/generators/ssz_static/main.py b/tests/generators/ssz_static/main.py index 77a88a8cd..617fb2f02 100644 --- a/tests/generators/ssz_static/main.py +++ b/tests/generators/ssz_static/main.py @@ -9,7 +9,7 @@ from eth2spec.debug import random_value, encode from eth2spec.config import config_util from eth2spec.phase0 import spec as spec_phase0 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_impl import ( hash_tree_root,