@lodestar/validator 1.49.0-dev.d4c0ee61ef → 1.49.0-dev.ee3c432d85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/slashingProtection/interchange/errors.d.ts +5 -1
- package/lib/slashingProtection/interchange/errors.d.ts.map +1 -1
- package/lib/slashingProtection/interchange/errors.js +1 -0
- package/lib/slashingProtection/interchange/errors.js.map +1 -1
- package/lib/slashingProtection/interchange/formats/completeV4.js +4 -4
- package/lib/slashingProtection/interchange/formats/completeV4.js.map +1 -1
- package/lib/slashingProtection/interchange/formats/v5.js +4 -4
- package/lib/slashingProtection/interchange/formats/v5.js.map +1 -1
- package/lib/slashingProtection/utils.d.ts +5 -1
- package/lib/slashingProtection/utils.d.ts.map +1 -1
- package/lib/slashingProtection/utils.js +11 -0
- package/lib/slashingProtection/utils.js.map +1 -1
- package/package.json +12 -12
- package/src/slashingProtection/interchange/errors.ts +3 -1
- package/src/slashingProtection/interchange/formats/completeV4.ts +4 -4
- package/src/slashingProtection/interchange/formats/v5.ts +4 -4
- package/src/slashingProtection/utils.ts +12 -0
|
@@ -3,7 +3,8 @@ import { LodestarError } from "@lodestar/utils";
|
|
|
3
3
|
export declare enum InterchangeErrorErrorCode {
|
|
4
4
|
UNSUPPORTED_FORMAT = "ERR_INTERCHANGE_UNSUPPORTED_FORMAT",
|
|
5
5
|
UNSUPPORTED_VERSION = "ERR_INTERCHANGE_UNSUPPORTED_VERSION",
|
|
6
|
-
GENESIS_VALIDATOR_MISMATCH = "ERR_INTERCHANGE_GENESIS_VALIDATOR_MISMATCH"
|
|
6
|
+
GENESIS_VALIDATOR_MISMATCH = "ERR_INTERCHANGE_GENESIS_VALIDATOR_MISMATCH",
|
|
7
|
+
INVALID_VALUE = "ERR_INTERCHANGE_INVALID_VALUE"
|
|
7
8
|
}
|
|
8
9
|
type InterchangeErrorErrorType = {
|
|
9
10
|
code: InterchangeErrorErrorCode.UNSUPPORTED_FORMAT;
|
|
@@ -15,6 +16,9 @@ type InterchangeErrorErrorType = {
|
|
|
15
16
|
code: InterchangeErrorErrorCode.GENESIS_VALIDATOR_MISMATCH;
|
|
16
17
|
root: Root;
|
|
17
18
|
expectedRoot: Root;
|
|
19
|
+
} | {
|
|
20
|
+
code: InterchangeErrorErrorCode.INVALID_VALUE;
|
|
21
|
+
value: string;
|
|
18
22
|
};
|
|
19
23
|
export declare class InterchangeError extends LodestarError<InterchangeErrorErrorType> {
|
|
20
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/slashingProtection/interchange/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,oBAAY,yBAAyB;IACnC,kBAAkB,uCAAuC;IACzD,mBAAmB,wCAAwC;IAC3D,0BAA0B,+CAA+C;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/slashingProtection/interchange/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,oBAAY,yBAAyB;IACnC,kBAAkB,uCAAuC;IACzD,mBAAmB,wCAAwC;IAC3D,0BAA0B,+CAA+C;IACzE,aAAa,kCAAkC;CAChD;AAED,KAAK,yBAAyB,GAC1B;IAAC,IAAI,EAAE,yBAAyB,CAAC,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,GACpE;IAAC,IAAI,EAAE,yBAAyB,CAAC,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GACtE;IAAC,IAAI,EAAE,yBAAyB,CAAC,0BAA0B,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,YAAY,EAAE,IAAI,CAAA;CAAC,GAC5F;IAAC,IAAI,EAAE,yBAAyB,CAAC,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAC;AAEnE,qBAAa,gBAAiB,SAAQ,aAAa,CAAC,yBAAyB,CAAC;CAAG"}
|
|
@@ -4,6 +4,7 @@ export var InterchangeErrorErrorCode;
|
|
|
4
4
|
InterchangeErrorErrorCode["UNSUPPORTED_FORMAT"] = "ERR_INTERCHANGE_UNSUPPORTED_FORMAT";
|
|
5
5
|
InterchangeErrorErrorCode["UNSUPPORTED_VERSION"] = "ERR_INTERCHANGE_UNSUPPORTED_VERSION";
|
|
6
6
|
InterchangeErrorErrorCode["GENESIS_VALIDATOR_MISMATCH"] = "ERR_INTERCHANGE_GENESIS_VALIDATOR_MISMATCH";
|
|
7
|
+
InterchangeErrorErrorCode["INVALID_VALUE"] = "ERR_INTERCHANGE_INVALID_VALUE";
|
|
7
8
|
})(InterchangeErrorErrorCode || (InterchangeErrorErrorCode = {}));
|
|
8
9
|
export class InterchangeError extends LodestarError {
|
|
9
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/slashingProtection/interchange/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/slashingProtection/interchange/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAN,IAAY,yBAKX;AALD,WAAY,yBAAyB;IACnC,sFAAyD,CAAA;IACzD,wFAA2D,CAAA;IAC3D,sGAAyE,CAAA;IACzE,4EAA+C,CAAA;AACjD,CAAC,EALW,yBAAyB,KAAzB,yBAAyB,QAKpC;AAQD,MAAM,OAAO,gBAAiB,SAAQ,aAAwC;CAAG"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fromHex, toPubkeyHex, toRootHex } from "@lodestar/utils";
|
|
2
|
-
import { fromOptionalHexString, numToString, toOptionalHexString } from "../../utils.js";
|
|
2
|
+
import { fromOptionalHexString, numToString, stringToNum, toOptionalHexString } from "../../utils.js";
|
|
3
3
|
export function serializeInterchangeCompleteV4({ data, genesisValidatorsRoot, }) {
|
|
4
4
|
return {
|
|
5
5
|
metadata: {
|
|
@@ -27,12 +27,12 @@ export function parseInterchangeCompleteV4(interchange) {
|
|
|
27
27
|
data: interchange.data.map((validator) => ({
|
|
28
28
|
pubkey: fromHex(validator.pubkey),
|
|
29
29
|
signedBlocks: validator.signed_blocks.map((block) => ({
|
|
30
|
-
slot:
|
|
30
|
+
slot: stringToNum(block.slot),
|
|
31
31
|
signingRoot: fromOptionalHexString(block.signing_root),
|
|
32
32
|
})),
|
|
33
33
|
signedAttestations: validator.signed_attestations.map((att) => ({
|
|
34
|
-
sourceEpoch:
|
|
35
|
-
targetEpoch:
|
|
34
|
+
sourceEpoch: stringToNum(att.source_epoch),
|
|
35
|
+
targetEpoch: stringToNum(att.target_epoch),
|
|
36
36
|
signingRoot: fromOptionalHexString(att.signing_root),
|
|
37
37
|
})),
|
|
38
38
|
})),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completeV4.js","sourceRoot":"","sources":["../../../../src/slashingProtection/interchange/formats/completeV4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAC,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"completeV4.js","sourceRoot":"","sources":["../../../../src/slashingProtection/interchange/formats/completeV4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAC,qBAAqB,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAC,MAAM,gBAAgB,CAAC;AAkFpG,MAAM,UAAU,8BAA8B,CAAC,EAC7C,IAAI,EACJ,qBAAqB,GACD;IACpB,OAAO;QACL,QAAQ,EAAE;YACR,kBAAkB,EAAE,UAAU;YAC9B,0BAA0B,EAAE,GAAG;YAC/B,uBAAuB,EAAE,SAAS,CAAC,qBAAqB,CAAC;SAC1D;QACD,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC7B,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC;YACrC,aAAa,EAAE,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,YAAY,EAAE,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC;aACrD,CAAC,CAAC;YACH,mBAAmB,EAAE,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC9D,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC1C,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC1C,YAAY,EAAE,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC;aACnD,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,WAAkC;IAC3E,OAAO;QACL,qBAAqB,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC5E,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;YACjC,YAAY,EAAE,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,WAAW,EAAE,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC;aACvD,CAAC,CAAC;YACH,kBAAkB,EAAE,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC9D,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC1C,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC1C,WAAW,EAAE,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC;aACrD,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fromHex, toPubkeyHex, toRootHex } from "@lodestar/utils";
|
|
2
|
-
import { fromOptionalHexString, numToString, toOptionalHexString } from "../../utils.js";
|
|
2
|
+
import { fromOptionalHexString, numToString, stringToNum, toOptionalHexString } from "../../utils.js";
|
|
3
3
|
export function serializeInterchangeV5({ data, genesisValidatorsRoot }) {
|
|
4
4
|
return {
|
|
5
5
|
metadata: {
|
|
@@ -26,12 +26,12 @@ export function parseInterchangeV5(interchange) {
|
|
|
26
26
|
data: interchange.data.map((validator) => ({
|
|
27
27
|
pubkey: fromHex(validator.pubkey),
|
|
28
28
|
signedBlocks: validator.signed_blocks.map((block) => ({
|
|
29
|
-
slot:
|
|
29
|
+
slot: stringToNum(block.slot),
|
|
30
30
|
signingRoot: fromOptionalHexString(block.signing_root),
|
|
31
31
|
})),
|
|
32
32
|
signedAttestations: validator.signed_attestations.map((att) => ({
|
|
33
|
-
sourceEpoch:
|
|
34
|
-
targetEpoch:
|
|
33
|
+
sourceEpoch: stringToNum(att.source_epoch),
|
|
34
|
+
targetEpoch: stringToNum(att.target_epoch),
|
|
35
35
|
signingRoot: fromOptionalHexString(att.signing_root),
|
|
36
36
|
})),
|
|
37
37
|
})),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v5.js","sourceRoot":"","sources":["../../../../src/slashingProtection/interchange/formats/v5.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAC,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"v5.js","sourceRoot":"","sources":["../../../../src/slashingProtection/interchange/formats/v5.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAC,qBAAqB,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAC,MAAM,gBAAgB,CAAC;AAiFpG,MAAM,UAAU,sBAAsB,CAAC,EAAC,IAAI,EAAE,qBAAqB,EAAsB;IACvF,OAAO;QACL,QAAQ,EAAE;YACR,0BAA0B,EAAE,GAAG;YAC/B,uBAAuB,EAAE,SAAS,CAAC,qBAAqB,CAAC;SAC1D;QACD,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC7B,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC;YACrC,aAAa,EAAE,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,YAAY,EAAE,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC;aACrD,CAAC,CAAC;YACH,mBAAmB,EAAE,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC9D,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC1C,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC1C,YAAY,EAAE,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC;aACnD,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAA0B;IAC3D,OAAO;QACL,qBAAqB,EAAE,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC5E,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;YACjC,YAAY,EAAE,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,WAAW,EAAE,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC;aACvD,CAAC,CAAC;YACH,kBAAkB,EAAE,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC9D,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC1C,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC1C,WAAW,EAAE,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC;aACrD,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Epoch, Root } from "@lodestar/types";
|
|
2
2
|
export declare const blsPubkeyLen = 48;
|
|
3
|
-
export declare const ZERO_ROOT: import("@chainsafe/ssz/lib/type/byteArray").ByteArray;
|
|
3
|
+
export declare const ZERO_ROOT: import("@chainsafe/ssz/lib/type/byteArray.js").ByteArray;
|
|
4
4
|
export declare function isEqualRoot(root1: Root, root2: Root): boolean;
|
|
5
5
|
export declare function isEqualNonZeroRoot(root1: Root, root2: Root): boolean;
|
|
6
6
|
export declare function fromOptionalHexString(hex: string | undefined): Root;
|
|
@@ -9,6 +9,10 @@ export declare function toOptionalHexString(root: Root): string | undefined;
|
|
|
9
9
|
* Typesafe wrapper around `String()`. The String constructor accepts any which is dangerous
|
|
10
10
|
*/
|
|
11
11
|
export declare function numToString(num: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* Parse a decimal uint string, rejecting values the slashing protection DB range scans cannot see
|
|
14
|
+
*/
|
|
15
|
+
export declare function stringToNum(str: string): number;
|
|
12
16
|
export declare function minEpoch(epochs: Epoch[]): Epoch | null;
|
|
13
17
|
export declare function uniqueVectorArr(buffers: Uint8Array[]): Uint8Array[];
|
|
14
18
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/slashingProtection/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,IAAI,EAAM,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/slashingProtection/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,IAAI,EAAM,MAAM,iBAAiB,CAAC;AAIjD,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,SAAS,0DAA0B,CAAC;AAEjD,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAEpE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEnE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,IAAI,CAEtD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAQnE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ssz } from "@lodestar/types";
|
|
2
2
|
import { fromHex, toHex, toRootHex } from "@lodestar/utils";
|
|
3
|
+
import { InterchangeError, InterchangeErrorErrorCode } from "./interchange/errors.js";
|
|
3
4
|
export const blsPubkeyLen = 48;
|
|
4
5
|
export const ZERO_ROOT = ssz.Root.defaultValue();
|
|
5
6
|
export function isEqualRoot(root1, root2) {
|
|
@@ -20,6 +21,16 @@ export function toOptionalHexString(root) {
|
|
|
20
21
|
export function numToString(num) {
|
|
21
22
|
return String(num);
|
|
22
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse a decimal uint string, rejecting values the slashing protection DB range scans cannot see
|
|
26
|
+
*/
|
|
27
|
+
export function stringToNum(str) {
|
|
28
|
+
const num = Number(str);
|
|
29
|
+
if (!/^[0-9]+$/.test(str) || num >= Number.MAX_SAFE_INTEGER) {
|
|
30
|
+
throw new InterchangeError({ code: InterchangeErrorErrorCode.INVALID_VALUE, value: str });
|
|
31
|
+
}
|
|
32
|
+
return num;
|
|
33
|
+
}
|
|
23
34
|
export function minEpoch(epochs) {
|
|
24
35
|
return epochs.length > 0 ? epochs.reduce((minEpoch, epoch) => (minEpoch < epoch ? minEpoch : epoch)) : null;
|
|
25
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/slashingProtection/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/slashingProtection/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,GAAG,EAAC,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAC,gBAAgB,EAAE,yBAAyB,EAAC,MAAM,yBAAyB,CAAC;AAEpF,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAC/B,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AAEjD,MAAM,UAAU,WAAW,CAAC,KAAW,EAAE,KAAW;IAClD,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAW,EAAE,KAAW;IACzD,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAuB;IAC3D,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAU;IAC5C,OAAO,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5D,MAAM,IAAI,gBAAgB,CAAC,EAAC,IAAI,EAAE,yBAAyB,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAe;IACtC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAqB;IACnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodestar/validator",
|
|
3
|
-
"version": "1.49.0-dev.
|
|
3
|
+
"version": "1.49.0-dev.ee3c432d85",
|
|
4
4
|
"description": "A Typescript implementation of the validator client",
|
|
5
5
|
"author": "ChainSafe Systems",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -50,21 +50,21 @@
|
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@chainsafe/lodestar-z": "catalog:",
|
|
52
52
|
"@chainsafe/ssz": "^1.8.0",
|
|
53
|
-
"@lodestar/api": "^1.49.0-dev.
|
|
54
|
-
"@lodestar/config": "^1.49.0-dev.
|
|
55
|
-
"@lodestar/db": "^1.49.0-dev.
|
|
56
|
-
"@lodestar/params": "^1.49.0-dev.
|
|
57
|
-
"@lodestar/state-transition": "^1.49.0-dev.
|
|
58
|
-
"@lodestar/types": "^1.49.0-dev.
|
|
59
|
-
"@lodestar/utils": "^1.49.0-dev.
|
|
53
|
+
"@lodestar/api": "^1.49.0-dev.ee3c432d85",
|
|
54
|
+
"@lodestar/config": "^1.49.0-dev.ee3c432d85",
|
|
55
|
+
"@lodestar/db": "^1.49.0-dev.ee3c432d85",
|
|
56
|
+
"@lodestar/params": "^1.49.0-dev.ee3c432d85",
|
|
57
|
+
"@lodestar/state-transition": "^1.49.0-dev.ee3c432d85",
|
|
58
|
+
"@lodestar/types": "^1.49.0-dev.ee3c432d85",
|
|
59
|
+
"@lodestar/utils": "^1.49.0-dev.ee3c432d85",
|
|
60
60
|
"strict-event-emitter-types": "^2.0.0"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
|
-
"@lodestar/logger": "^1.49.0-dev.
|
|
64
|
-
"@lodestar/spec-test-util": "^1.49.0-dev.
|
|
65
|
-
"@lodestar/test-utils": "^1.49.0-dev.
|
|
63
|
+
"@lodestar/logger": "^1.49.0-dev.ee3c432d85",
|
|
64
|
+
"@lodestar/spec-test-util": "^1.49.0-dev.ee3c432d85",
|
|
65
|
+
"@lodestar/test-utils": "^1.49.0-dev.ee3c432d85",
|
|
66
66
|
"@vekexasia/bigint-buffer2": "^1.1.1",
|
|
67
67
|
"rimraf": "^4.4.1"
|
|
68
68
|
},
|
|
69
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "8dbcf2422471d60bf8784f70a337b129bd27e90f"
|
|
70
70
|
}
|
|
@@ -5,11 +5,13 @@ export enum InterchangeErrorErrorCode {
|
|
|
5
5
|
UNSUPPORTED_FORMAT = "ERR_INTERCHANGE_UNSUPPORTED_FORMAT",
|
|
6
6
|
UNSUPPORTED_VERSION = "ERR_INTERCHANGE_UNSUPPORTED_VERSION",
|
|
7
7
|
GENESIS_VALIDATOR_MISMATCH = "ERR_INTERCHANGE_GENESIS_VALIDATOR_MISMATCH",
|
|
8
|
+
INVALID_VALUE = "ERR_INTERCHANGE_INVALID_VALUE",
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
type InterchangeErrorErrorType =
|
|
11
12
|
| {code: InterchangeErrorErrorCode.UNSUPPORTED_FORMAT; format: string}
|
|
12
13
|
| {code: InterchangeErrorErrorCode.UNSUPPORTED_VERSION; version: string}
|
|
13
|
-
| {code: InterchangeErrorErrorCode.GENESIS_VALIDATOR_MISMATCH; root: Root; expectedRoot: Root}
|
|
14
|
+
| {code: InterchangeErrorErrorCode.GENESIS_VALIDATOR_MISMATCH; root: Root; expectedRoot: Root}
|
|
15
|
+
| {code: InterchangeErrorErrorCode.INVALID_VALUE; value: string};
|
|
14
16
|
|
|
15
17
|
export class InterchangeError extends LodestarError<InterchangeErrorErrorType> {}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {fromHex, toPubkeyHex, toRootHex} from "@lodestar/utils";
|
|
2
|
-
import {fromOptionalHexString, numToString, toOptionalHexString} from "../../utils.js";
|
|
2
|
+
import {fromOptionalHexString, numToString, stringToNum, toOptionalHexString} from "../../utils.js";
|
|
3
3
|
import {InterchangeLodestar} from "../types.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -112,12 +112,12 @@ export function parseInterchangeCompleteV4(interchange: InterchangeCompleteV4):
|
|
|
112
112
|
data: interchange.data.map((validator) => ({
|
|
113
113
|
pubkey: fromHex(validator.pubkey),
|
|
114
114
|
signedBlocks: validator.signed_blocks.map((block) => ({
|
|
115
|
-
slot:
|
|
115
|
+
slot: stringToNum(block.slot),
|
|
116
116
|
signingRoot: fromOptionalHexString(block.signing_root),
|
|
117
117
|
})),
|
|
118
118
|
signedAttestations: validator.signed_attestations.map((att) => ({
|
|
119
|
-
sourceEpoch:
|
|
120
|
-
targetEpoch:
|
|
119
|
+
sourceEpoch: stringToNum(att.source_epoch),
|
|
120
|
+
targetEpoch: stringToNum(att.target_epoch),
|
|
121
121
|
signingRoot: fromOptionalHexString(att.signing_root),
|
|
122
122
|
})),
|
|
123
123
|
})),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {fromHex, toPubkeyHex, toRootHex} from "@lodestar/utils";
|
|
2
|
-
import {fromOptionalHexString, numToString, toOptionalHexString} from "../../utils.js";
|
|
2
|
+
import {fromOptionalHexString, numToString, stringToNum, toOptionalHexString} from "../../utils.js";
|
|
3
3
|
import {InterchangeLodestar} from "../types.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -107,12 +107,12 @@ export function parseInterchangeV5(interchange: InterchangeV5): InterchangeLodes
|
|
|
107
107
|
data: interchange.data.map((validator) => ({
|
|
108
108
|
pubkey: fromHex(validator.pubkey),
|
|
109
109
|
signedBlocks: validator.signed_blocks.map((block) => ({
|
|
110
|
-
slot:
|
|
110
|
+
slot: stringToNum(block.slot),
|
|
111
111
|
signingRoot: fromOptionalHexString(block.signing_root),
|
|
112
112
|
})),
|
|
113
113
|
signedAttestations: validator.signed_attestations.map((att) => ({
|
|
114
|
-
sourceEpoch:
|
|
115
|
-
targetEpoch:
|
|
114
|
+
sourceEpoch: stringToNum(att.source_epoch),
|
|
115
|
+
targetEpoch: stringToNum(att.target_epoch),
|
|
116
116
|
signingRoot: fromOptionalHexString(att.signing_root),
|
|
117
117
|
})),
|
|
118
118
|
})),
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {Epoch, Root, ssz} from "@lodestar/types";
|
|
2
2
|
import {fromHex, toHex, toRootHex} from "@lodestar/utils";
|
|
3
|
+
import {InterchangeError, InterchangeErrorErrorCode} from "./interchange/errors.js";
|
|
3
4
|
|
|
4
5
|
export const blsPubkeyLen = 48;
|
|
5
6
|
export const ZERO_ROOT = ssz.Root.defaultValue();
|
|
@@ -27,6 +28,17 @@ export function numToString(num: number): string {
|
|
|
27
28
|
return String(num);
|
|
28
29
|
}
|
|
29
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Parse a decimal uint string, rejecting values the slashing protection DB range scans cannot see
|
|
33
|
+
*/
|
|
34
|
+
export function stringToNum(str: string): number {
|
|
35
|
+
const num = Number(str);
|
|
36
|
+
if (!/^[0-9]+$/.test(str) || num >= Number.MAX_SAFE_INTEGER) {
|
|
37
|
+
throw new InterchangeError({code: InterchangeErrorErrorCode.INVALID_VALUE, value: str});
|
|
38
|
+
}
|
|
39
|
+
return num;
|
|
40
|
+
}
|
|
41
|
+
|
|
30
42
|
export function minEpoch(epochs: Epoch[]): Epoch | null {
|
|
31
43
|
return epochs.length > 0 ? epochs.reduce((minEpoch, epoch) => (minEpoch < epoch ? minEpoch : epoch)) : null;
|
|
32
44
|
}
|