Skip to content

Commit

Permalink
Cache and resend, rather than recreate, builder API registrations
Browse files Browse the repository at this point in the history
  • Loading branch information
tersec committed Aug 29, 2022
1 parent 613f4a9 commit 1fc8c96
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 16 deletions.
21 changes: 12 additions & 9 deletions beacon_chain/validators/validator_duties.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1303,10 +1303,9 @@ proc registerValidators(node: BeaconNode, epoch: Epoch) {.async.} =
builderStatus = restBuilderStatus
return

# TODO cache the generated registrations and keep resending the previous ones
# https://github.com/ethereum/builder-specs/blob/v0.2.0/specs/validator.md#validator-registration
var validatorRegistrations: seq[SignedValidatorRegistrationV1]
for validator in node.attachedValidators[].validators.values:
for validator in node.attachedValidators[].validators.mvalues:
if validator.index.isNone:
continue

Expand All @@ -1321,14 +1320,18 @@ proc registerValidators(node: BeaconNode, epoch: Epoch) {.async.} =
state.data.validators.item(validator.index.get).exit_epoch:
continue

let validatorRegistration =
await node.getValidatorRegistration(validator, epoch)
if validatorRegistration.isErr:
error "registerValidators: validatorRegistration failed",
validatorRegistration
continue
if validator.externalBuilderRegistration.isNone:
let validatorRegistration =
await node.getValidatorRegistration(validator, epoch)
if validatorRegistration.isErr:
error "registerValidators: validatorRegistration failed",
validatorRegistration
continue
validator.externalBuilderRegistration =
Opt.some validatorRegistration.get

validatorRegistrations.add validatorRegistration.get
if validator.externalBuilderRegistration.isSome:
validatorRegistrations.add validator.externalBuilderRegistration.get

let registerValidatorResult =
awaitWithTimeout(node.payloadBuilderRestClient.registerValidator(validatorRegistrations),
Expand Down
22 changes: 15 additions & 7 deletions beacon_chain/validators/validator_pool.nim
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,11 @@ type

# Cache the latest slot signature - the slot signature is used to determine
# if the validator will be aggregating (in the near future)
slotSignature*: Option[tuple[slot: Slot, signature: ValidatorSig]]
slotSignature*: Opt[tuple[slot: Slot, signature: ValidatorSig]]

# For the external payload builder; each epoch, the external payload
# builder should be informed of current validators
externalBuilderRegistration*: Opt[SignedValidatorRegistrationV1]

startSlot*: Slot

Expand Down Expand Up @@ -93,8 +97,10 @@ proc addLocalValidator*(pool: var ValidatorPool, item: KeystoreData,
index: Opt[ValidatorIndex], slot: Slot) =
doAssert item.kind == KeystoreKind.Local
let pubkey = item.pubkey
let v = AttachedValidator(kind: ValidatorKind.Local, pubkey: pubkey,
index: index, data: item, startSlot: slot)
let v = AttachedValidator(
kind: ValidatorKind.Local, pubkey: pubkey, index: index, data: item,
externalBuilderRegistration: Opt.none SignedValidatorRegistrationV1,
startSlot: slot)
pool.validators[pubkey] = v
notice "Local validator attached", pubkey, validator = shortLog(v),
start_slot = slot
Expand All @@ -109,9 +115,11 @@ proc addRemoteValidator*(pool: var ValidatorPool, item: KeystoreData,
index: Opt[ValidatorIndex], slot: Slot) =
doAssert item.kind == KeystoreKind.Remote
let pubkey = item.pubkey
let v = AttachedValidator(kind: ValidatorKind.Remote, pubkey: pubkey,
index: index, data: item, clients: clients,
startSlot: slot)
let v = AttachedValidator(
kind: ValidatorKind.Remote, pubkey: pubkey, index: index, data: item,
clients: clients,
externalBuilderRegistration: Opt.none SignedValidatorRegistrationV1,
startSlot: slot)
pool.validators[pubkey] = v
notice "Remote validator attached", pubkey, validator = shortLog(v),
remote_signer = $item.remotes,
Expand Down Expand Up @@ -403,7 +411,7 @@ proc getSlotSignature*(v: AttachedValidator, fork: Fork,
if signature.isErr:
return signature

v.slotSignature = some((slot, signature.get))
v.slotSignature = Opt.some((slot, signature.get))
return signature

# https://github.com/ethereum/builder-specs/blob/v0.2.0/specs/builder.md#signing
Expand Down

0 comments on commit 1fc8c96

Please sign in to comment.