Cleanups and fixes

This commit is contained in:
Justin Drake 2019-06-29 21:29:10 +01:00
parent d00b5b9ea0
commit 3a5872f8e4
5 changed files with 14 additions and 15 deletions

View File

@ -18,7 +18,7 @@ CHURN_LIMIT_QUOTIENT: 65536
# See issue 563 # See issue 563
SHUFFLE_ROUND_COUNT: 90 SHUFFLE_ROUND_COUNT: 90
# `2**16` (= 65,536) # `2**16` (= 65,536)
GENESIS_ACTIVE_VALIDATOR_COUNT: 65536 MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 65536
# Deposit contract # Deposit contract

View File

@ -17,7 +17,7 @@ CHURN_LIMIT_QUOTIENT: 65536
# [customized] Faster, but unsecure. # [customized] Faster, but unsecure.
SHUFFLE_ROUND_COUNT: 10 SHUFFLE_ROUND_COUNT: 10
# [customized] # [customized]
GENESIS_ACTIVE_VALIDATOR_COUNT: 100 MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 100
# Deposit contract # Deposit contract

View File

@ -189,7 +189,7 @@ The following values are (non-configurable) constants used throughout the specif
| `MIN_PER_EPOCH_CHURN_LIMIT` | `2**2` (= 4) | | `MIN_PER_EPOCH_CHURN_LIMIT` | `2**2` (= 4) |
| `CHURN_LIMIT_QUOTIENT` | `2**16` (= 65,536) | | `CHURN_LIMIT_QUOTIENT` | `2**16` (= 65,536) |
| `SHUFFLE_ROUND_COUNT` | `90` | | `SHUFFLE_ROUND_COUNT` | `90` |
| `MIN_GENESIS_ACTIVE_VALIDATOR_COUNT` | `2**16` (= 65,536) | | `MIN_MIN_GENESIS_ACTIVE_VALIDATOR_COUNT` | `2**16` (= 65,536) |
| `MIN_GENESIS_TIME` | `1578009600` (Jan 3, 2020) | | `MIN_GENESIS_TIME` | `1578009600` (Jan 3, 2020) |
| `JUSTIFICATION_BITS_LENGTH` | `4` | | `JUSTIFICATION_BITS_LENGTH` | `4` |
@ -1092,40 +1092,39 @@ def slash_validator(state: BeaconState,
### Genesis state ### Genesis state
Before the Ethereum 2.0 genesis has been triggered and for every Ethereum 1.0 block, call `get_genesis_beacon_state(eth1_block_hash, eth1_timestamp, deposits)` where: Before the Ethereum 2.0 genesis has been triggered, and for every Ethereum 1.0 block, call `get_genesis_beacon_state(eth1_block_hash, eth1_timestamp, deposits)` where:
* `eth1_block_hash` is the hash of the Ethereum 1.0 block * `eth1_block_hash` is the hash of the Ethereum 1.0 block
* `eth1_timestamp` is the Unix timestamp corresponding to `eth1_block_hash` * `eth1_timestamp` is the Unix timestamp corresponding to `eth1_block_hash`
* `deposits` is the sequence of all deposits, ordered chronologically, up to the block with hash `eth1_block_hash` * `deposits` is the sequence of all deposits, ordered chronologically, up to the block with hash `eth1_block_hash`
The genesis state `genesis_state` is defined as the return value of the first call to `get_genesis_beacon_state` that does not trigger an `assert`. The genesis state `genesis_state` is the return value of the first call to `get_genesis_beacon_state` that does not trigger an `assert`.
*Note*: The two constants `MIN_GENESIS_TIME` and `MIN_GENESIS_ACTIVE_VALIDATOR_COUNT` in `get_genesis_beacon_state` have yet to be agreed upon by the community, and can be updated as necessary. *Note*: The two constants `MIN_GENESIS_TIME` and `MIN_MIN_GENESIS_ACTIVE_VALIDATOR_COUNT` have yet to be agreed upon by the community, and can be updated as necessary.
```python ```python
def get_genesis_beacon_state(eth1_block_hash: Hash, eth1_timestamp: int, deposits: Sequence[Deposit]) -> BeaconState: def get_genesis_beacon_state(eth1_block_hash: Hash, eth1_timestamp: int, deposits: Sequence[Deposit]) -> BeaconState:
state = BeaconState( state = BeaconState(
genesis_time=timestamp - timestamp % SECONDS_PER_DAY + 2 * SECONDS_PER_DAY, genesis_time=timestamp - timestamp % SECONDS_PER_DAY + 2 * SECONDS_PER_DAY,
eth1_data=Eth1Data(block_hash=genesis_eth1_block_hash), eth1_data=Eth1Data(block_hash=genesis_eth1_block_hash, deposit_count=len(deposits)),
latest_block_header=BeaconBlockHeader(body_root=hash_tree_root(BeaconBlockBody())), latest_block_header=BeaconBlockHeader(body_root=hash_tree_root(BeaconBlockBody())),
) )
assert state.genesis_time >= MIN_GENESIS_TIME assert state.genesis_time >= MIN_GENESIS_TIME
# Process deposits # Process deposits
leaves = list(map(lambda deposit: deposit.data, deposits)) leaves = list(map(lambda deposit: deposit.data, deposits))
for deposit_index, deposit in enumerate(deposits): for index, deposit in enumerate(deposits):
state.eth1_data.deposit_root = hash_tree_root( state.eth1_data.deposit_root = hash_tree_root(
List[DepositData, 2**DEPOSIT_CONTRACT_TREE_DEPTH](*leaves[:deposit_index + 1]) List[DepositData, 2**DEPOSIT_CONTRACT_TREE_DEPTH](*leaves[:index + 1])
) )
state.eth1_data.deposit_count = deposit_index + 1
process_deposit(state, deposit) process_deposit(state, deposit)
# Process genesis activations # Process activations
for validator in state.validators: for validator in state.validators:
if validator.effective_balance == MAX_EFFECTIVE_BALANCE: if validator.effective_balance == MAX_EFFECTIVE_BALANCE:
validator.activation_eligibility_epoch = GENESIS_EPOCH validator.activation_eligibility_epoch = GENESIS_EPOCH
validator.activation_epoch = GENESIS_EPOCH validator.activation_epoch = GENESIS_EPOCH
assert len(get_active_validator_indices(state, GENESIS_EPOCH)) >= MIN_GENESIS_ACTIVE_VALIDATOR_COUNT assert len(get_active_validator_indices(state, GENESIS_EPOCH)) >= MIN_MIN_GENESIS_ACTIVE_VALIDATOR_COUNT
# Populate active_index_roots # Populate active_index_roots
genesis_active_index_root = hash_tree_root( genesis_active_index_root = hash_tree_root(

View File

@ -7,7 +7,7 @@ from eth2spec.test.helpers.deposits import (
@with_phases(['phase0']) @with_phases(['phase0'])
@spectest_with_bls_switch @spectest_with_bls_switch
def test_genesis(spec): def test_genesis(spec):
deposit_count = spec.GENESIS_ACTIVE_VALIDATOR_COUNT deposit_count = spec.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT
genesis_deposits, deposit_root = prepare_genesis_deposits(spec, deposit_count, spec.MAX_EFFECTIVE_BALANCE) genesis_deposits, deposit_root = prepare_genesis_deposits(spec, deposit_count, spec.MAX_EFFECTIVE_BALANCE)
genesis_time = 1546300800 genesis_time = 1546300800
genesis_eth1_block_hash = b'\x12' * 32 genesis_eth1_block_hash = b'\x12' * 32

View File

@ -23,7 +23,7 @@ def test_is_genesis_trigger_false(spec):
@with_phases(['phase0']) @with_phases(['phase0'])
@spectest_with_bls_switch @spectest_with_bls_switch
def test_is_genesis_trigger_true(spec): def test_is_genesis_trigger_true(spec):
deposit_count = spec.GENESIS_ACTIVE_VALIDATOR_COUNT deposit_count = spec.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT
genesis_deposits, _ = prepare_genesis_deposits(spec, deposit_count, spec.MAX_EFFECTIVE_BALANCE) genesis_deposits, _ = prepare_genesis_deposits(spec, deposit_count, spec.MAX_EFFECTIVE_BALANCE)
SECONDS_PER_DAY = 86400 SECONDS_PER_DAY = 86400
genesis_time = 1578009600 - 2 * SECONDS_PER_DAY genesis_time = 1578009600 - 2 * SECONDS_PER_DAY
@ -40,7 +40,7 @@ def test_is_genesis_trigger_true(spec):
@with_phases(['phase0']) @with_phases(['phase0'])
@spectest_with_bls_switch @spectest_with_bls_switch
def test_is_genesis_trigger_not_enough_balance(spec): def test_is_genesis_trigger_not_enough_balance(spec):
deposit_count = spec.GENESIS_ACTIVE_VALIDATOR_COUNT deposit_count = spec.MIN_GENESIS_ACTIVE_VALIDATOR_COUNT
genesis_deposits, _ = prepare_genesis_deposits(spec, deposit_count, spec.MAX_EFFECTIVE_BALANCE - 1) genesis_deposits, _ = prepare_genesis_deposits(spec, deposit_count, spec.MAX_EFFECTIVE_BALANCE - 1)
genesis_time = 1546300800 genesis_time = 1546300800
yield "deposits", genesis_deposits yield "deposits", genesis_deposits