nimbus-eth2/beacon_chain/validator_pool.nim

81 lines
2.3 KiB
Nim
Raw Normal View History

import
tables, random,
2018-12-12 13:57:23 +00:00
asyncdispatch2, milagro_crypto,
spec/[datatypes, crypto, digest], randao, ssz
type
ValidatorKind = enum
inProcess
remote
ValidatorConnection = object
AttachedValidator* = ref object
2018-12-08 14:17:47 +00:00
idx*: int # index in the registry
case kind: ValidatorKind
of inProcess:
2018-11-29 01:08:34 +00:00
privKey: ValidatorPrivKey
2018-12-08 14:17:47 +00:00
randaoSecret: Randao
else:
connection: ValidatorConnection
ValidatorPool* = object
2018-11-29 01:08:34 +00:00
validators: Table[ValidatorPubKey, AttachedValidator]
proc init*(T: type ValidatorPool): T =
2018-11-29 01:08:34 +00:00
result.validators = initTable[ValidatorPubKey, AttachedValidator]()
template count*(pool: ValidatorPool): int =
pool.validators.len
proc addLocalValidator*(pool: var ValidatorPool,
2018-11-29 01:08:34 +00:00
idx: int,
pubKey: ValidatorPubKey,
privKey: ValidatorPrivKey,
2018-12-08 14:17:47 +00:00
randaoSecret: Randao) =
let v = AttachedValidator(idx: idx,
kind: inProcess,
privKey: privKey,
randaoSecret: randaoSecret)
pool.validators[pubKey] = v
2018-11-26 13:33:06 +00:00
proc getValidator*(pool: ValidatorPool,
2018-11-29 01:08:34 +00:00
validatorKey: ValidatorPubKey): AttachedValidator =
pool.validators.getOrDefault(validatorKey)
proc signBlockProposal*(v: AttachedValidator,
2018-11-29 01:08:34 +00:00
proposal: ProposalSignedData): Future[ValidatorSig] {.async.} =
if v.kind == inProcess:
await sleepAsync(1)
let proposalRoot = hash_tree_root_final(proposal)
2018-12-12 13:57:23 +00:00
# TODO: Should we use proposalRoot as data, or digest in regards to signature?
return signMessage(v.privKey, proposalRoot.data)
else:
# TODO:
# send RPC
discard
proc signAttestation*(v: AttachedValidator,
attestation: AttestationData): Future[ValidatorSig] {.async.} =
# TODO: implement this
2018-11-29 01:08:34 +00:00
if v.kind == inProcess:
await sleepAsync(1)
2018-12-12 13:57:23 +00:00
let attestationRoot = hash_tree_root_final(attestation)
2018-12-12 13:57:23 +00:00
# TODO: Should we use attestationRoot as data, or digest in regards to signature?
return signMessage(v.privKey, attestationRoot.data)
else:
# TODO:
# send RPC
discard
2018-12-08 14:17:47 +00:00
proc randaoReveal*(v: AttachedValidator, commitment: Eth2Digest): Future[Eth2Digest] {.async.} =
if v.kind == inProcess:
result = v.randaoSecret.reveal(commitment)
else:
# TODO:
# send RPC
discard