From 47a818c705335d166b5a0d99bdefff9f3d1f042a Mon Sep 17 00:00:00 2001 From: Justin Drake Date: Sun, 22 Sep 2019 20:27:42 +0100 Subject: [PATCH] Add domain_type to get_seed --- configs/mainnet.yaml | 4 ++-- configs/minimal.yaml | 4 ++-- specs/core/0_beacon-chain.md | 20 +++++++++---------- specs/core/1_shard-data-chains.md | 5 +++-- specs/validator/0_beacon-chain-validator.md | 2 +- .../eth2spec/test/helpers/attestations.py | 2 +- 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/configs/mainnet.yaml b/configs/mainnet.yaml index d4e69dab5..86fa8dcc5 100644 --- a/configs/mainnet.yaml +++ b/configs/mainnet.yaml @@ -123,8 +123,8 @@ MAX_TRANSFERS: 0 # Signature domains # --------------------------------------------------------------- DOMAIN_BEACON_PROPOSER: 0x00000000 -DOMAIN_RANDAO: 0x01000000 -DOMAIN_ATTESTATION: 0x02000000 +DOMAIN_BEACON_ATTESTER: 0x01000000 +DOMAIN_RANDAO: 0x02000000 DOMAIN_DEPOSIT: 0x03000000 DOMAIN_VOLUNTARY_EXIT: 0x04000000 DOMAIN_TRANSFER: 0x05000000 diff --git a/configs/minimal.yaml b/configs/minimal.yaml index be787ca3c..8c6a9e11f 100644 --- a/configs/minimal.yaml +++ b/configs/minimal.yaml @@ -125,8 +125,8 @@ MAX_TRANSFERS: 0 # Signature domains # --------------------------------------------------------------- DOMAIN_BEACON_PROPOSER: 0x00000000 -DOMAIN_RANDAO: 0x01000000 -DOMAIN_ATTESTATION: 0x02000000 +DOMAIN_BEACON_ATTESTER: 0x01000000 +DOMAIN_RANDAO: 0x02000000 DOMAIN_DEPOSIT: 0x03000000 DOMAIN_VOLUNTARY_EXIT: 0x04000000 DOMAIN_TRANSFER: 0x05000000 diff --git a/specs/core/0_beacon-chain.md b/specs/core/0_beacon-chain.md index 5bdfc7a5b..cfdf24e71 100644 --- a/specs/core/0_beacon-chain.md +++ b/specs/core/0_beacon-chain.md @@ -19,7 +19,7 @@ - [State list lengths](#state-list-lengths) - [Rewards and penalties](#rewards-and-penalties) - [Max operations per block](#max-operations-per-block) - - [Signature domain types](#signature-domain-types) + - [Domain types](#domain-types) - [Containers](#containers) - [Misc dependencies](#misc-dependencies) - [`Fork`](#fork) @@ -148,7 +148,7 @@ We define the following Python custom types for type hinting and readability: | `Gwei` | `uint64` | an amount in Gwei | | `Hash` | `Bytes32` | a hash | | `Version` | `Bytes4` | a fork version number | -| `DomainType` | `Bytes4` | a signature domain type | +| `DomainType` | `Bytes4` | a domain type | | `Domain` | `Bytes8` | a signature domain | | `BLSPubkey` | `Bytes48` | a BLS12-381 public key | | `BLSSignature` | `Bytes96` | a BLS12-381 signature | @@ -250,15 +250,15 @@ The following values are (non-configurable) constants used throughout the specif | `MAX_VOLUNTARY_EXITS` | `2**4` (= 16) | | `MAX_TRANSFERS` | `0` | -### Signature domain types +### Domain types The following types are defined, mapping into `DomainType` (little endian): | Name | Value | | - | - | | `DOMAIN_BEACON_PROPOSER` | `0` | -| `DOMAIN_RANDAO` | `1` | -| `DOMAIN_ATTESTATION` | `2` | +| `DOMAIN_BEACON_ATTESTER` | `1` | +| `DOMAIN_RANDAO` | `2` | | `DOMAIN_DEPOSIT` | `3` | | `DOMAIN_VOLUNTARY_EXIT` | `4` | | `DOMAIN_TRANSFER` | `5` | @@ -671,7 +671,7 @@ def is_valid_indexed_attestation(state: BeaconState, indexed_attestation: Indexe hash_tree_root(AttestationDataAndCustodyBit(data=indexed_attestation.data, custody_bit=0b1)), ], signature=indexed_attestation.signature, - domain=get_domain(state, DOMAIN_ATTESTATION, indexed_attestation.data.target.epoch), + domain=get_domain(state, DOMAIN_BEACON_ATTESTER, indexed_attestation.data.target.epoch), ): return False return True @@ -870,12 +870,12 @@ def get_validator_churn_limit(state: BeaconState) -> uint64: #### `get_seed` ```python -def get_seed(state: BeaconState, epoch: Epoch) -> Hash: +def get_seed(state: BeaconState, epoch: Epoch, domain_type: DomainType) -> Hash: """ Return the seed at ``epoch``. """ mix = get_randao_mix(state, Epoch(epoch + EPOCHS_PER_HISTORICAL_VECTOR - MIN_SEED_LOOKAHEAD - 1)) # Avoid underflow - return hash(mix + int_to_bytes(epoch, length=32)) + return hash(domain_type + mix + int_to_bytes(epoch, length=32)) ``` #### `get_committee_count` @@ -901,7 +901,7 @@ def get_crosslink_committee(state: BeaconState, epoch: Epoch, shard: Shard) -> S """ return compute_committee( indices=get_active_validator_indices(state, epoch), - seed=get_seed(state, epoch), + seed=get_seed(state, epoch, DOMAIN_BEACON_ATTESTER), index=(shard + SHARD_COUNT - get_start_shard(state, epoch)) % SHARD_COUNT, count=get_committee_count(state, epoch), ) @@ -941,7 +941,7 @@ def get_beacon_proposer_index(state: BeaconState) -> ValidatorIndex: Return the beacon proposer index at the current slot. """ epoch = get_current_epoch(state) - seed = hash(get_seed(state, epoch) + int_to_bytes(state.slot, length=8)) + seed = hash(get_seed(state, epoch, DOMAIN_BEACON_PROPOSER) + int_to_bytes(state.slot, length=8)) indices = get_active_validator_indices(state, epoch) return compute_proposer_index(state, indices, seed) ``` diff --git a/specs/core/1_shard-data-chains.md b/specs/core/1_shard-data-chains.md index 3dc549816..a6e9c997f 100644 --- a/specs/core/1_shard-data-chains.md +++ b/specs/core/1_shard-data-chains.md @@ -225,7 +225,7 @@ def get_period_committee(state: BeaconState, epoch: Epoch, shard: Shard) -> Sequ """ full_committee = compute_committee( indices=get_active_validator_indices(state, epoch), - seed=get_seed(state, epoch), + seed=get_seed(state, epoch, DOMAIN_SHARD_ATTESTER), index=shard, count=SHARD_COUNT, ) @@ -270,7 +270,8 @@ def get_shard_block_proposer_index(state: BeaconState, return None MAX_RANDOM_BYTE = 2**8 - 1 - seed = hash(get_seed(state, current_epoch) + int_to_bytes(shard, length=8) + int_to_bytes(slot, length=8)) + seed = get_seed(state, current_epoch, DOMAIN_SHARD_PROPOSER) + seed = hash(seed + int_to_bytes(shard, length=8) + int_to_bytes(slot, length=8)) i = 0 while True: candidate_index = active_indices[(slot + i) % len(active_indices)] diff --git a/specs/validator/0_beacon-chain-validator.md b/specs/validator/0_beacon-chain-validator.md index fc91fd2e7..29723f391 100644 --- a/specs/validator/0_beacon-chain-validator.md +++ b/specs/validator/0_beacon-chain-validator.md @@ -345,7 +345,7 @@ def get_signed_attestation_data(state: BeaconState, attestation: IndexedAttestat custody_bit=0b0, ) - domain = get_domain(state, DOMAIN_ATTESTATION, attestation.data.target.epoch) + domain = get_domain(state, DOMAIN_BEACON_ATTESTER, attestation.data.target.epoch) return bls_sign(privkey, hash_tree_root(attestation_data_and_custody_bit), domain) ``` diff --git a/test_libs/pyspec/eth2spec/test/helpers/attestations.py b/test_libs/pyspec/eth2spec/test/helpers/attestations.py index 868517018..23d1a8f8f 100644 --- a/test_libs/pyspec/eth2spec/test/helpers/attestations.py +++ b/test_libs/pyspec/eth2spec/test/helpers/attestations.py @@ -122,7 +122,7 @@ def get_attestation_signature(spec, state, attestation_data, privkey, custody_bi privkey=privkey, domain=spec.get_domain( state=state, - domain_type=spec.DOMAIN_ATTESTATION, + domain_type=spec.DOMAIN_BEACON_ATTESTER, message_epoch=attestation_data.target.epoch, ) )