Merge pull request #104 from status-im/oug

Spec updates for 0.2.0
This commit is contained in:
Dustin Brody 2019-02-11 15:48:00 +00:00 committed by GitHub
commit 433e2f78c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 137 additions and 81 deletions

View File

@ -171,7 +171,7 @@ proc makeAttestation(node: BeaconNode,
beacon_block_root: node.headBlockRoot,
epoch_boundary_root: Eth2Digest(), # TODO
shard_block_root: Eth2Digest(), # TODO
latest_crosslink_root: Eth2Digest(), # TODO
latest_crosslink: Crosslink(), # TODO
justified_epoch: node.beaconState.justified_epoch,
justified_block_root: justifiedBlockRoot)

View File

@ -315,25 +315,26 @@ func update_validator_registry*(state: var BeaconState) =
process_penalties_and_exits(state)
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#get_epoch_start_slot
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#get_epoch_start_slot
func get_epoch_start_slot*(epoch: EpochNumber): SlotNumber =
# Return the starting slot of the given ``epoch``.
epoch * EPOCH_LENGTH
## https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#attestations-1
proc checkAttestation*(
state: BeaconState, attestation: Attestation, flags: UpdateFlags): bool =
## Check that an attestation follows the rules of being included in the state
## at the current slot. When acting as a proposer, the same rules need to
## be followed!
##
## https://github.com/ethereum/eth2.0-specs/blob/master/specs/core/0_beacon-chain.md#attestations-1
if not (attestation.data.slot + MIN_ATTESTATION_INCLUSION_DELAY <= state.slot):
# Can't underflow, because GENESIS_SLOT > MIN_ATTESTATION_INCLUSION_DELAY
if not (attestation.data.slot <= state.slot - MIN_ATTESTATION_INCLUSION_DELAY):
warn("Attestation too new",
attestation_slot = attestation.data.slot, state_slot = state.slot)
return
if not (attestation.data.slot + EPOCH_LENGTH >= state.slot):
if not (state.slot - MIN_ATTESTATION_INCLUSION_DELAY <
attestation.data.slot + EPOCH_LENGTH):
warn("Attestation too old",
attestation_slot = attestation.data.slot, state_slot = state.slot)
return
@ -358,28 +359,62 @@ proc checkAttestation*(
expected_justified_block_root)
return
if not (state.latest_crosslinks[attestation.data.shard].shard_block_root in [
attestation.data.latest_crosslink_root,
attestation.data.shard_block_root]):
warn("Unexpected crosslink shard_block_root")
if not (state.latest_crosslinks[attestation.data.shard] in [
attestation.data.latest_crosslink,
Crosslink(
shard_block_root: attestation.data.shard_block_root,
epoch: slot_to_epoch(attestation.data.slot))]):
warn("Unexpected crosslink shard")
return
assert allIt(attestation.custody_bitfield, it == 0) #TO BE REMOVED IN PHASE 1
assert anyIt(attestation.aggregation_bitfield, it != 0)
let crosslink_committee = mapIt(
filterIt(get_crosslink_committees_at_slot(state, attestation.data.slot),
it.shard == attestation.data.shard),
it.committee)[0]
assert allIt(0 ..< len(crosslink_committee),
if get_bitfield_bit(attestation.aggregation_bitfield, it) == 0b0:
# Should always be true in phase 0, because of above assertion
get_bitfield_bit(attestation.custody_bitfield, it) == 0b0
else:
true)
let
participants = get_attestation_participants(
state, attestation.data, attestation.aggregation_bitfield)
## TODO when the custody_bitfield assertion-to-emptiness disappears do this
## and fix the custody_bit_0_participants check to depend on it.
# custody_bit_1_participants = {nothing, always, because assertion above}
custody_bit_1_participants: seq[ValidatorIndex] = @[]
custody_bit_0_participants = participants
group_public_key = bls_aggregate_pubkeys(
participants.mapIt(state.validator_registry[it].pubkey))
## the rest; turns into expensive NOP until then.
if skipValidation notin flags:
# Verify that aggregate_signature verifies using the group pubkey.
let msg = hash_tree_root_final(attestation.data)
if not bls_verify(
group_public_key, @(msg.data) & @[0'u8], attestation.aggregate_signature,
0, # TODO: get_domain(state.fork, attestation.data.slot, DOMAIN_ATTESTATION)
):
warn("Invalid attestation group signature")
return
assert bls_verify_multiple(
@[
bls_aggregate_pubkeys(mapIt(custody_bit_0_participants,
state.validator_registry[it].pubkey)),
bls_aggregate_pubkeys(mapIt(custody_bit_1_participants,
state.validator_registry[it].pubkey)),
],
@[
hash_tree_root(AttestationDataAndCustodyBit(
data: attestation.data, custody_bit: false)),
hash_tree_root(AttestationDataAndCustodyBit(
data: attestation.data, custody_bit: true)),
],
attestation.aggregate_signature,
get_domain(state.fork, slot_to_epoch(attestation.data.slot),
DOMAIN_ATTESTATION),
)
# To be removed in Phase1:
if attestation.data.shard_block_root != ZERO_HASH:

View File

@ -41,6 +41,7 @@ import
# to run.. well.. a chain with different constants!
const
# Misc
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#misc
SHARD_COUNT* = 1024 ##\
## Number of shards supported by the network - validators will jump around
## between these shards and provide attestations to their state.
@ -56,10 +57,6 @@ const
## with a Verifiable Delay Function (VDF) will improve committee robustness
## and lower the safe minimum committee size.)
EJECTION_BALANCE* = 2'u64^4 * 10'u64^9 ##\
## Once the balance of a validator drops below this, it will be ejected from
## the validator pool
MAX_BALANCE_CHURN_QUOTIENT* = 2^5 ##\
## At most `1/MAX_BALANCE_CHURN_QUOTIENT` of the validators can change during
## each validator registry change.
@ -71,16 +68,26 @@ const
MAX_WITHDRAWALS_PER_EPOCH* = 4 # withdrawals
SHUFFLE_ROUND_COUNT* = 90
# Deposit contract
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#deposit-contract
DEPOSIT_CONTRACT_TREE_DEPTH* = 2^5
# Gwei values
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#gwei-values
MIN_DEPOSIT_AMOUNT* = 2'u64^0 * 10'u64^9 ##\
## Minimum amounth of ETH that can be deposited in one call - deposits can
## be used either to top up an existing validator or commit to a new one
MAX_DEPOSIT_AMOUNT* = 2'u64^5 * 10'u64^9 ##\
## Maximum amounth of ETH that can be deposited in one call
FORK_CHOICE_BALANCE_INCREMENT* = 2'u64^0 * 10'u64^9
EJECTION_BALANCE* = 2'u64^4 * 10'u64^9 ##\
## Once the balance of a validator drops below this, it will be ejected from
## the validator pool
# Time parameter, here so that GENESIS_EPOCH can access it
EPOCH_LENGTH* = 64 ##\
## (~6.4 minutes)
@ -88,7 +95,7 @@ const
## processing is done
# Initial values
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#initial-values
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#initial-values
GENESIS_FORK_VERSION* = 0'u64
GENESIS_SLOT* = 2'u64^63
GENESIS_EPOCH* = GENESIS_SLOT div EPOCH_LENGTH # slot_to_epoch(GENESIS_SLOT)
@ -99,7 +106,7 @@ const
BLS_WITHDRAWAL_PREFIX_BYTE* = 0'u8
# Time parameters
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#time-parameters
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#time-parameters
SLOT_DURATION* = 6'u64 ## \
## TODO consistent time unit across projects, similar to C++ chrono?
@ -128,14 +135,14 @@ const
## epochs (~27 hours)
# State list lengths
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#state-list-lengths
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#state-list-lengths
LATEST_BLOCK_ROOTS_LENGTH* = 2'u64^13
LATEST_RANDAO_MIXES_LENGTH* = 2'u64^13
LATEST_INDEX_ROOTS_LENGTH* = 2'u64^13
LATEST_PENALIZED_EXIT_LENGTH* = 8192 # epochs
# Reward and penalty quotients
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#reward-and-penalty-quotients
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#reward-and-penalty-quotients
BASE_REWARD_QUOTIENT* = 2'u64^5 ##\
## The `BASE_REWARD_QUOTIENT` parameter dictates the per-epoch reward. It
## corresponds to ~2.54% annual interest assuming 10 million participating
@ -145,13 +152,12 @@ const
INACTIVITY_PENALTY_QUOTIENT* = 2'u64^24
# Status flags
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#status-flags
# Could model this with enum, but following spec closely here
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#status-flags
INITIATED_EXIT* = 1'u64
WITHDRAWABLE* = 2'u64
# Max operations per block
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#max-operations-per-block
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#max-operations-per-block
MAX_PROPOSER_SLASHINGS* = 2^4
MAX_ATTESTER_SLASHINGS* = 2^0
MAX_ATTESTATIONS* = 2^7
@ -165,20 +171,20 @@ type
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#proposerslashing
ProposerSlashing* = object
proposer_index*: ValidatorIndex
proposer_index*: uint64
proposal_data_1*: ProposalSignedData
proposal_signature_1*: ValidatorSig
proposal_data_2*: ProposalSignedData
proposal_signature_2*: ValidatorSig
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#attesterslashing
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#attesterslashing
AttesterSlashing* = object
slashable_attestation_1*: SlashableAttestation ## \
## First batch of votes
slashable_attestation_2*: SlashableAttestation ## \
## Second batch of votes
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#slashableattestation
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#slashableattestation
SlashableAttestation* = object
validator_indices*: seq[uint64] ##\
## Validator indices
@ -204,34 +210,38 @@ type
aggregate_signature*: ValidatorSig ##\
## Aggregate signature of the validators in `custody_bitfield`
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#attestationdata
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#attestation
AttestationData* = object
slot*: uint64
shard*: uint64
slot*: uint64 ##\
## Slot number
shard*: uint64 ##\
## Shard number
beacon_block_root*: Eth2Digest ##\
## Hash of the block we're signing
## Hash of root of the signed beacon block
epoch_boundary_root*: Eth2Digest ##\
## Hash of the ancestor at the cycle boundary
## Hash of root of the ancestor at the epoch boundary
shard_block_root*: Eth2Digest ##\
## Shard block hash being attested to
## Shard block's hash of root
latest_crosslink_root*: Eth2Digest ##\
## Last crosslink hash
latest_crosslink*: Crosslink ##\
## Last crosslink
justified_epoch*: uint64 ##\
## Epoch of last justified beacon block
## Last justified epoch in the beacon state
justified_block_root*: Eth2Digest ##\
## Hash of last justified beacon block
## Hash of the last justified beacon block
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#attestationdata
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#attestationdataandcustodybit
AttestationDataAndCustodyBit* = object
data*: AttestationData
custody_bit*: bool
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#deposit
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#deposit
Deposit* = object
branch*: seq[Eth2Digest] ##\
## Branch in the deposit tree
@ -242,29 +252,29 @@ type
deposit_data*: DepositData ##\
## Data
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#depositdata
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#depositdata
DepositData* = object
amount*: uint64 ## Value in Gwei
timestamp*: uint64 # Timestamp from deposit contract
deposit_input*: DepositInput
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#depositinput
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#depositinput
DepositInput* = object
pubkey*: ValidatorPubKey
withdrawal_credentials*: Eth2Digest
proof_of_possession*: ValidatorSig ##\
## BLS proof of possession (a BLS signature)
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#exit
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#exit
Exit* = object
# Minimum epoch for processing exit
epoch*: uint64
# Index of the exiting validator
validator_index*: ValidatorIndex
validator_index*: uint64
# Validator signature
signature*: ValidatorSig
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#beaconblock
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#beaconblock
BeaconBlock* = object
## For each slot, a proposer is chosen from the validator pool to propose
## a new block. Once the block as been proposed, it is transmitted to
@ -289,7 +299,7 @@ type
body*: BeaconBlockBody
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#beaconblockbody
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#beaconblockbody
BeaconBlockBody* = object
proposer_slashings*: seq[ProposerSlashing]
attester_slashings*: seq[AttesterSlashing]
@ -297,14 +307,14 @@ type
deposits*: seq[Deposit]
exits*: seq[Exit]
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#proposalsigneddata
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#proposalsigneddata
ProposalSignedData* = object
slot*: uint64
shard*: uint64 ##\
## Shard number (or `BEACON_CHAIN_SHARD_NUMBER` for beacon chain)
block_root*: Eth2Digest
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#beaconstate
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#beaconstate
BeaconState* = object
slot*: uint64
genesis_time*: uint64
@ -318,7 +328,7 @@ type
validator_registry_update_epoch*: uint64
# TODO remove, not in spec anymore
# TODO remove or conditionally compile; not in spec anymore
validator_registry_delta_chain_tip*: Eth2Digest ##\
## For light clients to easily track delta
@ -326,16 +336,16 @@ type
latest_randao_mixes*: array[LATEST_BLOCK_ROOTS_LENGTH.int, Eth2Digest]
previous_epoch_start_shard*: uint64
current_epoch_start_shard*: uint64
previous_calculation_epoch*: EpochNumber
current_calculation_epoch*: EpochNumber
previous_calculation_epoch*: uint64
current_calculation_epoch*: uint64
previous_epoch_seed*: Eth2Digest
current_epoch_seed*: Eth2Digest
# Finality
previous_justified_epoch*: EpochNumber
justified_epoch*: EpochNumber
previous_justified_epoch*: uint64
justified_epoch*: uint64
justification_bitfield*: uint64
finalized_epoch*: EpochNumber
finalized_epoch*: uint64
# Recent state
latest_crosslinks*: array[SHARD_COUNT, Crosslink]
@ -349,10 +359,11 @@ type
latest_attestations*: seq[PendingAttestation]
batched_block_roots*: seq[Eth2Digest]
# Ethereum 1.0 chain data
latest_eth1_data*: Eth1Data
eth1_data_votes*: seq[Eth1DataVote]
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#validator
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#validator
Validator* = object
pubkey*: ValidatorPubKey ##\
## BLS public key
@ -360,40 +371,40 @@ type
withdrawal_credentials*: Eth2Digest ##\
## Withdrawal credentials
activation_epoch*: EpochNumber ##\
activation_epoch*: uint64 ##\
## Epoch when validator activated
exit_epoch*: EpochNumber ##\
exit_epoch*: uint64 ##\
## Epoch when validator exited
withdrawal_epoch*: EpochNumber ##\
withdrawal_epoch*: uint64 ##\
## Epoch when validator withdrew
penalized_epoch*: EpochNumber ##\
penalized_epoch*: uint64 ##\
## Epoch when validator penalized
status_flags*: uint64
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#crosslink
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#crosslink
Crosslink* = object
epoch*: uint64
shard_block_root*: Eth2Digest ##\
## Shard chain block root
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#pendingattestation
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#pendingattestation
PendingAttestation* = object
aggregation_bitfield*: seq[byte] # Attester participation bitfield
data*: AttestationData # Attestation data
custody_bitfield*: seq[byte] # Custody bitfield
inclusion_slot*: uint64 # Inclusion slot
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#fork
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#fork
Fork* = object
previous_version*: uint64 # Previous fork version
current_version*: uint64 # Current fork version
epoch*: uint64 # Fork epoch number
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#eth1data
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#eth1data
Eth1Data* = object
deposit_root*: Eth2Digest ##\
## Data being voted for
@ -401,7 +412,7 @@ type
block_hash*: Eth2Digest ##\
## Block hash
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#eth1datavote
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#eth1datavote
Eth1DataVote* = object
eth1_data*: Eth1Data
vote_count*: uint64 # Vote count
@ -421,7 +432,7 @@ type
Activation = 0
Exit = 1
# https://github.com/ethereum/eth2.0-specs/blob/dev/specs/core/0_beacon-chain.md#signature-domains
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#signature-domains
SignatureDomain* {.pure.} = enum
DOMAIN_DEPOSIT = 0
DOMAIN_ATTESTATION = 1

View File

@ -155,7 +155,7 @@ func merkle_root*(values: openArray[Eth2Digest]): Eth2Digest =
#TODO
discard
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#slot_to_epoch
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#slot_to_epoch
func slot_to_epoch*(slot: SlotNumber): EpochNumber =
slot div EPOCH_LENGTH
@ -181,12 +181,12 @@ func is_surround_vote*(attestation_data_1: AttestationData,
source_epoch_1 < source_epoch_2 and target_epoch_2 < target_epoch_1
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#is_active_validator
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#is_active_validator
func is_active_validator*(validator: Validator, epoch: EpochNumber): bool =
### Checks if validator is active
validator.activation_epoch <= epoch and epoch < validator.exit_epoch
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#get_active_validator_indices
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#get_active_validator_indices
func get_active_validator_indices*(validators: openArray[Validator], epoch: EpochNumber): seq[ValidatorIndex] =
## Gets indices of active validators from validators
for idx, val in validators:
@ -206,8 +206,9 @@ func get_current_epoch_committee_count*(state: BeaconState): uint64 =
)
return get_epoch_committee_count(len(current_active_validators))
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#get_current_epoch
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#get_current_epoch
func get_current_epoch*(state: BeaconState): EpochNumber =
# Return the current epoch of the given ``state``.
slot_to_epoch(state.slot)
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#get_randao_mix

View File

@ -76,6 +76,16 @@ func get_next_epoch_committee_count(state: BeaconState): uint64 =
)
get_epoch_committee_count(len(next_active_validators))
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#get_previous_epoch
func get_previous_epoch(state: BeaconState): EpochNumber =
## Return the previous epoch of the given ``state``.
## If the current epoch is ``GENESIS_EPOCH``, return ``GENESIS_EPOCH``.
let current_epoch = get_current_epoch(state)
if current_epoch == GENESIS_EPOCH:
GENESIS_EPOCH
else:
current_epoch - 1
# https://github.com/ethereum/eth2.0-specs/blob/v0.1/specs/core/0_beacon-chain.md#get_crosslink_committees_at_slot
func get_crosslink_committees_at_slot*(state: BeaconState, slot: uint64,
registry_change: bool = false):
@ -88,7 +98,7 @@ func get_crosslink_committees_at_slot*(state: BeaconState, slot: uint64,
let
epoch = slot_to_epoch(slot)
current_epoch = get_current_epoch(state)
previous_epoch = if current_epoch > GENESIS_EPOCH: (current_epoch - 1) else: current_epoch
previous_epoch = get_previous_epoch(state)
next_epoch = current_epoch + 1
assert previous_epoch <= epoch, "Previous epoch: " & $previous_epoch & ", epoch: " & $epoch & ", Next epoch: " & $next_epoch

View File

@ -140,7 +140,7 @@ proc processProposerSlashings(
return false
for proposer_slashing in blck.body.proposer_slashings:
let proposer = state.validator_registry[proposer_slashing.proposer_index]
let proposer = state.validator_registry[proposer_slashing.proposer_index.int]
if skipValidation notin flags:
if not bls_verify(
proposer.pubkey,
@ -180,7 +180,7 @@ proc processProposerSlashings(
notice "PropSlash: penalized slot"
return false
penalizeValidator(state, proposer_slashing.proposer_index)
penalizeValidator(state, proposer_slashing.proposer_index.ValidatorIndex)
return true
@ -324,7 +324,7 @@ proc processExits(
return false
for exit in blck.body.exits:
let validator = state.validator_registry[exit.validator_index]
let validator = state.validator_registry[exit.validator_index.int]
if skipValidation notin flags:
if not bls_verify(
@ -341,7 +341,7 @@ proc processExits(
notice "Exit: bad epoch"
return false
initiate_validator_exit(state, exit.validator_index)
initiate_validator_exit(state, exit.validator_index.int)
return true

View File

@ -96,7 +96,6 @@ suite "Block processing":
crosslink_committees = get_crosslink_committees_at_slot(state, state.slot)
attestation = makeAttestation(
state, previous_block_root,
#state.shard_committees_at_slots[state.slot][0].committee[0])
crosslink_committees[0].committee[0])
# Some time needs to pass before attestations are included - this is

View File

@ -174,8 +174,8 @@ proc makeAttestation*(
shard: sac.shard,
beacon_block_root: beacon_block_root,
epoch_boundary_root: Eth2Digest(), # TODO
latest_crosslink: Crosslink(), # TODO
shard_block_root: Eth2Digest(), # TODO
latest_crosslink_root: Eth2Digest(), # TODO
justified_epoch: state.justified_epoch,
justified_block_root: get_block_root(state, get_epoch_start_slot(state.justified_epoch)),
)