From 882aa81ee93787bdbc14e8319b8a4283aed739f6 Mon Sep 17 00:00:00 2001 From: protolambda Date: Thu, 18 Mar 2021 00:01:46 +0100 Subject: [PATCH] cleanup --- specs/custody/custody-game.md | 86 +++++++++++++++----------- specs/custody/validator.md | 47 +------------- specs/sharding/fork.md | 111 ---------------------------------- 3 files changed, 53 insertions(+), 191 deletions(-) delete mode 100644 specs/sharding/fork.md diff --git a/specs/custody/custody-game.md b/specs/custody/custody-game.md index 136116c2f..c371e698c 100644 --- a/specs/custody/custody-game.md +++ b/specs/custody/custody-game.md @@ -4,46 +4,15 @@ ## Table of contents + -- [Introduction](#introduction) -- [Constants](#constants) - - [Misc](#misc) -- [Configuration](#configuration) - - [Time parameters](#time-parameters) - - [Max operations per block](#max-operations-per-block) - - [Reward and penalty quotients](#reward-and-penalty-quotients) -- [Data structures](#data-structures) - - [New Beacon Chain operations](#new-beacon-chain-operations) - - [`CustodyChunkChallenge`](#custodychunkchallenge) - - [`CustodyChunkChallengeRecord`](#custodychunkchallengerecord) - - [`CustodyChunkResponse`](#custodychunkresponse) - - [`CustodySlashing`](#custodyslashing) - - [`SignedCustodySlashing`](#signedcustodyslashing) - - [`CustodyKeyReveal`](#custodykeyreveal) - - [`EarlyDerivedSecretReveal`](#earlyderivedsecretreveal) -- [Helpers](#helpers) - - [`replace_empty_or_append`](#replace_empty_or_append) - - [`legendre_bit`](#legendre_bit) - - [`get_custody_atoms`](#get_custody_atoms) - - [`get_custody_secrets`](#get_custody_secrets) - - [`universal_hash_function`](#universal_hash_function) - - [`compute_custody_bit`](#compute_custody_bit) - - [`get_randao_epoch_for_custody_period`](#get_randao_epoch_for_custody_period) - - [`get_custody_period_for_validator`](#get_custody_period_for_validator) -- [Per-block processing](#per-block-processing) - - [Custody Game Operations](#custody-game-operations) - - [Chunk challenges](#chunk-challenges) - - [Custody chunk response](#custody-chunk-response) - - [Custody key reveals](#custody-key-reveals) - - [Early derived secret reveals](#early-derived-secret-reveals) - - [Custody Slashings](#custody-slashings) -- [Per-epoch processing](#per-epoch-processing) - - [Handling of reveal deadlines](#handling-of-reveal-deadlines) - - [Final updates](#final-updates) +TODO + + ## Introduction @@ -83,6 +52,14 @@ This document details the beacon chain additions and changes in Phase 1 of Ether | `MAX_CUSTODY_CHUNK_CHALLENGE_RESPONSES` | `uint64(2**4)` (= 16) | | `MAX_CUSTODY_SLASHINGS` | `uint64(2**0)` (= 1) | + +### Size parameters + +| Name | Value | Unit | +| - | - | - | +| `BYTES_PER_CUSTODY_CHUNK` | `uint64(2**12)` (= 4,096) | bytes | +| `CUSTODY_RESPONSE_DEPTH` | `ceillog2(MAX_SHARD_BLOCK_SIZE // BYTES_PER_CUSTODY_CHUNK)` | - | + ### Reward and penalty quotients | Name | Value | @@ -92,6 +69,45 @@ This document details the beacon chain additions and changes in Phase 1 of Ether ## Data structures +### Extended types + +#### `Validator` + +```python +class Validator(phase0.Validator): + # next_custody_secret_to_reveal is initialised to the custody period + # (of the particular validator) in which the validator is activated + # = get_custody_period_for_validator(...) + next_custody_secret_to_reveal: uint64 + # TODO: The max_reveal_lateness doesn't really make sense anymore. + # So how do we incentivise early custody key reveals now? + all_custody_secrets_revealed_epoch: Epoch # to be initialized to FAR_FUTURE_EPOCH +``` + +#### `BeaconBlockBody` + +```python +class BeaconBlockBody(phase0.BeaconBlockBody): + # Custody game + chunk_challenges: List[CustodyChunkChallenge, MAX_CUSTODY_CHUNK_CHALLENGES] + chunk_challenge_responses: List[CustodyChunkResponse, MAX_CUSTODY_CHUNK_CHALLENGE_RESPONSES] + custody_key_reveals: List[CustodyKeyReveal, MAX_CUSTODY_KEY_REVEALS] + early_derived_secret_reveals: List[EarlyDerivedSecretReveal, MAX_EARLY_DERIVED_SECRET_REVEALS] + custody_slashings: List[SignedCustodySlashing, MAX_CUSTODY_SLASHINGS] +``` + +#### `BeaconState` + +```python +class BeaconState(phase0.BeaconState): + # Future derived secrets already exposed; contains the indices of the exposed validator + # at RANDAO reveal period % EARLY_DERIVED_SECRET_PENALTY_MAX_FUTURE_EPOCHS + exposed_derived_secrets: Vector[List[ValidatorIndex, MAX_EARLY_DERIVED_SECRET_REVEALS * SLOTS_PER_EPOCH], + EARLY_DERIVED_SECRET_PENALTY_MAX_FUTURE_EPOCHS] + custody_chunk_challenge_records: List[CustodyChunkChallengeRecord, MAX_CUSTODY_CHUNK_CHALLENGE_RECORDS] + custody_chunk_challenge_index: uint64 +``` + ### New Beacon Chain operations #### `CustodyChunkChallenge` diff --git a/specs/custody/validator.md b/specs/custody/validator.md index c6d29e725..5e4696274 100644 --- a/specs/custody/validator.md +++ b/specs/custody/validator.md @@ -10,55 +10,12 @@ participating in the Ethereum 2.0 Phase 1 protocol. -- [Introduction](#introduction) -- [Prerequisites](#prerequisites) -- [Constants](#constants) - - [Misc](#misc) -- [Becoming a validator](#becoming-a-validator) -- [Beacon chain validator assignments](#beacon-chain-validator-assignments) - - [Lookahead](#lookahead) -- [Beacon chain responsibilities](#beacon-chain-responsibilities) - - [Block proposal](#block-proposal) - - [Preparing for a `BeaconBlock`](#preparing-for-a-beaconblock) - - [Constructing the `BeaconBlockBody`](#constructing-the-beaconblockbody) - - [Custody slashings](#custody-slashings) - - [Custody key reveals](#custody-key-reveals) - - [Early derived secret reveals](#early-derived-secret-reveals) - - [Shard transitions](#shard-transitions) - - [Light client fields](#light-client-fields) - - [Packaging into a `SignedBeaconBlock`](#packaging-into-a-signedbeaconblock) - - [Attesting](#attesting) - - [`FullAttestationData`](#fullattestationdata) - - [`FullAttestation`](#fullattestation) - - [Timing](#timing) - - [Attestation data](#attestation-data) - - [Shard head root](#shard-head-root) - - [Shard transition](#shard-transition) - - [Construct attestation](#construct-attestation) - - [Attestation Aggregation](#attestation-aggregation) - - [Broadcast aggregate](#broadcast-aggregate) - - [`AggregateAndProof`](#aggregateandproof) - - [`SignedAggregateAndProof`](#signedaggregateandproof) - - [Light client committee](#light-client-committee) - - [Preparation](#preparation) - - [Light client vote](#light-client-vote) - - [Light client vote data](#light-client-vote-data) - - [`LightClientVoteData`](#lightclientvotedata) - - [Construct vote](#construct-vote) - - [`LightClientVote`](#lightclientvote) - - [Broadcast](#broadcast) - - [Light client vote aggregation](#light-client-vote-aggregation) - - [Aggregation selection](#aggregation-selection) - - [Construct aggregate](#construct-aggregate) - - [Broadcast aggregate](#broadcast-aggregate-1) - - [`LightAggregateAndProof`](#lightaggregateandproof) - - [`SignedLightAggregateAndProof`](#signedlightaggregateandproof) -- [How to avoid slashing](#how-to-avoid-slashing) - - [Custody slashing](#custody-slashing) +TODO + ## Introduction ## Prerequisites diff --git a/specs/sharding/fork.md b/specs/sharding/fork.md deleted file mode 100644 index d81ca64b3..000000000 --- a/specs/sharding/fork.md +++ /dev/null @@ -1,111 +0,0 @@ -# Ethereum 2.0 Phase 1 -- From Phase 0 to Phase 1 - -**Notice**: This document is a work-in-progress for researchers and implementers. - -## Table of contents - - - - -- [Introduction](#introduction) -- [Configuration](#configuration) -- [Fork to Phase 1](#fork-to-phase-1) - - [Fork trigger](#fork-trigger) - - [Upgrading the state](#upgrading-the-state) - - - -## Introduction - -This document describes the process of moving from Phase 0 to Phase 1 of Ethereum 2.0. - -## Configuration - -Warning: this configuration is not definitive. - -| Name | Value | -| - | - | -| `PHASE_1_FORK_VERSION` | `Version('0x01000000')` | -| `PHASE_1_FORK_SLOT` | `Slot(0)` **TBD** | - -## Fork to Phase 1 - -### Fork trigger - -TBD. Social consensus, along with state conditions such as epoch boundary, finality, deposits, active validator count, etc. may be part of the decision process to trigger the fork. For now we assume the condition will be triggered at slot `PHASE_1_FORK_SLOT`, where `PHASE_1_FORK_SLOT % SLOTS_PER_EPOCH == 0`. - -### Upgrading the state - -After `process_slots` of Phase 0 finishes, if `state.slot == PHASE_1_FORK_SLOT`, an irregular state change is made to upgrade to Phase 1. - -```python -def upgrade_to_phase1(pre: phase0.BeaconState) -> BeaconState: - epoch = get_current_epoch(pre) - post = BeaconState( - genesis_time=pre.genesis_time, - slot=pre.slot, - fork=Fork( - previous_version=pre.fork.current_version, - current_version=PHASE_1_FORK_VERSION, - epoch=epoch, - ), - # History - latest_block_header=pre.latest_block_header, - block_roots=pre.block_roots, - state_roots=pre.state_roots, - historical_roots=pre.historical_roots, - # Eth1 - eth1_data=pre.eth1_data, - eth1_data_votes=pre.eth1_data_votes, - eth1_deposit_index=pre.eth1_deposit_index, - # Registry - validators=List[Validator, VALIDATOR_REGISTRY_LIMIT]( - Validator( - pubkey=phase0_validator.pubkey, - withdrawal_credentials=phase0_validator.withdrawal_credentials, - effective_balance=phase0_validator.effective_balance, - slashed=phase0_validator.slashed, - activation_eligibility_epoch=phase0_validator.activation_eligibility_epoch, - activation_epoch=phase0_validator.activation_eligibility_epoch, - exit_epoch=phase0_validator.exit_epoch, - withdrawable_epoch=phase0_validator.withdrawable_epoch, - next_custody_secret_to_reveal=get_custody_period_for_validator(ValidatorIndex(i), epoch), - all_custody_secrets_revealed_epoch=FAR_FUTURE_EPOCH, - ) for i, phase0_validator in enumerate(pre.validators) - ), - balances=pre.balances, - # Randomness - randao_mixes=pre.randao_mixes, - # Slashings - slashings=pre.slashings, - # Attestations - # previous_epoch_attestations is cleared on upgrade. - previous_epoch_attestations=List[PendingAttestation, MAX_ATTESTATIONS * SLOTS_PER_EPOCH](), - # empty in pre state, since the upgrade is performed just after an epoch boundary. - current_epoch_attestations=List[PendingAttestation, MAX_ATTESTATIONS * SLOTS_PER_EPOCH](), - # Finality - justification_bits=pre.justification_bits, - previous_justified_checkpoint=pre.previous_justified_checkpoint, - current_justified_checkpoint=pre.current_justified_checkpoint, - finalized_checkpoint=pre.finalized_checkpoint, - # Phase 1 - current_epoch_start_shard=Shard(0), - shard_states=List[ShardState, MAX_SHARDS]( - ShardState( - slot=compute_previous_slot(pre.slot), - gasprice=MIN_GASPRICE, - latest_block_root=Root(), - ) for i in range(INITIAL_ACTIVE_SHARDS) - ), - online_countdown=[ONLINE_PERIOD] * len(pre.validators), # all online - current_light_committee=CompactCommittee(), # computed after state creation - next_light_committee=CompactCommittee(), - # Custody game - exposed_derived_secrets=[()] * EARLY_DERIVED_SECRET_PENALTY_MAX_FUTURE_EPOCHS, - # exposed_derived_secrets will fully default to zeroes - ) - next_epoch = Epoch(epoch + 1) - post.current_light_committee = committee_to_compact_committee(post, get_light_client_committee(post, epoch)) - post.next_light_committee = committee_to_compact_committee(post, get_light_client_committee(post, next_epoch)) - return post -```