From e062c15457839f3a9197c69b78fe95af3b8aa2eb Mon Sep 17 00:00:00 2001 From: cnupy Date: Sun, 24 Mar 2024 16:50:23 +0000 Subject: [PATCH 01/19] fix: handle remote signer non "application/json" response content type --- .../cli/src/cmds/validator/signers/index.ts | 6 +- .../src/util/externalSignerClient.ts | 67 +++++++++++++++++-- 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/packages/cli/src/cmds/validator/signers/index.ts b/packages/cli/src/cmds/validator/signers/index.ts index be028461c0ee..d3e069716787 100644 --- a/packages/cli/src/cmds/validator/signers/index.ts +++ b/packages/cli/src/cmds/validator/signers/index.ts @@ -106,7 +106,7 @@ export async function getSignersFromArgs( // Remote keys are declared manually or will be fetched from external signer else if (args["externalSigner.pubkeys"] || args["externalSigner.fetch"]) { - return getRemoteSigners(args); + return getRemoteSigners(args, logger as Logger); } // Read keys from local account manager @@ -155,7 +155,7 @@ export function getSignerPubkeyHex(signer: Signer): string { } } -async function getRemoteSigners(args: IValidatorCliArgs & GlobalArgs): Promise { +async function getRemoteSigners(args: IValidatorCliArgs & GlobalArgs, logger?: Logger): Promise { const externalSignerUrl = args["externalSigner.url"]; if (!externalSignerUrl) { throw new YargsError( @@ -171,7 +171,7 @@ async function getRemoteSigners(args: IValidatorCliArgs & GlobalArgs): Promise ({type: SignerType.Remote, pubkey, url: externalSignerUrl})); diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 90c6e1f464c8..154947e7dbdf 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -7,6 +7,7 @@ import {BeaconConfig} from "@lodestar/config"; import {computeEpochAtSlot, blindedOrFullBlockToHeader} from "@lodestar/state-transition"; import {allForks, Epoch, Root, RootHex, Slot, ssz} from "@lodestar/types"; import {PubkeyHex} from "../types.js"; +import {Logger} from "@lodestar/utils"; /* eslint-disable @typescript-eslint/naming-convention */ @@ -104,13 +105,13 @@ type Web3SignerSerializedRequest = { /** * Return public keys from the server. */ -export async function externalSignerGetKeys(externalSignerUrl: string): Promise { +export async function externalSignerGetKeys(externalSignerUrl: string, logger?: Logger): Promise { const res = await fetch(`${externalSignerUrl}/api/v1/eth2/publicKeys`, { method: "GET", headers: {"Content-Type": "application/json"}, }); - return handlerExternalSignerResponse(res); + return handlerExternalSignerGetKeysResponse(res, logger); } /** @@ -122,7 +123,8 @@ export async function externalSignerPostSignature( pubkeyHex: PubkeyHex, signingRoot: Root, signingSlot: Slot, - signableMessage: SignableMessage + signableMessage: SignableMessage, + logger?: Logger ): Promise { const requestObj = serializerSignableMessagePayload(config, signableMessage) as Web3SignerSerializedRequest; @@ -147,7 +149,7 @@ export async function externalSignerPostSignature( body: JSON.stringify(requestObj), }); - const data = await handlerExternalSignerResponse<{signature: string}>(res); + const data = await handlerExternalSignerPostSignatureResponse(res, logger); return data.signature; } @@ -160,17 +162,68 @@ export async function externalSignerUpCheck(remoteUrl: string): Promise headers: {"Content-Type": "application/json"}, }); - const data = await handlerExternalSignerResponse<{status: string}>(res); + const data = await handlerExternalSignerUpCheckResponse(res); return data.status === "OK"; } -async function handlerExternalSignerResponse(res: Response): Promise { +async function handlerExternalSignerGetKeysResponse(res: Response, logger?: Logger): Promise { if (!res.ok) { const errBody = await res.text(); + logger?.debug("External signer GetKeys error", {body: errBody}); throw Error(`${errBody}`); } - return JSON.parse(await res.text()) as T; + const resBody = await res.text(); + const resContentType = res.headers.get("Content-Type"); + + logger?.debug("External signer GetKeys response", {contentType: resContentType, body: resBody}); + + if(resContentType?.startsWith("application/json")) { + return JSON.parse(resBody) as string[]; + } + else { + return resBody.split(","); + } +} + +async function handlerExternalSignerPostSignatureResponse(res: Response, logger?: Logger): Promise<{signature: string}> { + if (!res.ok) { + const errBody = await res.text(); + logger?.debug("External signer PostSignature error", {body: errBody}); + throw Error(`${errBody}`); + } + + const resBody = await res.text(); + const resContentType = res.headers.get("Content-Type"); + + logger?.debug("External signer PostSignature response", {contentType: resContentType, body: resBody}); + + if(resContentType?.startsWith("application/json")) { + return JSON.parse(resBody) as {signature: string}; + } + else { + return {signature: resBody}; + } +} + +async function handlerExternalSignerUpCheckResponse(res: Response, logger?: Logger): Promise<{status: string}> { + if (!res.ok) { + const errBody = await res.text(); + logger?.debug("External signer UpCheck error", {body: errBody}); + throw Error(`${errBody}`); + } + + const resBody = await res.text(); + const resContentType = res.headers.get("Content-Type"); + + logger?.debug("External signer UpCheck response", {contentType: resContentType, body: resBody}); + + if(resContentType?.startsWith("application/json")) { + return JSON.parse(resBody) as {status: string}; + } + else { + return {status: resBody}; + } } function serializerSignableMessagePayload(config: BeaconConfig, payload: SignableMessage): Record { From ecdcc6a1f81d733333abdf14458a3f488e015099 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 27 Mar 2024 21:46:26 +0200 Subject: [PATCH 02/19] restrict logger to minimal set and remove cast --- packages/cli/src/cmds/validator/signers/index.ts | 8 +++++--- .../validator/src/util/externalSignerClient.ts | 14 ++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/cli/src/cmds/validator/signers/index.ts b/packages/cli/src/cmds/validator/signers/index.ts index d3e069716787..6bf26b6b75aa 100644 --- a/packages/cli/src/cmds/validator/signers/index.ts +++ b/packages/cli/src/cmds/validator/signers/index.ts @@ -16,6 +16,8 @@ import {importKeystoreDefinitionsFromExternalDir, readPassphraseOrPrompt} from " const KEYSTORE_IMPORT_PROGRESS_MS = 10000; +type MinamalLogger = Pick; + /** * Options processing hierarchy * --interopIndexes @@ -44,7 +46,7 @@ const KEYSTORE_IMPORT_PROGRESS_MS = 10000; export async function getSignersFromArgs( args: IValidatorCliArgs & GlobalArgs, network: string, - {logger, signal}: {logger: Pick; signal: AbortSignal} + {logger, signal}: {logger: MinamalLogger; signal: AbortSignal} ): Promise { const accountPaths = getAccountPaths(args, network); @@ -106,7 +108,7 @@ export async function getSignersFromArgs( // Remote keys are declared manually or will be fetched from external signer else if (args["externalSigner.pubkeys"] || args["externalSigner.fetch"]) { - return getRemoteSigners(args, logger as Logger); + return getRemoteSigners(args, logger); } // Read keys from local account manager @@ -155,7 +157,7 @@ export function getSignerPubkeyHex(signer: Signer): string { } } -async function getRemoteSigners(args: IValidatorCliArgs & GlobalArgs, logger?: Logger): Promise { +async function getRemoteSigners(args: IValidatorCliArgs & GlobalArgs, logger?: MinamalLogger): Promise { const externalSignerUrl = args["externalSigner.url"]; if (!externalSignerUrl) { throw new YargsError( diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 154947e7dbdf..ad0bc3be9907 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -7,7 +7,7 @@ import {BeaconConfig} from "@lodestar/config"; import {computeEpochAtSlot, blindedOrFullBlockToHeader} from "@lodestar/state-transition"; import {allForks, Epoch, Root, RootHex, Slot, ssz} from "@lodestar/types"; import {PubkeyHex} from "../types.js"; -import {Logger} from "@lodestar/utils"; +import {Logger, LogLevel} from "@lodestar/utils"; /* eslint-disable @typescript-eslint/naming-convention */ @@ -26,6 +26,8 @@ export enum SignableMessageType { BLS_TO_EXECUTION_CHANGE = "BLS_TO_EXECUTION_CHANGE", } +type MinamalLogger = Pick; + const AggregationSlotType = new ContainerType({ slot: ssz.Slot, }); @@ -105,7 +107,7 @@ type Web3SignerSerializedRequest = { /** * Return public keys from the server. */ -export async function externalSignerGetKeys(externalSignerUrl: string, logger?: Logger): Promise { +export async function externalSignerGetKeys(externalSignerUrl: string, logger?: MinamalLogger): Promise { const res = await fetch(`${externalSignerUrl}/api/v1/eth2/publicKeys`, { method: "GET", headers: {"Content-Type": "application/json"}, @@ -124,7 +126,7 @@ export async function externalSignerPostSignature( signingRoot: Root, signingSlot: Slot, signableMessage: SignableMessage, - logger?: Logger + logger?: MinamalLogger ): Promise { const requestObj = serializerSignableMessagePayload(config, signableMessage) as Web3SignerSerializedRequest; @@ -166,7 +168,7 @@ export async function externalSignerUpCheck(remoteUrl: string): Promise return data.status === "OK"; } -async function handlerExternalSignerGetKeysResponse(res: Response, logger?: Logger): Promise { +async function handlerExternalSignerGetKeysResponse(res: Response, logger?: MinamalLogger): Promise { if (!res.ok) { const errBody = await res.text(); logger?.debug("External signer GetKeys error", {body: errBody}); @@ -186,7 +188,7 @@ async function handlerExternalSignerGetKeysResponse(res: Response, logger?: L } } -async function handlerExternalSignerPostSignatureResponse(res: Response, logger?: Logger): Promise<{signature: string}> { +async function handlerExternalSignerPostSignatureResponse(res: Response, logger?: MinamalLogger): Promise<{signature: string}> { if (!res.ok) { const errBody = await res.text(); logger?.debug("External signer PostSignature error", {body: errBody}); @@ -206,7 +208,7 @@ async function handlerExternalSignerPostSignatureResponse(res: Response, logg } } -async function handlerExternalSignerUpCheckResponse(res: Response, logger?: Logger): Promise<{status: string}> { +async function handlerExternalSignerUpCheckResponse(res: Response, logger?: MinamalLogger): Promise<{status: string}> { if (!res.ok) { const errBody = await res.text(); logger?.debug("External signer UpCheck error", {body: errBody}); From 383b07b57401001c6ff1a9cca9f455d8993de61c Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 27 Mar 2024 22:44:15 +0200 Subject: [PATCH 03/19] Fix typo - `minamal`; refactor/inline response handling functions; remove error logging and improve exception messaging for res != OK; fix content type parsing and handling of invalid content types; --- .../cli/src/cmds/validator/signers/index.ts | 6 +- .../src/util/externalSignerClient.ts | 103 ++++++++---------- 2 files changed, 50 insertions(+), 59 deletions(-) diff --git a/packages/cli/src/cmds/validator/signers/index.ts b/packages/cli/src/cmds/validator/signers/index.ts index 6bf26b6b75aa..e84310600b83 100644 --- a/packages/cli/src/cmds/validator/signers/index.ts +++ b/packages/cli/src/cmds/validator/signers/index.ts @@ -16,7 +16,7 @@ import {importKeystoreDefinitionsFromExternalDir, readPassphraseOrPrompt} from " const KEYSTORE_IMPORT_PROGRESS_MS = 10000; -type MinamalLogger = Pick; +type MinimalLogger = Pick; /** * Options processing hierarchy @@ -46,7 +46,7 @@ type MinamalLogger = Pick { const accountPaths = getAccountPaths(args, network); @@ -157,7 +157,7 @@ export function getSignerPubkeyHex(signer: Signer): string { } } -async function getRemoteSigners(args: IValidatorCliArgs & GlobalArgs, logger?: MinamalLogger): Promise { +async function getRemoteSigners(args: IValidatorCliArgs & GlobalArgs, logger?: MinimalLogger): Promise { const externalSignerUrl = args["externalSigner.url"]; if (!externalSignerUrl) { throw new YargsError( diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index ad0bc3be9907..a25018cfc3e7 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -26,7 +26,7 @@ export enum SignableMessageType { BLS_TO_EXECUTION_CHANGE = "BLS_TO_EXECUTION_CHANGE", } -type MinamalLogger = Pick; +type MinimalLogger = Pick; const AggregationSlotType = new ContainerType({ slot: ssz.Slot, @@ -107,13 +107,28 @@ type Web3SignerSerializedRequest = { /** * Return public keys from the server. */ -export async function externalSignerGetKeys(externalSignerUrl: string, logger?: MinamalLogger): Promise { +export async function externalSignerGetKeys(externalSignerUrl: string, logger?: MinimalLogger): Promise { const res = await fetch(`${externalSignerUrl}/api/v1/eth2/publicKeys`, { method: "GET", headers: {"Content-Type": "application/json"}, }); - return handlerExternalSignerGetKeysResponse(res, logger); + if (!res.ok) { + const errBody = await res.text(); + throw Error(`External signer GetKeys error: ${{statusCode: res.status, errorBody: errBody}}`); + } + + const resBody = await res.text(); + const resContentType = res.headers?.get("Content-Type")?.split(";", 1)[0].trim().toLowerCase(); + + logger?.debug("External signer GetKeys response", {contentType: resContentType, body: resBody}); + + if(resContentType === "application/json") { + return JSON.parse(resBody) as string[]; + } + else { + throw Error(`External signer GetKeys: content type ${resContentType} not supported`); + } } /** @@ -126,7 +141,7 @@ export async function externalSignerPostSignature( signingRoot: Root, signingSlot: Slot, signableMessage: SignableMessage, - logger?: MinamalLogger + logger?: MinimalLogger ): Promise { const requestObj = serializerSignableMessagePayload(config, signableMessage) as Web3SignerSerializedRequest; @@ -151,80 +166,56 @@ export async function externalSignerPostSignature( body: JSON.stringify(requestObj), }); - const data = await handlerExternalSignerPostSignatureResponse(res, logger); - return data.signature; -} - -/** - * Return upcheck status from server. - */ -export async function externalSignerUpCheck(remoteUrl: string): Promise { - const res = await fetch(`${remoteUrl}/upcheck`, { - method: "GET", - headers: {"Content-Type": "application/json"}, - }); - - const data = await handlerExternalSignerUpCheckResponse(res); - return data.status === "OK"; -} - -async function handlerExternalSignerGetKeysResponse(res: Response, logger?: MinamalLogger): Promise { if (!res.ok) { const errBody = await res.text(); - logger?.debug("External signer GetKeys error", {body: errBody}); - throw Error(`${errBody}`); + throw Error(`External signer PostSignature error: ${{statusCode: res.status, errorBody: errBody}}`); } const resBody = await res.text(); - const resContentType = res.headers.get("Content-Type"); - - logger?.debug("External signer GetKeys response", {contentType: resContentType, body: resBody}); - - if(resContentType?.startsWith("application/json")) { - return JSON.parse(resBody) as string[]; - } - else { - return resBody.split(","); - } -} - -async function handlerExternalSignerPostSignatureResponse(res: Response, logger?: MinamalLogger): Promise<{signature: string}> { - if (!res.ok) { - const errBody = await res.text(); - logger?.debug("External signer PostSignature error", {body: errBody}); - throw Error(`${errBody}`); - } - - const resBody = await res.text(); - const resContentType = res.headers.get("Content-Type"); + const resContentType = res.headers?.get("Content-Type")?.split(";", 1)[0].trim().toLowerCase(); logger?.debug("External signer PostSignature response", {contentType: resContentType, body: resBody}); - if(resContentType?.startsWith("application/json")) { - return JSON.parse(resBody) as {signature: string}; + if(resContentType === "application/json") { + const data = JSON.parse(resBody) as {signature: string}; + return data.signature; + } + else if (resContentType === "text/plain") { + return resBody; } else { - return {signature: resBody}; + throw Error(`External signer PostSignature: content type ${resContentType} not supported`); } } -async function handlerExternalSignerUpCheckResponse(res: Response, logger?: MinamalLogger): Promise<{status: string}> { +/** + * Return upcheck status from server. + */ +export async function externalSignerUpCheck(remoteUrl: string, logger?: MinimalLogger): Promise { + const res = await fetch(`${remoteUrl}/upcheck`, { + method: "GET", + headers: {"Content-Type": "application/json"}, + }); + if (!res.ok) { const errBody = await res.text(); - logger?.debug("External signer UpCheck error", {body: errBody}); - throw Error(`${errBody}`); + throw Error(`External signer UpCheck error: ${{statusCode: res.status, errorBody: errBody}}`); } const resBody = await res.text(); - const resContentType = res.headers.get("Content-Type"); + const resContentType = res.headers?.get("Content-Type")?.split(";", 1)[0].trim().toLowerCase(); logger?.debug("External signer UpCheck response", {contentType: resContentType, body: resBody}); - if(resContentType?.startsWith("application/json")) { - return JSON.parse(resBody) as {status: string}; + if(resContentType === "application/json") { + const data = JSON.parse(resBody) as {status: string}; + return data.status === "OK"; } - else { - return {status: resBody}; + else if (resContentType === "text/plain") { + return resBody === "OK"; + } + else{ + throw Error(`External signer UpCheck: content type ${resContentType} not supported`); } } From 23ca7ba87f5c75c11f06a06f431fb784e02221bc Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 27 Mar 2024 23:01:20 +0200 Subject: [PATCH 04/19] fix: exception message text --- packages/validator/src/util/externalSignerClient.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index a25018cfc3e7..ba56b49f5b29 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -115,7 +115,7 @@ export async function externalSignerGetKeys(externalSignerUrl: string, logger?: if (!res.ok) { const errBody = await res.text(); - throw Error(`External signer GetKeys error: ${{statusCode: res.status, errorBody: errBody}}`); + throw Error(`External signer GetKeys: statusCode=${res.status}, errorBody=${errBody}`); } const resBody = await res.text(); @@ -168,7 +168,7 @@ export async function externalSignerPostSignature( if (!res.ok) { const errBody = await res.text(); - throw Error(`External signer PostSignature error: ${{statusCode: res.status, errorBody: errBody}}`); + throw Error(`External signer PostSignature: statusCode=${res.status}, errorBody=${errBody}`); } const resBody = await res.text(); @@ -199,7 +199,7 @@ export async function externalSignerUpCheck(remoteUrl: string, logger?: MinimalL if (!res.ok) { const errBody = await res.text(); - throw Error(`External signer UpCheck error: ${{statusCode: res.status, errorBody: errBody}}`); + throw Error(`External signer UpCheck: statusCode=${res.status}, errorBody=${errBody}`); } const resBody = await res.text(); From 8ce75ab21093cda717481a230727e44ef92bba03 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 28 Mar 2024 17:34:32 +0200 Subject: [PATCH 05/19] Removed logger in externalSignerClient; Improved handling of response media types; --- .../cli/src/cmds/validator/signers/index.ts | 10 +- .../src/util/externalSignerClient.ts | 110 +++++++++++------- 2 files changed, 74 insertions(+), 46 deletions(-) diff --git a/packages/cli/src/cmds/validator/signers/index.ts b/packages/cli/src/cmds/validator/signers/index.ts index e84310600b83..be028461c0ee 100644 --- a/packages/cli/src/cmds/validator/signers/index.ts +++ b/packages/cli/src/cmds/validator/signers/index.ts @@ -16,8 +16,6 @@ import {importKeystoreDefinitionsFromExternalDir, readPassphraseOrPrompt} from " const KEYSTORE_IMPORT_PROGRESS_MS = 10000; -type MinimalLogger = Pick; - /** * Options processing hierarchy * --interopIndexes @@ -46,7 +44,7 @@ type MinimalLogger = Pick; signal: AbortSignal} ): Promise { const accountPaths = getAccountPaths(args, network); @@ -108,7 +106,7 @@ export async function getSignersFromArgs( // Remote keys are declared manually or will be fetched from external signer else if (args["externalSigner.pubkeys"] || args["externalSigner.fetch"]) { - return getRemoteSigners(args, logger); + return getRemoteSigners(args); } // Read keys from local account manager @@ -157,7 +155,7 @@ export function getSignerPubkeyHex(signer: Signer): string { } } -async function getRemoteSigners(args: IValidatorCliArgs & GlobalArgs, logger?: MinimalLogger): Promise { +async function getRemoteSigners(args: IValidatorCliArgs & GlobalArgs): Promise { const externalSignerUrl = args["externalSigner.url"]; if (!externalSignerUrl) { throw new YargsError( @@ -173,7 +171,7 @@ async function getRemoteSigners(args: IValidatorCliArgs & GlobalArgs, logger?: M throw new YargsError("externalSigner.pubkeys is set to an empty list"); } - const pubkeys = args["externalSigner.pubkeys"] ?? (await externalSignerGetKeys(externalSignerUrl, logger)); + const pubkeys = args["externalSigner.pubkeys"] ?? (await externalSignerGetKeys(externalSignerUrl)); assertValidPubkeysHex(pubkeys); return pubkeys.map((pubkey) => ({type: SignerType.Remote, pubkey, url: externalSignerUrl})); diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index ba56b49f5b29..756633320041 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -7,7 +7,6 @@ import {BeaconConfig} from "@lodestar/config"; import {computeEpochAtSlot, blindedOrFullBlockToHeader} from "@lodestar/state-transition"; import {allForks, Epoch, Root, RootHex, Slot, ssz} from "@lodestar/types"; import {PubkeyHex} from "../types.js"; -import {Logger, LogLevel} from "@lodestar/utils"; /* eslint-disable @typescript-eslint/naming-convention */ @@ -26,8 +25,6 @@ export enum SignableMessageType { BLS_TO_EXECUTION_CHANGE = "BLS_TO_EXECUTION_CHANGE", } -type MinimalLogger = Pick; - const AggregationSlotType = new ContainerType({ slot: ssz.Slot, }); @@ -107,7 +104,7 @@ type Web3SignerSerializedRequest = { /** * Return public keys from the server. */ -export async function externalSignerGetKeys(externalSignerUrl: string, logger?: MinimalLogger): Promise { +export async function externalSignerGetKeys(externalSignerUrl: string): Promise { const res = await fetch(`${externalSignerUrl}/api/v1/eth2/publicKeys`, { method: "GET", headers: {"Content-Type": "application/json"}, @@ -118,17 +115,8 @@ export async function externalSignerGetKeys(externalSignerUrl: string, logger?: throw Error(`External signer GetKeys: statusCode=${res.status}, errorBody=${errBody}`); } - const resBody = await res.text(); - const resContentType = res.headers?.get("Content-Type")?.split(";", 1)[0].trim().toLowerCase(); - - logger?.debug("External signer GetKeys response", {contentType: resContentType, body: resBody}); - - if(resContentType === "application/json") { - return JSON.parse(resBody) as string[]; - } - else { - throw Error(`External signer GetKeys: content type ${resContentType} not supported`); - } + ensureCorrectWireFormat(res, WireFormat.json) + return JSON.parse(await res.text()) as string[]; } /** @@ -140,8 +128,7 @@ export async function externalSignerPostSignature( pubkeyHex: PubkeyHex, signingRoot: Root, signingSlot: Slot, - signableMessage: SignableMessage, - logger?: MinimalLogger + signableMessage: SignableMessage ): Promise { const requestObj = serializerSignableMessagePayload(config, signableMessage) as Web3SignerSerializedRequest; @@ -172,26 +159,20 @@ export async function externalSignerPostSignature( } const resBody = await res.text(); - const resContentType = res.headers?.get("Content-Type")?.split(";", 1)[0].trim().toLowerCase(); - logger?.debug("External signer PostSignature response", {contentType: resContentType, body: resBody}); - - if(resContentType === "application/json") { - const data = JSON.parse(resBody) as {signature: string}; - return data.signature; - } - else if (resContentType === "text/plain") { - return resBody; - } - else { - throw Error(`External signer PostSignature: content type ${resContentType} not supported`); + switch (ensureCorrectWireFormat(res)) { + case WireFormat.json: + const data = JSON.parse(resBody) as {signature: string}; + return data.signature; + case WireFormat.text: + return resBody; } } /** * Return upcheck status from server. */ -export async function externalSignerUpCheck(remoteUrl: string, logger?: MinimalLogger): Promise { +export async function externalSignerUpCheck(remoteUrl: string): Promise { const res = await fetch(`${remoteUrl}/upcheck`, { method: "GET", headers: {"Content-Type": "application/json"}, @@ -203,20 +184,69 @@ export async function externalSignerUpCheck(remoteUrl: string, logger?: MinimalL } const resBody = await res.text(); - const resContentType = res.headers?.get("Content-Type")?.split(";", 1)[0].trim().toLowerCase(); - - logger?.debug("External signer UpCheck response", {contentType: resContentType, body: resBody}); - if(resContentType === "application/json") { - const data = JSON.parse(resBody) as {status: string}; - return data.status === "OK"; + switch (ensureCorrectWireFormat(res)) { + case WireFormat.json: + const data = JSON.parse(resBody) as {status: string}; + return data.status === "OK"; + case WireFormat.text: + return resBody === "OK"; } - else if (resContentType === "text/plain") { - return resBody === "OK"; +} + +function ensureCorrectWireFormat(response: Response, onlySupport? : WireFormat) : WireFormat{ + const contentType = response.headers.get("content-type"); + if (contentType === null) { + throw Error("No Content-Type header found in response"); + } + + const mediaType = parseContentTypeHeader(contentType); + if (mediaType === null) { + throw Error(`Unsupported response media type: ${contentType.split(";", 1)[0]}`); + } + + const wireFormat = getWireFormat(mediaType); + + if (onlySupport !== undefined && wireFormat !== onlySupport) { + throw Error(`Method only supports ${onlySupport} responses`); + } + + return wireFormat; +} + +enum WireFormat { + json = "json", + text = "text", +} + +enum MediaType { + json = "application/json", + text = "text/plain", +} + +function getWireFormat(mediaType: MediaType): WireFormat { + switch (mediaType) { + case MediaType.json: + return WireFormat.json; + case MediaType.text: + return WireFormat.text; } - else{ - throw Error(`External signer UpCheck: content type ${resContentType} not supported`); +} + +const supportedMediaTypes = Object.values(MediaType); + +function isSupportedMediaType(mediaType: string | null): mediaType is MediaType { + return mediaType !== null && supportedMediaTypes.includes(mediaType as MediaType); +} + +function parseContentTypeHeader(contentType?: string): MediaType | null { + if (!contentType) { + return null; } + + const mediaType = contentType.split(";", 1)[0].trim().toLowerCase(); + + return isSupportedMediaType(mediaType) ? mediaType : null; } function serializerSignableMessagePayload(config: BeaconConfig, payload: SignableMessage): Record { From 22f7131b816e35edc88a60fd965e80359e5ed7d5 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 28 Mar 2024 18:32:28 +0200 Subject: [PATCH 06/19] fix: use response statusText as error message if response body is empty (response error) --- packages/validator/src/util/externalSignerClient.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 756633320041..05a1f19a8abe 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -111,8 +111,7 @@ export async function externalSignerGetKeys(externalSignerUrl: string): Promise< }); if (!res.ok) { - const errBody = await res.text(); - throw Error(`External signer GetKeys: statusCode=${res.status}, errorBody=${errBody}`); + throw Error(`${await res.text()??res.statusText}`); } ensureCorrectWireFormat(res, WireFormat.json) @@ -154,8 +153,7 @@ export async function externalSignerPostSignature( }); if (!res.ok) { - const errBody = await res.text(); - throw Error(`External signer PostSignature: statusCode=${res.status}, errorBody=${errBody}`); + throw Error(`${await res.text()??res.statusText}`); } const resBody = await res.text(); @@ -179,8 +177,7 @@ export async function externalSignerUpCheck(remoteUrl: string): Promise }); if (!res.ok) { - const errBody = await res.text(); - throw Error(`External signer UpCheck: statusCode=${res.status}, errorBody=${errBody}`); + throw Error(`${await res.text()??res.statusText}`); } const resBody = await res.text(); From 6791ae3a07f4e278e5d5a0c2641216062c6d9e43 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 28 Mar 2024 22:48:25 +0200 Subject: [PATCH 07/19] fix: exception message text proper epmpty string check --- packages/validator/src/util/externalSignerClient.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 05a1f19a8abe..fd51fed0855f 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -111,7 +111,8 @@ export async function externalSignerGetKeys(externalSignerUrl: string): Promise< }); if (!res.ok) { - throw Error(`${await res.text()??res.statusText}`); + const errBody = await res.text(); + throw Error(`${errBody != undefined && errBody !== "" ? errBody : res.statusText}`); } ensureCorrectWireFormat(res, WireFormat.json) @@ -153,7 +154,8 @@ export async function externalSignerPostSignature( }); if (!res.ok) { - throw Error(`${await res.text()??res.statusText}`); + const errBody = await res.text(); + throw Error(`${errBody != undefined && errBody !== "" ? errBody : res.statusText}`); } const resBody = await res.text(); @@ -177,7 +179,8 @@ export async function externalSignerUpCheck(remoteUrl: string): Promise }); if (!res.ok) { - throw Error(`${await res.text()??res.statusText}`); + const errBody = await res.text(); + throw Error(`${errBody != undefined && errBody !== "" ? errBody : res.statusText}`); } const resBody = await res.text(); From f36052cf25a2ebd05027ee9d0b33617ebf9a2b93 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 28 Mar 2024 22:59:01 +0200 Subject: [PATCH 08/19] fix: exception message text proper epmpty string check --- packages/validator/src/util/externalSignerClient.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index fd51fed0855f..7ab20918c395 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -111,8 +111,7 @@ export async function externalSignerGetKeys(externalSignerUrl: string): Promise< }); if (!res.ok) { - const errBody = await res.text(); - throw Error(`${errBody != undefined && errBody !== "" ? errBody : res.statusText}`); + throw Error(`${await res.text() || res.statusText}`); } ensureCorrectWireFormat(res, WireFormat.json) @@ -154,8 +153,7 @@ export async function externalSignerPostSignature( }); if (!res.ok) { - const errBody = await res.text(); - throw Error(`${errBody != undefined && errBody !== "" ? errBody : res.statusText}`); + throw Error(`${await res.text() || res.statusText}`); } const resBody = await res.text(); @@ -179,8 +177,7 @@ export async function externalSignerUpCheck(remoteUrl: string): Promise }); if (!res.ok) { - const errBody = await res.text(); - throw Error(`${errBody != undefined && errBody !== "" ? errBody : res.statusText}`); + throw Error(`${await res.text() || res.statusText}`); } const resBody = await res.text(); From 6742089dd2528c93565a334a20a6334a74734cf6 Mon Sep 17 00:00:00 2001 From: cnupy Date: Fri, 29 Mar 2024 12:00:56 +0000 Subject: [PATCH 09/19] fix: lint errors --- .../src/util/externalSignerClient.ts | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 7ab20918c395..f986b88b4008 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -111,10 +111,10 @@ export async function externalSignerGetKeys(externalSignerUrl: string): Promise< }); if (!res.ok) { - throw Error(`${await res.text() || res.statusText}`); + throw Error(`${(await res.text()) || res.statusText}`); } - ensureCorrectWireFormat(res, WireFormat.json) + ensureCorrectWireFormat(res, WireFormat.json); return JSON.parse(await res.text()) as string[]; } @@ -153,15 +153,16 @@ export async function externalSignerPostSignature( }); if (!res.ok) { - throw Error(`${await res.text() || res.statusText}`); + throw Error(`${(await res.text()) || res.statusText}`); } const resBody = await res.text(); switch (ensureCorrectWireFormat(res)) { - case WireFormat.json: + case WireFormat.json: { const data = JSON.parse(resBody) as {signature: string}; return data.signature; + } case WireFormat.text: return resBody; } @@ -177,38 +178,39 @@ export async function externalSignerUpCheck(remoteUrl: string): Promise }); if (!res.ok) { - throw Error(`${await res.text() || res.statusText}`); + throw Error(`${(await res.text()) || res.statusText}`); } const resBody = await res.text(); switch (ensureCorrectWireFormat(res)) { - case WireFormat.json: + case WireFormat.json: { const data = JSON.parse(resBody) as {status: string}; return data.status === "OK"; + } case WireFormat.text: return resBody === "OK"; } } -function ensureCorrectWireFormat(response: Response, onlySupport? : WireFormat) : WireFormat{ - const contentType = response.headers.get("content-type"); - if (contentType === null) { - throw Error("No Content-Type header found in response"); - } +function ensureCorrectWireFormat(response: Response, onlySupport?: WireFormat): WireFormat { + const contentType = response.headers.get("content-type"); + if (contentType === null) { + throw Error("No Content-Type header found in response"); + } - const mediaType = parseContentTypeHeader(contentType); - if (mediaType === null) { - throw Error(`Unsupported response media type: ${contentType.split(";", 1)[0]}`); - } + const mediaType = parseContentTypeHeader(contentType); + if (mediaType === null) { + throw Error(`Unsupported response media type: ${contentType.split(";", 1)[0]}`); + } - const wireFormat = getWireFormat(mediaType); + const wireFormat = getWireFormat(mediaType); - if (onlySupport !== undefined && wireFormat !== onlySupport) { - throw Error(`Method only supports ${onlySupport} responses`); - } + if (onlySupport !== undefined && wireFormat !== onlySupport) { + throw Error(`Method only supports ${onlySupport} responses`); + } - return wireFormat; + return wireFormat; } enum WireFormat { @@ -223,10 +225,10 @@ enum MediaType { function getWireFormat(mediaType: MediaType): WireFormat { switch (mediaType) { - case MediaType.json: - return WireFormat.json; - case MediaType.text: - return WireFormat.text; + case MediaType.json: + return WireFormat.json; + case MediaType.text: + return WireFormat.text; } } @@ -238,7 +240,7 @@ function isSupportedMediaType(mediaType: string | null): mediaType is MediaType function parseContentTypeHeader(contentType?: string): MediaType | null { if (!contentType) { - return null; + return null; } const mediaType = contentType.split(";", 1)[0].trim().toLowerCase(); From 282cc865250f877e3821145c50e06b4fcc62c574 Mon Sep 17 00:00:00 2001 From: cnupy Date: Thu, 4 Apr 2024 07:18:33 +0000 Subject: [PATCH 10/19] reintroduce handleExternalSignerResponse generic function with better error handling; add accept header to all requests; --- .../src/util/externalSignerClient.ts | 106 +++++------------- 1 file changed, 29 insertions(+), 77 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index f986b88b4008..1707e6e26112 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -101,21 +101,22 @@ type Web3SignerSerializedRequest = { signingRoot: RootHex; }; +enum MediaType { + json = "application/json", +} + +const supportedMediaTypes = Object.values(MediaType); + /** * Return public keys from the server. */ export async function externalSignerGetKeys(externalSignerUrl: string): Promise { const res = await fetch(`${externalSignerUrl}/api/v1/eth2/publicKeys`, { method: "GET", - headers: {"Content-Type": "application/json"}, + headers: {Accept: MediaType.json}, }); - if (!res.ok) { - throw Error(`${(await res.text()) || res.statusText}`); - } - - ensureCorrectWireFormat(res, WireFormat.json); - return JSON.parse(await res.text()) as string[]; + return handleExternalSignerResponse(res); } /** @@ -148,24 +149,15 @@ export async function externalSignerPostSignature( const res = await fetch(`${externalSignerUrl}/api/v1/eth2/sign/${pubkeyHex}`, { method: "POST", - headers: {"Content-Type": "application/json"}, + headers: { + Accept: MediaType.json, + "Content-Type": MediaType.json, + }, body: JSON.stringify(requestObj), }); - if (!res.ok) { - throw Error(`${(await res.text()) || res.statusText}`); - } - - const resBody = await res.text(); - - switch (ensureCorrectWireFormat(res)) { - case WireFormat.json: { - const data = JSON.parse(resBody) as {signature: string}; - return data.signature; - } - case WireFormat.text: - return resBody; - } + const data = await handleExternalSignerResponse<{signature: string}>(res); + return data.signature; } /** @@ -174,78 +166,38 @@ export async function externalSignerPostSignature( export async function externalSignerUpCheck(remoteUrl: string): Promise { const res = await fetch(`${remoteUrl}/upcheck`, { method: "GET", - headers: {"Content-Type": "application/json"}, + headers: {Accept: MediaType.json}, }); if (!res.ok) { throw Error(`${(await res.text()) || res.statusText}`); } - const resBody = await res.text(); + const data = await handleExternalSignerResponse<{status: string}>(res); + return data.status === "OK"; +} - switch (ensureCorrectWireFormat(res)) { - case WireFormat.json: { - const data = JSON.parse(resBody) as {status: string}; - return data.status === "OK"; - } - case WireFormat.text: - return resBody === "OK"; +async function handleExternalSignerResponse(res: Response): Promise { + if (!res.ok) { + throw Error(`${(await res.text()) || res.statusText}`); } -} -function ensureCorrectWireFormat(response: Response, onlySupport?: WireFormat): WireFormat { - const contentType = response.headers.get("content-type"); + const contentType = res.headers.get("content-type"); if (contentType === null) { throw Error("No Content-Type header found in response"); } - const mediaType = parseContentTypeHeader(contentType); - if (mediaType === null) { - throw Error(`Unsupported response media type: ${contentType.split(";", 1)[0]}`); - } - - const wireFormat = getWireFormat(mediaType); - - if (onlySupport !== undefined && wireFormat !== onlySupport) { - throw Error(`Method only supports ${onlySupport} responses`); - } - - return wireFormat; -} - -enum WireFormat { - json = "json", - text = "text", -} - -enum MediaType { - json = "application/json", - text = "text/plain", -} + const mediaType = contentType.split(";", 1)[0].trim().toLowerCase(); -function getWireFormat(mediaType: MediaType): WireFormat { - switch (mediaType) { - case MediaType.json: - return WireFormat.json; - case MediaType.text: - return WireFormat.text; + if (!supportedMediaTypes.includes(mediaType as MediaType)) { + throw Error(`Unsupported response media type: ${mediaType}`); } -} - -const supportedMediaTypes = Object.values(MediaType); -function isSupportedMediaType(mediaType: string | null): mediaType is MediaType { - return mediaType !== null && supportedMediaTypes.includes(mediaType as MediaType); -} - -function parseContentTypeHeader(contentType?: string): MediaType | null { - if (!contentType) { - return null; + try { + return JSON.parse(await res.text()) as T; + } catch { + throw Error("Invalid json response"); } - - const mediaType = contentType.split(";", 1)[0].trim().toLowerCase(); - - return isSupportedMediaType(mediaType) ? mediaType : null; } function serializerSignableMessagePayload(config: BeaconConfig, payload: SignableMessage): Record { From 2b8e722943896f0d6f0eeec314f84b5c4e6cf259 Mon Sep 17 00:00:00 2001 From: cnupy Date: Thu, 4 Apr 2024 07:39:25 +0000 Subject: [PATCH 11/19] fix: remove forgotten check in externalSignerUpCheck function --- packages/validator/src/util/externalSignerClient.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 1707e6e26112..2b3f74a83559 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -169,10 +169,6 @@ export async function externalSignerUpCheck(remoteUrl: string): Promise headers: {Accept: MediaType.json}, }); - if (!res.ok) { - throw Error(`${(await res.text()) || res.statusText}`); - } - const data = await handleExternalSignerResponse<{status: string}>(res); return data.status === "OK"; } From 2696ea8a63ce430ee2ee41f23fb3b6427df1d235 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Thu, 4 Apr 2024 13:05:01 +0100 Subject: [PATCH 12/19] Simplify checking response media type --- packages/validator/src/util/externalSignerClient.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 2b3f74a83559..b53a9ad146f4 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -105,8 +105,6 @@ enum MediaType { json = "application/json", } -const supportedMediaTypes = Object.values(MediaType); - /** * Return public keys from the server. */ @@ -185,7 +183,7 @@ async function handleExternalSignerResponse(res: Response): Promise { const mediaType = contentType.split(";", 1)[0].trim().toLowerCase(); - if (!supportedMediaTypes.includes(mediaType as MediaType)) { + if (mediaType !== MediaType.json) { throw Error(`Unsupported response media type: ${mediaType}`); } From 12b7bd95368d4f1e13b124e61e64c489253bc0be Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Thu, 4 Apr 2024 13:07:30 +0100 Subject: [PATCH 13/19] Include json parse error message in thrown Error --- packages/validator/src/util/externalSignerClient.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index b53a9ad146f4..9fe422c55fd0 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -188,9 +188,9 @@ async function handleExternalSignerResponse(res: Response): Promise { } try { - return JSON.parse(await res.text()) as T; - } catch { - throw Error("Invalid json response"); + return JSON.parse(await res.json()) as T; + } catch (e) { + throw Error(`Invalid json response: ${(e as Error).message}`); } } From 4364c8baff784abe4c57b0f7aa7d9c99cec02529 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Thu, 4 Apr 2024 13:15:41 +0100 Subject: [PATCH 14/19] Remove unnecessary string cast of err body --- packages/validator/src/util/externalSignerClient.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 9fe422c55fd0..5d0f852c9e1e 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -173,7 +173,8 @@ export async function externalSignerUpCheck(remoteUrl: string): Promise async function handleExternalSignerResponse(res: Response): Promise { if (!res.ok) { - throw Error(`${(await res.text()) || res.statusText}`); + const errBody = await res.text(); + throw Error(errBody || res.statusText); } const contentType = res.headers.get("content-type"); From bec5c5b1bd02022d7b5b199915e678a47c5e2bc5 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Thu, 4 Apr 2024 13:30:15 +0100 Subject: [PATCH 15/19] Fix json parsing --- packages/validator/src/util/externalSignerClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 5d0f852c9e1e..bb6659aade86 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -189,7 +189,7 @@ async function handleExternalSignerResponse(res: Response): Promise { } try { - return JSON.parse(await res.json()) as T; + return (await res.json()) as T; } catch (e) { throw Error(`Invalid json response: ${(e as Error).message}`); } From c3f1aa34b57ececa2d4787c2f4232a7c2d0a5e91 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Thu, 4 Apr 2024 13:51:01 +0100 Subject: [PATCH 16/19] More robust error handling --- .../validator/src/util/externalSignerClient.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index bb6659aade86..624142f3baac 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -174,7 +174,7 @@ export async function externalSignerUpCheck(remoteUrl: string): Promise async function handleExternalSignerResponse(res: Response): Promise { if (!res.ok) { const errBody = await res.text(); - throw Error(errBody || res.statusText); + throw Error(errBody ? getErrorMessage(errBody) : res.statusText); } const contentType = res.headers.get("content-type"); @@ -195,6 +195,19 @@ async function handleExternalSignerResponse(res: Response): Promise { } } +function getErrorMessage(errBody: string): string { + try { + const errJson = JSON.parse(errBody) as {message: string}; + if (errJson.message) { + return errJson.message; + } else { + return errBody; + } + } catch (e) { + return errBody; + } +} + function serializerSignableMessagePayload(config: BeaconConfig, payload: SignableMessage): Record { switch (payload.type) { case SignableMessageType.AGGREGATION_SLOT: From 3100d077dafc63576c049d57affb3e50ef60e3e9 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Thu, 4 Apr 2024 14:14:18 +0100 Subject: [PATCH 17/19] Formatting --- packages/validator/src/util/externalSignerClient.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 624142f3baac..59aff9278388 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -183,7 +183,6 @@ async function handleExternalSignerResponse(res: Response): Promise { } const mediaType = contentType.split(";", 1)[0].trim().toLowerCase(); - if (mediaType !== MediaType.json) { throw Error(`Unsupported response media type: ${mediaType}`); } From 127909d62e83a46b167e754fcf9393f98e12d5c4 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Thu, 4 Apr 2024 14:21:12 +0100 Subject: [PATCH 18/19] Simplify err body message parser --- packages/validator/src/util/externalSignerClient.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 59aff9278388..7cd01c81ff23 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -196,12 +196,8 @@ async function handleExternalSignerResponse(res: Response): Promise { function getErrorMessage(errBody: string): string { try { - const errJson = JSON.parse(errBody) as {message: string}; - if (errJson.message) { - return errJson.message; - } else { - return errBody; - } + const errJson = JSON.parse(errBody) as {message?: string}; + return errJson.message ?? errBody; } catch (e) { return errBody; } From facf88c76345e237a76d24328183de70ad28af73 Mon Sep 17 00:00:00 2001 From: Nico Flaig Date: Thu, 4 Apr 2024 14:32:40 +0100 Subject: [PATCH 19/19] Revert error handling changes --- packages/validator/src/util/externalSignerClient.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/packages/validator/src/util/externalSignerClient.ts b/packages/validator/src/util/externalSignerClient.ts index 7cd01c81ff23..374da79b7989 100644 --- a/packages/validator/src/util/externalSignerClient.ts +++ b/packages/validator/src/util/externalSignerClient.ts @@ -174,7 +174,7 @@ export async function externalSignerUpCheck(remoteUrl: string): Promise async function handleExternalSignerResponse(res: Response): Promise { if (!res.ok) { const errBody = await res.text(); - throw Error(errBody ? getErrorMessage(errBody) : res.statusText); + throw Error(errBody || res.statusText); } const contentType = res.headers.get("content-type"); @@ -194,15 +194,6 @@ async function handleExternalSignerResponse(res: Response): Promise { } } -function getErrorMessage(errBody: string): string { - try { - const errJson = JSON.parse(errBody) as {message?: string}; - return errJson.message ?? errBody; - } catch (e) { - return errBody; - } -} - function serializerSignableMessagePayload(config: BeaconConfig, payload: SignableMessage): Record { switch (payload.type) { case SignableMessageType.AGGREGATION_SLOT: