Merge branch 'master' into vbuterin-patch-1
This commit is contained in:
commit
347e796b39
|
@ -43,7 +43,6 @@ The primary source of load on the beacon chain are "attestations". Attestations
|
||||||
| `MIN_VALIDATOR_SET_CHANGE_INTERVAL` | 2**8 (= 256) | slots | ~25 minutes |
|
| `MIN_VALIDATOR_SET_CHANGE_INTERVAL` | 2**8 (= 256) | slots | ~25 minutes |
|
||||||
| `SHARD_PERSISTENT_COMMITTEE_CHANGE_PERIOD` | 2**17 (= 131,072) | slots | ~9 days |
|
| `SHARD_PERSISTENT_COMMITTEE_CHANGE_PERIOD` | 2**17 (= 131,072) | slots | ~9 days |
|
||||||
| `MIN_ATTESTATION_INCLUSION_DELAY` | 2**2 (= 4) | slots | ~24 seconds |
|
| `MIN_ATTESTATION_INCLUSION_DELAY` | 2**2 (= 4) | slots | ~24 seconds |
|
||||||
| `RANDAO_SLOTS_PER_LAYER` | 2**12 (= 4,096) | slots | ~7 hours |
|
|
||||||
| `SQRT_E_DROP_TIME` | 2**11 (= 1,024) | cycles | ~9 days |
|
| `SQRT_E_DROP_TIME` | 2**11 (= 1,024) | cycles | ~9 days |
|
||||||
| `WITHDRAWALS_PER_CYCLE` | 2**2 (=4) | validators | 5.2m ETH in ~6 months |
|
| `WITHDRAWALS_PER_CYCLE` | 2**2 (=4) | validators | 5.2m ETH in ~6 months |
|
||||||
| `MIN_WITHDRAWAL_PERIOD` | 2**13 (= 8,192) | slots | ~14 hours |
|
| `MIN_WITHDRAWAL_PERIOD` | 2**13 (= 8,192) | slots | ~14 hours |
|
||||||
|
@ -55,6 +54,7 @@ The primary source of load on the beacon chain are "attestations". Attestations
|
||||||
| `INCLUDER_REWARD_QUOTIENT` | 2**14 (= 16,384) | — |
|
| `INCLUDER_REWARD_QUOTIENT` | 2**14 (= 16,384) | — |
|
||||||
| `MAX_VALIDATOR_CHURN_QUOTIENT` | 2**5 (= 32) | — |
|
| `MAX_VALIDATOR_CHURN_QUOTIENT` | 2**5 (= 32) | — |
|
||||||
| `POW_CONTRACT_MERKLE_TREE_DEPTH` | 2**5 (= 32) | - |
|
| `POW_CONTRACT_MERKLE_TREE_DEPTH` | 2**5 (= 32) | - |
|
||||||
|
| `MAX_ATTESTATION_COUNT` | 2**7 (= 128) | - |
|
||||||
| `LOGOUT_MESSAGE` | `"LOGOUT"` | — |
|
| `LOGOUT_MESSAGE` | `"LOGOUT"` | — |
|
||||||
| `INITIAL_FORK_VERSION` | 0 | — |
|
| `INITIAL_FORK_VERSION` | 0 | — |
|
||||||
|
|
||||||
|
@ -200,7 +200,7 @@ A `SpecialRecord` has the following fields:
|
||||||
```python
|
```python
|
||||||
{
|
{
|
||||||
# Kind
|
# Kind
|
||||||
'kind': 'uint8',
|
'kind': 'uint64',
|
||||||
# Data
|
# Data
|
||||||
'data': 'bytes'
|
'data': 'bytes'
|
||||||
}
|
}
|
||||||
|
@ -269,12 +269,12 @@ A `ValidatorRecord` has the following fields:
|
||||||
'withdrawal_credentials': 'hash32',
|
'withdrawal_credentials': 'hash32',
|
||||||
# RANDAO commitment
|
# RANDAO commitment
|
||||||
'randao_commitment': 'hash32',
|
'randao_commitment': 'hash32',
|
||||||
# Slot the RANDAO commitment was last changed
|
# Slot the proposer has skipped (ie. layers of RANDAO expected)
|
||||||
'randao_last_change': 'uint64',
|
'randao_skips': 'uint64',
|
||||||
# Balance in Gwei
|
# Balance in Gwei
|
||||||
'balance': 'uint64',
|
'balance': 'uint64',
|
||||||
# Status code
|
# Status code
|
||||||
'status': 'uint8',
|
'status': 'uint64',
|
||||||
# Slot when validator last changed status (or 0)
|
# Slot when validator last changed status (or 0)
|
||||||
'last_status_change_slot': 'uint64'
|
'last_status_change_slot': 'uint64'
|
||||||
# Sequence number when validator exited (or 0)
|
# Sequence number when validator exited (or 0)
|
||||||
|
@ -610,6 +610,9 @@ def int_sqrt(n: int) -> int:
|
||||||
The beacon chain is initialized when a condition is met inside a contract on the existing PoW chain. This contract's code in Vyper is as follows:
|
The beacon chain is initialized when a condition is met inside a contract on the existing PoW chain. This contract's code in Vyper is as follows:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
|
SECONDS_PER_DAY: constant(uint256) = 86400
|
||||||
|
POW_CONTRACT_MERKLE_TREE_DEPTH: constant(int128) = 32
|
||||||
|
|
||||||
HashChainValue: event({previous_receipt_root: bytes32, data: bytes[2064], total_deposit_count: int128})
|
HashChainValue: event({previous_receipt_root: bytes32, data: bytes[2064], total_deposit_count: int128})
|
||||||
ChainStart: event({receipt_root: bytes32, time: bytes[8]})
|
ChainStart: event({receipt_root: bytes32, time: bytes[8]})
|
||||||
|
|
||||||
|
@ -620,19 +623,21 @@ total_deposit_count: int128
|
||||||
@public
|
@public
|
||||||
def deposit(deposit_params: bytes[2048]):
|
def deposit(deposit_params: bytes[2048]):
|
||||||
index:int128 = self.total_deposit_count + 2**POW_CONTRACT_MERKLE_TREE_DEPTH
|
index:int128 = self.total_deposit_count + 2**POW_CONTRACT_MERKLE_TREE_DEPTH
|
||||||
msg_gwei_bytes8: bytes[8] = slice(convert(msg.value / 10**9, 'bytes32'), 24, 8)
|
msg_gwei_bytes8: bytes[8] = slice(concat("", convert(msg.value / 10**9, bytes32)), start=24, len=8)
|
||||||
timestamp_bytes8: bytes[8] = slice(convert(block.timestamp, 'bytes32'), 24, 8)
|
timestamp_bytes8: bytes[8] = slice(concat("", convert(block.timestamp, bytes32)), start=24, len=8)
|
||||||
deposit_data: bytes[2064] = concat(deposit_params, msg_gwei_bytes8, timestamp_bytes8)
|
deposit_data: bytes[2064] = concat(deposit_params, msg_gwei_bytes8, timestamp_bytes8)
|
||||||
|
|
||||||
log.HashChainValue(self.receipt_tree[1], deposit_data, self.total_deposit_count)
|
log.HashChainValue(self.receipt_tree[1], deposit_data, self.total_deposit_count)
|
||||||
|
|
||||||
self.receipt_tree[index] = sha3(deposit_data)
|
self.receipt_tree[index] = sha3(deposit_data)
|
||||||
for i in range(POW_CONTRACT_MERKLE_TREE_DEPTH):
|
for i in range(POW_CONTRACT_MERKLE_TREE_DEPTH):
|
||||||
index //= 2
|
index /= 2
|
||||||
self.receipt_tree[index] = sha3(concat(self.receipt_tree[index * 2], self.receipt_tree[index * 2 + 1]))
|
self.receipt_tree[index] = sha3(concat(self.receipt_tree[index * 2], self.receipt_tree[index * 2 + 1]))
|
||||||
self.total_deposit_count += 1
|
self.total_deposit_count += 1
|
||||||
if self.total_deposit_count == 16384:
|
if self.total_deposit_count == 16384:
|
||||||
log.ChainStart(self.receipt_tree[1], timestamp_bytes8)
|
timestamp_day_boundary: uint256 = as_unitless_number(block.timestamp) - as_unitless_number(block.timestamp) % SECONDS_PER_DAY + SECONDS_PER_DAY
|
||||||
|
timestamp_day_boundary_bytes8: bytes[8] = slice(concat("", convert(timestamp_day_boundary, bytes32)), start=24, len=8)
|
||||||
|
log.ChainStart(self.receipt_tree[1], timestamp_day_boundary_bytes8)
|
||||||
|
|
||||||
@public
|
@public
|
||||||
@constant
|
@constant
|
||||||
|
@ -778,7 +783,7 @@ def add_validator(state: State,
|
||||||
pubkey=pubkey,
|
pubkey=pubkey,
|
||||||
withdrawal_credentials=withdrawal_credentials,
|
withdrawal_credentials=withdrawal_credentials,
|
||||||
randao_commitment=randao_commitment,
|
randao_commitment=randao_commitment,
|
||||||
randao_last_change=current_slot,
|
randao_skips=0,
|
||||||
balance=DEPOSIT_SIZE * GWEI_PER_ETH,
|
balance=DEPOSIT_SIZE * GWEI_PER_ETH,
|
||||||
status=status,
|
status=status,
|
||||||
last_status_change_slot=current_slot,
|
last_status_change_slot=current_slot,
|
||||||
|
@ -853,7 +858,9 @@ def update_ancestor_hashes(parent_ancestor_hashes: List[Hash32],
|
||||||
|
|
||||||
### Verify attestations
|
### Verify attestations
|
||||||
|
|
||||||
For each `AttestationRecord` object `obj`:
|
Verify that there are at most `MAX_ATTESTATION_COUNT` `AttestationRecord` objects.
|
||||||
|
|
||||||
|
For each `AttestationRecord` object:
|
||||||
|
|
||||||
* Verify that `slot <= block.slot - MIN_ATTESTATION_INCLUSION_DELAY` and `slot >= max(parent.slot - CYCLE_LENGTH + 1, 0)`.
|
* Verify that `slot <= block.slot - MIN_ATTESTATION_INCLUSION_DELAY` and `slot >= max(parent.slot - CYCLE_LENGTH + 1, 0)`.
|
||||||
* Verify that `justified_slot` is equal to `justification_source if slot >= block.slot - (block.slot % CYCLE_LENGTH) else prev_cycle_justification_source`
|
* Verify that `justified_slot` is equal to `justification_source if slot >= block.slot - (block.slot % CYCLE_LENGTH) else prev_cycle_justification_source`
|
||||||
|
@ -877,10 +884,20 @@ Verify that `BLSVerify(pubkey=get_beacon_proposer(state, block.slot).pubkey, dat
|
||||||
|
|
||||||
### Verify and process RANDAO reveal
|
### Verify and process RANDAO reveal
|
||||||
|
|
||||||
|
First run the following state transition to update `randao_skips` variables for the missing slots.
|
||||||
|
|
||||||
|
```python
|
||||||
|
for slot in range(parent.slot + 1, block.slot):
|
||||||
|
proposer = get_beacon_proposer(state, slot)
|
||||||
|
proposer.randao_skips += 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Then:
|
||||||
|
|
||||||
* Let `repeat_hash(x, n) = x if n == 0 else repeat_hash(hash(x), n-1)`.
|
* Let `repeat_hash(x, n) = x if n == 0 else repeat_hash(hash(x), n-1)`.
|
||||||
* Let `proposer = get_beacon_proposer(state, block.slot)`.
|
* Let `proposer = get_beacon_proposer(state, block.slot)`.
|
||||||
* Verify that `repeat_hash(block.randao_reveal, (block.slot - proposer.randao_last_change) // RANDAO_SLOTS_PER_LAYER + 1) == proposer.randao_commitment`.
|
* Verify that `repeat_hash(block.randao_reveal, proposer.randao_skips + 1) == V.randao_commitment`
|
||||||
* Set `state.randao_mix = xor(state.randao_mix, block.randao_reveal)`, `proposer.randao_commitment = block.randao_reveal`, `proposer.randao_last_change = block.slot`.
|
* Set `state.randao_mix = xor(state.randao_mix, block.randao_reveal)`, `proposer.randao_commitment = block.randao_reveal`, `V.randao_skips = 0`
|
||||||
|
|
||||||
### Process PoW receipt root
|
### Process PoW receipt root
|
||||||
|
|
||||||
|
@ -902,7 +919,7 @@ For each `SpecialRecord` `obj` in `block.specials`, verify that its `kind` is on
|
||||||
```
|
```
|
||||||
Perform the following checks:
|
Perform the following checks:
|
||||||
|
|
||||||
* Verify that `BLSVerify(pubkey=validators[data.validator_index].pubkey, msg=hash(LOGOUT_MESSAGE + bytes8(fork_version)), sig=data.signature, domain=get_domain(state, current_slot, DOMAIN_LOGOUT))`
|
* Verify that `BLSVerify(pubkey=validators[data.validator_index].pubkey, msg=bytes([0] * 32), sig=data.signature, domain=get_domain(state, current_slot, DOMAIN_LOGOUT))`
|
||||||
* Verify that `validators[validator_index].status == ACTIVE`.
|
* Verify that `validators[validator_index].status == ACTIVE`.
|
||||||
* Verify that `block.slot >= last_status_change_slot + SHARD_PERSISTENT_COMMITTEE_CHANGE_PERIOD`
|
* Verify that `block.slot >= last_status_change_slot + SHARD_PERSISTENT_COMMITTEE_CHANGE_PERIOD`
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue