Merge branch 'master' into vbuterin-patch-19

This commit is contained in:
Hsiao-Wei Wang 2019-01-03 00:26:31 +08:00
commit b614595fbe
No known key found for this signature in database
GPG Key ID: 95B070122902DEA4
2 changed files with 47 additions and 63 deletions

View File

@ -46,7 +46,6 @@
- [`ValidatorRecord`](#validatorrecord)
- [`CrosslinkRecord`](#crosslinkrecord)
- [`ShardCommittee`](#shardcommittee)
- [`ShardReassignmentRecord`](#shardreassignmentrecord)
- [`CandidatePoWReceiptRootRecord`](#candidatepowreceiptrootrecord)
- [`PendingAttestationRecord`](#pendingattestationrecord)
- [`ForkData`](#forkdata)
@ -100,7 +99,7 @@
- [Attestations](#attestations-1)
- [Deposits](#deposits-1)
- [Exits](#exits-1)
- [Miscellaneous](#miscellaneous)
- [Custody](#custody)
- [Per-epoch processing](#per-epoch-processing)
- [Helpers](#helpers)
- [Receipt roots](#receipt-roots)
@ -112,7 +111,6 @@
- [Crosslinks](#crosslinks-1)
- [Ejections](#ejections)
- [Validator registry](#validator-registry)
- [Proposer reshuffling](#proposer-reshuffling)
- [Final updates](#final-updates)
- [State root processing](#state-root-processing)
- [References](#references)
@ -287,14 +285,14 @@ Unless otherwise indicated, code appearing in `this style` is to be interpreted
```python
{
# Proof-of-custody indices (0 bits)
'aggregate_signature_poc_0_indices': '[uint24]',
# Proof-of-custody indices (1 bits)
'aggregate_signature_poc_1_indices': '[uint24]',
# Validator indices with custody bit equal to 0
'custody_bit_0_indices': ['uint24'],
# Validator indices with custody bit equal to 1
'custody_bit_1_indices': ['uint24'],
# Attestation data
'data': AttestationData,
# Aggregate signature
'aggregate_signature': '[uint384]',
'aggregate_signature': ['uint384'],
}
```
@ -308,7 +306,7 @@ Unless otherwise indicated, code appearing in `this style` is to be interpreted
'data': AttestationData,
# Attester participation bitfield
'participation_bitfield': 'bytes',
# Proof of custody bitfield
# Custody bitfield
'custody_bitfield': 'bytes',
# BLS aggregate signature
'aggregate_signature': ['uint384'],
@ -344,8 +342,8 @@ Unless otherwise indicated, code appearing in `this style` is to be interpreted
{
# Attestation data
data: AttestationData,
# Proof of custody bit
poc_bit: bool,
# Custody bit
custody_bit: bool,
}
```
@ -387,8 +385,8 @@ Unless otherwise indicated, code appearing in `this style` is to be interpreted
'withdrawal_credentials': 'hash32',
# Initial RANDAO commitment
'randao_commitment': 'hash32',
# Initial proof of custody commitment
'poc_commitment': 'hash32',
# Initial custody commitment
'custody_commitment': 'hash32',
# a BLS signature of this ``DepositInput``
'proof_of_possession': ['uint384'],
}
@ -435,15 +433,15 @@ Unless otherwise indicated, code appearing in `this style` is to be interpreted
'proposer_slashings': [ProposerSlashing],
'casper_slashings': [CasperSlashing],
'attestations': [Attestation],
'poc_seed_changes': [ProofOfCustodySeedChange],
'poc_challenges': [ProofOfCustodyChallenge],
'poc_responses': [ProofOfCustodyResponse],
'custody_reseeds': [CustodyReseed],
'custody_challenges': [CustodyChallenge],
'custody_responses': [CustodyResponse],
'deposits': [Deposit],
'exits': [Exit],
}
```
`ProofOfCustodySeedChange`, `ProofOfCustodyChallenge`, and `ProofOfCustodyResponse` will be defined in phase 1; for now, put dummy classes as these lists will remain empty throughout phase 0.
`CustodyReseed`, `CustodyChallenge`, and `CustodyResponse` will be defined in phase 1; for now, put dummy classes as these lists will remain empty throughout phase 0.
#### `ProposalSignedData`
@ -481,10 +479,8 @@ Unless otherwise indicated, code appearing in `this style` is to be interpreted
'latest_vdf_outputs': ['hash32'],
'shard_committees_at_slots': [[ShardCommittee]],
# Proof of custody
# Placeholders for now; ProofOfCustodyChallenge is defined in phase 1, implementers can
# put a dummy class in for now, as the list will remain empty throughout phase 0
'poc_challenges': [ProofOfCustodyChallenge],
# Custody challenges
'custody_challenges': [CustodyChallenge],
# Finality
'previous_justified_slot': 'uint64',
@ -529,11 +525,12 @@ Unless otherwise indicated, code appearing in `this style` is to be interpreted
'exit_count': 'uint64',
# Status flags
'status_flags': 'uint64',
# Proof of custody commitment
'poc_commitment': 'hash32',
# Slot the proof of custody seed was last changed
'last_poc_change_slot': 'uint64',
'second_last_poc_change_slot': 'uint64',
# Custody commitment
'custody_commitment': 'hash32',
# Slot of latest custody reseed
'latest_custody_reseed_slot': 'uint64',
# Slot of second-latest custody reseed
'penultimate_custody_reseed_slot': 'uint64',
}
```
@ -556,24 +553,11 @@ Unless otherwise indicated, code appearing in `this style` is to be interpreted
'shard': 'uint64',
# Validator indices
'committee': ['uint24'],
# Total validator count (for proofs of custody)
# Total validator count (for custody challenges)
'total_validator_count': 'uint64',
}
```
#### `ShardReassignmentRecord`
```python
{
# Which validator to reassign
'validator_index': 'uint24',
# To which shard
'shard': 'uint64',
# When
'slot': 'uint64',
}
```
#### `CandidatePoWReceiptRootRecord`
```python
@ -593,9 +577,9 @@ Unless otherwise indicated, code appearing in `this style` is to be interpreted
'data': AttestationData,
# Attester participation bitfield
'participation_bitfield': 'bytes',
# Proof of custody bitfield
# Custody bitfield
'custody_bitfield': 'bytes',
# Slot in which it was included
# Slot the attestation was included
'slot_included': 'uint64',
}
```
@ -1039,13 +1023,13 @@ def get_domain(fork_data: ForkData,
```python
def verify_slashable_vote_data(state: BeaconState, vote_data: SlashableVoteData) -> bool:
if len(vote_data.aggregate_signature_poc_0_indices) + len(vote_data.aggregate_signature_poc_1_indices) > MAX_CASPER_VOTES:
if len(vote_data.custody_bit_0_indices) + len(vote_data.custody_bit_1_indices) > MAX_CASPER_VOTES:
return False
return bls_verify_multiple(
pubkeys=[
aggregate_pubkey([state.validators[i].pubkey for i in vote_data.aggregate_signature_poc_0_indices]),
aggregate_pubkey([state.validators[i].pubkey for i in vote_data.aggregate_signature_poc_1_indices]),
aggregate_pubkey([state.validators[i].pubkey for i in vote_data.custody_bit_0_indices]),
aggregate_pubkey([state.validators[i].pubkey for i in vote_data.custody_bit_1_indices]),
],
messages=[
hash_tree_root(AttestationDataAndCustodyBit(vote_data, False)),
@ -1141,9 +1125,9 @@ A valid block with slot `GENESIS_SLOT` (a "genesis block") has the following val
proposer_slashings=[],
casper_slashings=[],
attestations=[],
poc_seed_changes=[],
poc_challenges=[],
poc_responses=[],
custody_reseeds=[],
custody_challenges=[],
custody_responses=[],
deposits=[],
exits=[],
),
@ -1178,8 +1162,8 @@ def get_initial_beacon_state(initial_validator_deposits: List[Deposit],
latest_vdf_outputs=[ZERO_HASH for _ in range(LATEST_RANDAO_MIXES_LENGTH // EPOCH_LENGTH)],
shard_committees_at_slots=[],
# Proof of custody
poc_challenges=[],
# Custody challenges
custody_challenges=[],
# Finality
previous_justified_slot=GENESIS_SLOT,
@ -1208,7 +1192,7 @@ def get_initial_beacon_state(initial_validator_deposits: List[Deposit],
proof_of_possession=deposit.deposit_data.deposit_input.proof_of_possession,
withdrawal_credentials=deposit.deposit_data.deposit_input.withdrawal_credentials,
randao_commitment=deposit.deposit_data.deposit_input.randao_commitment,
poc_commitment=deposit.deposit_data.deposit_input.poc_commitment,
custody_commitment=deposit.deposit_data.deposit_input.custody_commitment,
)
# Process initial activations
@ -1233,12 +1217,12 @@ def validate_proof_of_possession(state: BeaconState,
proof_of_possession: bytes,
withdrawal_credentials: Hash32,
randao_commitment: Hash32,
poc_commitment: Hash32) -> bool:
custody_commitment: Hash32) -> bool:
proof_of_possession_data = DepositInput(
pubkey=pubkey,
withdrawal_credentials=withdrawal_credentials,
randao_commitment=randao_commitment,
poc_commitment=poc_commitment,
custody_commitment=custody_commitment,
proof_of_possession=EMPTY_SIGNATURE,
)
@ -1263,7 +1247,7 @@ def process_deposit(state: BeaconState,
proof_of_possession: bytes,
withdrawal_credentials: Hash32,
randao_commitment: Hash32,
poc_commitment: Hash32) -> None:
custody_commitment: Hash32) -> None:
"""
Process a deposit from Ethereum 1.0.
Note that this function mutates ``state``.
@ -1275,7 +1259,7 @@ def process_deposit(state: BeaconState,
proof_of_possession,
withdrawal_credentials,
randao_commitment,
poc_commitment,
custody_commitment,
)
validator_pubkeys = [v.pubkey for v in state.validator_registry]
@ -1293,9 +1277,9 @@ def process_deposit(state: BeaconState,
penalized_slot=FAR_FUTURE_SLOT,
exit_count=0,
status_flags=0,
poc_commitment=poc_commitment,
last_poc_change_slot=GENESIS_SLOT,
second_last_poc_change_slot=GENESIS_SLOT,
custody_commitment=custody_commitment,
latest_custody_reseed_slot=GENESIS_SLOT,
penultimate_custody_reseed_slot=GENESIS_SLOT,
)
# Note: In phase 2 registry indices that has been withdrawn for a long time will be recycled.
@ -1447,7 +1431,7 @@ For each `casper_slashing` in `block.body.casper_slashings`:
* Let `slashable_vote_data_1 = casper_slashing.slashable_vote_data_1`.
* Let `slashable_vote_data_2 = casper_slashing.slashable_vote_data_2`.
* Let `indices(slashable_vote_data) = slashable_vote_data.aggregate_signature_poc_0_indices + slashable_vote_data.aggregate_signature_poc_1_indices`.
* Let `indices(slashable_vote_data) = slashable_vote_data.custody_bit_0_indices + slashable_vote_data.custody_bit_1_indices`.
* Let `intersection = [x for x in indices(slashable_vote_data_1) if x in indices(slashable_vote_data_2)]`.
* Verify that `len(intersection) >= 1`.
* Verify that `slashable_vote_data_1.data != slashable_vote_data_2.data`.
@ -1506,7 +1490,7 @@ process_deposit(
proof_of_possession=deposit.deposit_data.deposit_input.proof_of_possession,
withdrawal_credentials=deposit.deposit_data.deposit_input.withdrawal_credentials,
randao_commitment=deposit.deposit_data.deposit_input.randao_commitment,
poc_commitment=deposit.deposit_data.deposit_input.poc_commitment,
custody_commitment=deposit.deposit_data.deposit_input.custody_commitment,
)
```
@ -1522,9 +1506,9 @@ For each `exit` in `block.body.exits`:
* Verify that `bls_verify(pubkey=validator.pubkey, message=ZERO_HASH, signature=exit.signature, domain=get_domain(state.fork_data, exit.slot, DOMAIN_EXIT))`.
* Run `initiate_validator_exit(state, exit.validator_index)`.
#### Miscellaneous
#### Custody
[TO BE REMOVED IN PHASE 1] Verify that `len(block.body.poc_seed_changes) == len(block.body.poc_challenges) == len(block.body.poc_responses) == 0`.
[TO BE REMOVED IN PHASE 1] Verify that `len(block.body.custody_reseeds) == len(block.body.custody_challenges) == len(block.body.custody_responses) == 0`.
## Per-epoch processing

View File

@ -449,7 +449,7 @@ Where the inner `hash_tree_root` is a recursive application of the tree-hashing
Recursively tree hash the values in the container in the same order as the fields, and return the hash of the concatenation of the results.
```python
return hash(b''.join([hash_tree_root(getattr(x, field)) for field in value.fields))
return hash(b''.join([hash_tree_root(getattr(x, field)) for field in value.fields]))
```