Merge pull request #35 from ethereum/vitalik3

Added versioning
This commit is contained in:
Danny Ryan 2018-10-04 19:02:01 -05:00 committed by GitHub
commit 0304e5f337
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -119,6 +119,20 @@ An `AttestationRecord` has the following fields:
}
```
Here's the data signed (`AttestationSignedData`):
```python
fields = {
# Version of the chain
'version': 'int64',
'slot': 'int64',
'parent_hashes': ['hash32'],
'shard_id': 'int16',
'shard_block_hash': 'hash32',
'justified_slot': 'int64'
}
```
A `SpecialRecord` has the following fields:
```python
@ -179,6 +193,11 @@ The `CrystallizedState` has the following fields:
'deposits_penalized_in_period': ['int32'],
# Hash chain of validator set changes (for light clients to easily track deltas)
'validator_set_delta_hash_chain': 'hash32'
# Parameters relevant to hard forks / versioning.
# Should be updated only by hard forks.
'pre_fork_version': 'int32',
'post_fork_version': 'int32',
'fork_slot_number': 'int64',
}
```
@ -471,7 +490,8 @@ For each one of these attestations:
* Let `attestation_indices` be `get_shards_and_committees_for_slot(crystallized_state, slot)[x]`, choosing `x` so that `attestation_indices.shard` equals the `shard` value provided to find the set of validators that is creating this attestation record.
* Verify that `len(attester_bitfield) == ceil_div8(len(attestation_indices))`, where `ceil_div8 = (x + 7) // 8`. Verify that bits `len(attestation_indices)....` and higher, if present (i.e. `len(attestation_indices)` is not a multiple of 8), are all zero
* Derive a group public key by adding the public keys of all of the attesters in `attestation_indices` for whom the corresponding bit in `attester_bitfield` (the ith bit is `(attester_bitfield[i // 8] >> (7 - (i %8))) % 2`) equals 1
* Verify that `aggregate_sig` verifies using the group pubkey generated and `hash(slot.to_bytes(8, 'big') + parent_hashes + shard + shard_block_hash + justified_slot.to_bytes(8, 'big'))` as the message.
* Let `version = pre_fork_version if slot < fork_slot_number else post_fork_version`.
* Verify that `aggregate_sig` verifies using the group pubkey generated and the serialized form of `AttestationSignedData(version, slot, parent_hashes, shard_id, shard_block_hash, justified_slot)` as the message.
Extend the list of `AttestationRecord` objects in the `active_state` with those included in the block, ordering the new additions in the same order as they came in the block. Similarly extend the list of `SpecialRecord` objects in the `active_state` with those included in the block.