mirror of
https://github.com/status-im/nimbus-eth2.git
synced 2025-01-09 22:06:21 +00:00
46b4154ce8
* begin 0.6.0: new get_domain/increase_balance/reduce_balance, BeaconState.validator_balances -> BeaconState.balances, some renamed constants, transaction processing changes, SlashableAttestation field name changes, 0.6.0 get_beacon_proposer_index always uses given state's slot, update tests subrepo * mark get_bitfield_bit/bls_verify_multiple/stat-list-lengths/is_active_validator/is_surround_vote/slot_to_epoch/int_to_bytes/etc as unchanged in 0.6.0; rm Eth1DataVote/maybe_reset_eth1_period and thus adjust expected tree hash test results * mark verify_bitfield/bls_verify/deposit-contract/VoluntaryExit/PendingAttestation/Historicalbatch/Fork as 0.6.0; update DOMAIN_BEACON_BLOCK to DOMAIN_BEACON_PROPOSER * update Crosslink to 0.6.0 (also requires tree hashing test result change, so isolate in individual commit) * mark verify_merkle_branch/get_delayed_activation_exit_epoch/ProposerSlashing/Attestation/AttestationDataAndCustodyBit/hash/integer_squareroot/get_epoch_start_slot/is_double_vote/get_randao_mix/generate_seed as 0.6.0; update reward and penalty quotients; SlashableAttestation -> IndexedAttestation; rm get_fork_version; ATTESTATION_INCLUSION_REWARD_QUOTIENT -> PROPOSER_REWARD_QUOTIENT
68 lines
2.4 KiB
Nim
68 lines
2.4 KiB
Nim
import
|
|
tables,
|
|
chronos, chronicles,
|
|
spec/[datatypes, crypto, digest, helpers], ssz,
|
|
beacon_node_types
|
|
|
|
|
|
proc init*(T: type ValidatorPool): T =
|
|
result.validators = initTable[ValidatorPubKey, AttachedValidator]()
|
|
|
|
template count*(pool: ValidatorPool): int =
|
|
pool.validators.len
|
|
|
|
proc addLocalValidator*(pool: var ValidatorPool,
|
|
pubKey: ValidatorPubKey,
|
|
privKey: ValidatorPrivKey) =
|
|
let v = AttachedValidator(pubKey: pubKey,
|
|
kind: inProcess,
|
|
privKey: privKey)
|
|
pool.validators[pubKey] = v
|
|
|
|
info "Local validator attached", pubKey, validator = shortLog(v)
|
|
|
|
proc getValidator*(pool: ValidatorPool,
|
|
validatorKey: ValidatorPubKey): AttachedValidator =
|
|
pool.validators.getOrDefault(validatorKey)
|
|
|
|
proc signBlockProposal*(v: AttachedValidator, state: BeaconState, slot: Slot,
|
|
blockRoot: Eth2Digest): Future[ValidatorSig] {.async.} =
|
|
if v.kind == inProcess:
|
|
await sleepAsync(chronos.milliseconds(1))
|
|
result = bls_sign(v.privKey, blockRoot.data,
|
|
get_domain(state, DOMAIN_BEACON_PROPOSER, slot_to_epoch(slot)))
|
|
else:
|
|
# TODO:
|
|
# send RPC
|
|
discard
|
|
|
|
proc signAttestation*(v: AttachedValidator,
|
|
attestation: AttestationData): Future[ValidatorSig] {.async.} =
|
|
# TODO: implement this
|
|
if v.kind == inProcess:
|
|
await sleepAsync(chronos.milliseconds(1))
|
|
|
|
let attestationRoot = hash_tree_root(attestation)
|
|
# TODO: Avoid the allocations belows
|
|
var dataToSign = @(attestationRoot.data) & @[0'u8]
|
|
# TODO: Use `domain` here
|
|
let domain = 0'u64
|
|
result = bls_sign(v.privKey, dataToSign, domain)
|
|
else:
|
|
# TODO:
|
|
# send RPC
|
|
discard
|
|
|
|
func genRandaoReveal*(k: ValidatorPrivKey, state: BeaconState, slot: Slot):
|
|
ValidatorSig =
|
|
# https://github.com/ethereum/eth2.0-specs/blob/v0.2.0/specs/core/0_beacon-chain.md#randao
|
|
|
|
# Off-by-one? I often get slot == state.slot but the check was "doAssert slot > state.slot" (Mamy)
|
|
doAssert slot >= state.slot, "input slot: " & $humaneSlotNum(slot) & " - beacon state slot: " & $humaneSlotNum(state.slot)
|
|
bls_sign(k, hash_tree_root(slot_to_epoch(slot).uint64).data,
|
|
get_domain(state, DOMAIN_RANDAO, slot_to_epoch(slot)))
|
|
|
|
func genRandaoReveal*(v: AttachedValidator, state: BeaconState, slot: Slot):
|
|
ValidatorSig =
|
|
genRandaoReveal(v.privKey, state, slot)
|