allow payload builder client to be function of validator/proposer (#5015)
* allow payload builder client to be function of validator/proposer * fileExists has side effects on Windows and only Windows * another not-always-func
This commit is contained in:
parent
005a35597f
commit
e8e67ec771
|
@ -115,7 +115,8 @@ template rng*(node: BeaconNode): ref HmacDrbgContext =
|
|||
proc currentSlot*(node: BeaconNode): Slot =
|
||||
node.beaconClock.now.slotOrZero
|
||||
|
||||
proc getPayloadBuilderClient*(node: BeaconNode): RestResult[RestClientRef] =
|
||||
proc getPayloadBuilderClient*(
|
||||
node: BeaconNode, validator_index: uint64): RestResult[RestClientRef] =
|
||||
if node.config.payloadBuilderEnable:
|
||||
# Logging done in caller
|
||||
let res = RestClientRef.new(node.config.payloadBuilderUrl)
|
||||
|
|
|
@ -886,21 +886,21 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||
currentEpochFork.toString != version:
|
||||
return RestApiResponse.jsonError(Http400, BlockIncorrectFork)
|
||||
|
||||
let payloadBuilderClient = node.getPayloadBuilderClient().valueOr:
|
||||
return RestApiResponse.jsonError(
|
||||
Http400, "Unable to initialize payload builder client: " & $error)
|
||||
|
||||
case currentEpochFork
|
||||
of ConsensusFork.Deneb:
|
||||
return RestApiResponse.jsonError(Http500, $denebImplementationMissing)
|
||||
of ConsensusFork.Capella:
|
||||
let res =
|
||||
block:
|
||||
let restBlock = decodeBodyJsonOrSsz(
|
||||
capella_mev.SignedBlindedBeaconBlock, body).valueOr:
|
||||
return RestApiResponse.jsonError(Http400, InvalidBlockObjectError,
|
||||
$error)
|
||||
await node.unblindAndRouteBlockMEV(payloadBuilderClient, restBlock)
|
||||
let
|
||||
restBlock = decodeBodyJsonOrSsz(
|
||||
capella_mev.SignedBlindedBeaconBlock, body).valueOr:
|
||||
return RestApiResponse.jsonError(Http400, InvalidBlockObjectError,
|
||||
$error)
|
||||
payloadBuilderClient = node.getPayloadBuilderClient(
|
||||
restBlock.message.proposer_index).valueOr:
|
||||
return RestApiResponse.jsonError(
|
||||
Http400, "Unable to initialize payload builder client: " & $error)
|
||||
res = await node.unblindAndRouteBlockMEV(
|
||||
payloadBuilderClient, restBlock)
|
||||
|
||||
if res.isErr():
|
||||
return RestApiResponse.jsonError(
|
||||
|
@ -910,13 +910,17 @@ proc installBeaconApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||
|
||||
return RestApiResponse.jsonMsgResponse(BlockValidationSuccess)
|
||||
of ConsensusFork.Bellatrix:
|
||||
let res =
|
||||
block:
|
||||
let restBlock = decodeBodyJsonOrSsz(
|
||||
bellatrix_mev.SignedBlindedBeaconBlock, body).valueOr:
|
||||
return RestApiResponse.jsonError(Http400, InvalidBlockObjectError,
|
||||
$error)
|
||||
await node.unblindAndRouteBlockMEV(payloadBuilderClient, restBlock)
|
||||
let
|
||||
restBlock = decodeBodyJsonOrSsz(
|
||||
bellatrix_mev.SignedBlindedBeaconBlock, body).valueOr:
|
||||
return RestApiResponse.jsonError(Http400, InvalidBlockObjectError,
|
||||
$error)
|
||||
payloadBuilderClient = node.getPayloadBuilderClient(
|
||||
restBlock.message.proposer_index).valueOr:
|
||||
return RestApiResponse.jsonError(
|
||||
Http400, "Unable to initialize payload builder client: " & $error)
|
||||
res = await node.unblindAndRouteBlockMEV(
|
||||
payloadBuilderClient, restBlock)
|
||||
|
||||
if res.isErr():
|
||||
return RestApiResponse.jsonError(
|
||||
|
|
|
@ -509,7 +509,8 @@ proc installValidatorApiHandlers*(router: var RestRouter, node: BeaconNode) =
|
|||
RestApiResponse.jsonError(Http500, InvalidAcceptError)
|
||||
|
||||
let
|
||||
payloadBuilderClient = node.getPayloadBuilderClient().valueOr:
|
||||
payloadBuilderClient = node.getPayloadBuilderClient(
|
||||
proposer.distinctBase).valueOr:
|
||||
return RestApiResponse.jsonError(
|
||||
Http500, "Unable to initialize payload builder client: " & $error)
|
||||
contextFork = node.dag.cfg.consensusForkAtEpoch(node.currentSlot.epoch)
|
||||
|
|
|
@ -92,7 +92,7 @@ const
|
|||
"passwords" / "10-million-password-list-top-100000.txt",
|
||||
minWordLen = minPasswordLen)
|
||||
|
||||
proc dispose*(decryptor: var MultipleKeystoresDecryptor) =
|
||||
func dispose*(decryptor: var MultipleKeystoresDecryptor) =
|
||||
burnMem(decryptor.previouslyUsedPassword)
|
||||
|
||||
func init*(T: type KeymanagerHost,
|
||||
|
@ -134,8 +134,8 @@ func init*(T: type KeystoreData,
|
|||
pubkey: privateKey.toPubKey().toPubKey()
|
||||
)
|
||||
|
||||
func init*(T: type KeystoreData, keystore: RemoteKeystore,
|
||||
handle: FileLockHandle): Result[T, cstring] {.raises: [Defect].} =
|
||||
func init(T: type KeystoreData, keystore: RemoteKeystore,
|
||||
handle: FileLockHandle): Result[T, cstring] {.raises: [Defect].} =
|
||||
let cookedKey = keystore.pubkey.load().valueOr:
|
||||
return err("Invalid validator's public key")
|
||||
|
||||
|
@ -162,9 +162,9 @@ func init*(T: type KeystoreData, keystore: RemoteKeystore,
|
|||
remoteType: RemoteSignerType.VerifyingWeb3Signer,
|
||||
provenBlockProperties: keystore.provenBlockProperties)
|
||||
|
||||
func init*(T: type KeystoreData, cookedKey: CookedPubKey,
|
||||
remotes: seq[RemoteSignerInfo], threshold: uint32,
|
||||
handle: FileLockHandle): T =
|
||||
func init(T: type KeystoreData, cookedKey: CookedPubKey,
|
||||
remotes: seq[RemoteSignerInfo], threshold: uint32,
|
||||
handle: FileLockHandle): T =
|
||||
KeystoreData(
|
||||
kind: KeystoreKind.Remote,
|
||||
handle: handle,
|
||||
|
@ -178,7 +178,7 @@ func init(T: type AddValidatorFailure, status: AddValidatorStatus,
|
|||
msg = ""): AddValidatorFailure {.raises: [Defect].} =
|
||||
AddValidatorFailure(status: status, message: msg)
|
||||
|
||||
func toKeystoreKind*(kind: ValidatorKind): KeystoreKind {.raises: [Defect].} =
|
||||
func toKeystoreKind(kind: ValidatorKind): KeystoreKind {.raises: [Defect].} =
|
||||
case kind
|
||||
of ValidatorKind.Local:
|
||||
KeystoreKind.Local
|
||||
|
@ -240,7 +240,7 @@ proc checkAndCreateDataDir*(dataDir: string): bool =
|
|||
|
||||
return true
|
||||
|
||||
proc checkSensitivePathPermissions*(dirFilePath: string): bool =
|
||||
proc checkSensitivePathPermissions(dirFilePath: string): bool =
|
||||
## If ``dirFilePath`` is file, then check if file has only
|
||||
##
|
||||
## - "(600) rwx------" permissions on Posix (Linux, MacOS, BSD)
|
||||
|
@ -392,7 +392,7 @@ proc keyboardGetPassword[T](prompt: string, attempts: int,
|
|||
dec(remainingAttempts)
|
||||
err("Failed to decrypt keystore")
|
||||
|
||||
proc loadSecretFile*(path: string): KsResult[KeystorePass] {.
|
||||
proc loadSecretFile(path: string): KsResult[KeystorePass] {.
|
||||
raises: [Defect].} =
|
||||
let res = readAllChars(path)
|
||||
if res.isErr():
|
||||
|
@ -618,7 +618,7 @@ proc removeValidator*(pool: var ValidatorPool,
|
|||
pool.removeValidator(publicKey)
|
||||
ok(res.value())
|
||||
|
||||
proc checkKeyName*(keyName: string): bool =
|
||||
func checkKeyName(keyName: string): bool =
|
||||
const keyAlphabet = {'a'..'f', 'A'..'F', '0'..'9'}
|
||||
if len(keyName) != KeyNameSize:
|
||||
return false
|
||||
|
@ -629,7 +629,7 @@ proc checkKeyName*(keyName: string): bool =
|
|||
return false
|
||||
true
|
||||
|
||||
proc existsKeystore*(keystoreDir: string, keyKind: KeystoreKind): bool {.
|
||||
proc existsKeystore(keystoreDir: string, keyKind: KeystoreKind): bool {.
|
||||
raises: [Defect].} =
|
||||
case keyKind
|
||||
of KeystoreKind.Local:
|
||||
|
@ -637,8 +637,8 @@ proc existsKeystore*(keystoreDir: string, keyKind: KeystoreKind): bool {.
|
|||
of KeystoreKind.Remote:
|
||||
fileExists(keystoreDir / RemoteKeystoreFileName)
|
||||
|
||||
proc existsKeystore*(keystoreDir: string,
|
||||
keysMask: set[KeystoreKind]): bool {.raises: [Defect].} =
|
||||
proc existsKeystore(keystoreDir: string,
|
||||
keysMask: set[KeystoreKind]): bool {.raises: [Defect].} =
|
||||
if KeystoreKind.Local in keysMask:
|
||||
if existsKeystore(keystoreDir, KeystoreKind.Local):
|
||||
return true
|
||||
|
@ -820,7 +820,7 @@ type
|
|||
DuplicateKeystoreFile:
|
||||
error*: string
|
||||
|
||||
proc mapErrTo*[T, E](r: Result[T, E], v: static KeystoreGenerationErrorKind):
|
||||
func mapErrTo*[T, E](r: Result[T, E], v: static KeystoreGenerationErrorKind):
|
||||
Result[T, KeystoreGenerationError] =
|
||||
r.mapErr(proc (e: E): KeystoreGenerationError =
|
||||
KeystoreGenerationError(kind: v, error: $e))
|
||||
|
@ -948,7 +948,7 @@ proc createLocalValidatorFiles*(
|
|||
success = true
|
||||
ok()
|
||||
|
||||
proc createLockedLocalValidatorFiles*(
|
||||
proc createLockedLocalValidatorFiles(
|
||||
secretsDir, validatorsDir, keystoreDir,
|
||||
secretFile, passwordAsString, keystoreFile,
|
||||
encodedStorage: string
|
||||
|
@ -1022,7 +1022,7 @@ proc createRemoteValidatorFiles*(
|
|||
success = true
|
||||
ok()
|
||||
|
||||
proc createLockedRemoteValidatorFiles*(
|
||||
proc createLockedRemoteValidatorFiles(
|
||||
validatorsDir, keystoreDir, keystoreFile, encodedStorage: string
|
||||
): Result[FileLockHandle, KeystoreGenerationError] {.raises: [Defect].} =
|
||||
var
|
||||
|
@ -1089,7 +1089,7 @@ proc saveKeystore*(
|
|||
keystoreFile, encodedStorage)
|
||||
ok()
|
||||
|
||||
proc saveLockedKeystore*(
|
||||
proc saveLockedKeystore(
|
||||
rng: var HmacDrbgContext,
|
||||
validatorsDir, secretsDir: string,
|
||||
signingKey: ValidatorPrivKey,
|
||||
|
@ -1130,7 +1130,7 @@ proc saveLockedKeystore*(
|
|||
keystoreFile, encodedStorage)
|
||||
ok(lock)
|
||||
|
||||
proc saveKeystore*(
|
||||
proc saveKeystore(
|
||||
validatorsDir: string,
|
||||
publicKey: ValidatorPubKey,
|
||||
urls: seq[RemoteSignerInfo],
|
||||
|
@ -1172,7 +1172,7 @@ proc saveKeystore*(
|
|||
encodedStorage)
|
||||
ok()
|
||||
|
||||
proc saveLockedKeystore*(
|
||||
proc saveLockedKeystore(
|
||||
validatorsDir: string,
|
||||
publicKey: ValidatorPubKey,
|
||||
urls: seq[RemoteSignerInfo],
|
||||
|
@ -1222,7 +1222,7 @@ proc saveKeystore*(
|
|||
let remoteInfo = RemoteSignerInfo(url: url, id: 0)
|
||||
saveKeystore(validatorsDir, publicKey, @[remoteInfo], 1)
|
||||
|
||||
proc saveLockedKeystore*(
|
||||
proc saveLockedKeystore(
|
||||
validatorsDir: string,
|
||||
publicKey: ValidatorPubKey,
|
||||
url: HttpHostUri
|
||||
|
@ -1338,12 +1338,12 @@ func validatorKeystoreDir(host: KeymanagerHost,
|
|||
pubkey: ValidatorPubKey): string =
|
||||
host.validatorsDir.validatorKeystoreDir(pubkey)
|
||||
|
||||
func feeRecipientPath*(host: KeymanagerHost,
|
||||
pubkey: ValidatorPubKey): string =
|
||||
func feeRecipientPath(host: KeymanagerHost,
|
||||
pubkey: ValidatorPubKey): string =
|
||||
host.validatorsDir.feeRecipientPath(pubkey)
|
||||
|
||||
func gasLimitPath*(host: KeymanagerHost,
|
||||
pubkey: ValidatorPubKey): string =
|
||||
func gasLimitPath(host: KeymanagerHost,
|
||||
pubkey: ValidatorPubKey): string =
|
||||
host.validatorsDir.gasLimitPath(pubkey)
|
||||
|
||||
proc removeFeeRecipientFile*(host: KeymanagerHost,
|
||||
|
@ -1535,7 +1535,7 @@ proc generateDeposits*(cfg: RuntimeConfig,
|
|||
|
||||
ok deposits
|
||||
|
||||
proc saveWallet*(wallet: Wallet, outWalletPath: string): Result[void, string] =
|
||||
proc saveWallet(wallet: Wallet, outWalletPath: string): Result[void, string] =
|
||||
let walletDir = splitFile(outWalletPath).dir
|
||||
var encodedWallet: string
|
||||
try:
|
||||
|
|
|
@ -793,7 +793,8 @@ proc proposeBlockAux(
|
|||
# Collect bids
|
||||
var payloadBuilderClient: RestClientRef
|
||||
|
||||
let payloadBuilderClientMaybe = node.getPayloadBuilderClient()
|
||||
let payloadBuilderClientMaybe = node.getPayloadBuilderClient(
|
||||
validator_index.distinctBase)
|
||||
if payloadBuilderClientMaybe.isErr:
|
||||
warn "Unable to initialize payload builder client while proposing block",
|
||||
err = payloadBuilderClientMaybe.error
|
||||
|
@ -1399,7 +1400,7 @@ proc registerValidators*(node: BeaconNode, epoch: Epoch) {.async.} =
|
|||
|
||||
const HttpOk = 200
|
||||
|
||||
let payloadBuilderClient = node.getPayloadBuilderClient().valueOr:
|
||||
let payloadBuilderClient = node.getPayloadBuilderClient(0).valueOr:
|
||||
debug "Unable to initialize payload builder client while registering validators",
|
||||
err = error
|
||||
return
|
||||
|
|
Loading…
Reference in New Issue