@aztec/validator-ha-signer 0.0.1-commit.a072138 → 0.0.1-commit.a89ec08
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/README.md +10 -0
- package/dest/config.d.ts +23 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +19 -0
- package/dest/db/in_memory.d.ts +20 -0
- package/dest/db/in_memory.d.ts.map +1 -0
- package/dest/db/in_memory.js +73 -0
- package/dest/db/postgres.d.ts +17 -3
- package/dest/db/postgres.d.ts.map +1 -1
- package/dest/db/postgres.js +32 -5
- package/dest/db/schema.d.ts +17 -10
- package/dest/db/schema.d.ts.map +1 -1
- package/dest/db/schema.js +39 -22
- package/dest/db/types.d.ts +7 -2
- package/dest/db/types.d.ts.map +1 -1
- package/dest/factory.d.ts +14 -1
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +25 -0
- package/dest/slashing_protection_service.d.ts +8 -4
- package/dest/slashing_protection_service.d.ts.map +1 -1
- package/dest/slashing_protection_service.js +43 -14
- package/dest/types.d.ts +18 -5
- package/dest/types.d.ts.map +1 -1
- package/dest/validator_ha_signer.d.ts +4 -3
- package/dest/validator_ha_signer.d.ts.map +1 -1
- package/dest/validator_ha_signer.js +8 -3
- package/package.json +3 -2
- package/src/config.ts +24 -0
- package/src/db/in_memory.ts +107 -0
- package/src/db/postgres.ts +33 -2
- package/src/db/schema.ts +41 -22
- package/src/db/types.ts +6 -1
- package/src/factory.ts +32 -0
- package/src/slashing_protection_service.ts +54 -17
- package/src/types.ts +19 -0
- package/src/validator_ha_signer.ts +8 -3
package/dest/db/schema.js
CHANGED
|
@@ -11,12 +11,13 @@
|
|
|
11
11
|
* SQL to create the validator_duties table
|
|
12
12
|
*/ export const CREATE_VALIDATOR_DUTIES_TABLE = `
|
|
13
13
|
CREATE TABLE IF NOT EXISTS validator_duties (
|
|
14
|
+
rollup_address VARCHAR(42) NOT NULL,
|
|
14
15
|
validator_address VARCHAR(42) NOT NULL,
|
|
15
16
|
slot BIGINT NOT NULL,
|
|
16
17
|
block_number BIGINT NOT NULL,
|
|
17
18
|
block_index_within_checkpoint INTEGER NOT NULL DEFAULT 0,
|
|
18
19
|
duty_type VARCHAR(30) NOT NULL CHECK (duty_type IN ('BLOCK_PROPOSAL', 'CHECKPOINT_PROPOSAL', 'ATTESTATION', 'ATTESTATIONS_AND_SIGNERS', 'GOVERNANCE_VOTE', 'SLASHING_VOTE')),
|
|
19
|
-
status VARCHAR(20) NOT NULL CHECK (status IN ('signing', 'signed'
|
|
20
|
+
status VARCHAR(20) NOT NULL CHECK (status IN ('signing', 'signed')),
|
|
20
21
|
message_hash VARCHAR(66) NOT NULL,
|
|
21
22
|
signature VARCHAR(132),
|
|
22
23
|
node_id VARCHAR(255) NOT NULL,
|
|
@@ -25,7 +26,7 @@ CREATE TABLE IF NOT EXISTS validator_duties (
|
|
|
25
26
|
completed_at TIMESTAMP,
|
|
26
27
|
error_message TEXT,
|
|
27
28
|
|
|
28
|
-
PRIMARY KEY (validator_address, slot, duty_type, block_index_within_checkpoint),
|
|
29
|
+
PRIMARY KEY (rollup_address, validator_address, slot, duty_type, block_index_within_checkpoint),
|
|
29
30
|
CHECK (completed_at IS NULL OR completed_at >= started_at)
|
|
30
31
|
);
|
|
31
32
|
`;
|
|
@@ -82,6 +83,7 @@ SELECT version FROM schema_version ORDER BY version DESC LIMIT 1;
|
|
|
82
83
|
*/ export const INSERT_OR_GET_DUTY = `
|
|
83
84
|
WITH inserted AS (
|
|
84
85
|
INSERT INTO validator_duties (
|
|
86
|
+
rollup_address,
|
|
85
87
|
validator_address,
|
|
86
88
|
slot,
|
|
87
89
|
block_number,
|
|
@@ -92,9 +94,10 @@ WITH inserted AS (
|
|
|
92
94
|
node_id,
|
|
93
95
|
lock_token,
|
|
94
96
|
started_at
|
|
95
|
-
) VALUES ($1, $2, $3, $4, $5, 'signing', $
|
|
96
|
-
ON CONFLICT (validator_address, slot, duty_type, block_index_within_checkpoint) DO NOTHING
|
|
97
|
+
) VALUES ($1, $2, $3, $4, $5, $6, 'signing', $7, $8, $9, CURRENT_TIMESTAMP)
|
|
98
|
+
ON CONFLICT (rollup_address, validator_address, slot, duty_type, block_index_within_checkpoint) DO NOTHING
|
|
97
99
|
RETURNING
|
|
100
|
+
rollup_address,
|
|
98
101
|
validator_address,
|
|
99
102
|
slot,
|
|
100
103
|
block_number,
|
|
@@ -113,6 +116,7 @@ WITH inserted AS (
|
|
|
113
116
|
SELECT * FROM inserted
|
|
114
117
|
UNION ALL
|
|
115
118
|
SELECT
|
|
119
|
+
rollup_address,
|
|
116
120
|
validator_address,
|
|
117
121
|
slot,
|
|
118
122
|
block_number,
|
|
@@ -128,10 +132,11 @@ SELECT
|
|
|
128
132
|
error_message,
|
|
129
133
|
FALSE as is_new
|
|
130
134
|
FROM validator_duties
|
|
131
|
-
WHERE
|
|
132
|
-
AND
|
|
133
|
-
AND
|
|
134
|
-
AND
|
|
135
|
+
WHERE rollup_address = $1
|
|
136
|
+
AND validator_address = $2
|
|
137
|
+
AND slot = $3
|
|
138
|
+
AND duty_type = $6
|
|
139
|
+
AND block_index_within_checkpoint = $5
|
|
135
140
|
AND NOT EXISTS (SELECT 1 FROM inserted);
|
|
136
141
|
`;
|
|
137
142
|
/**
|
|
@@ -141,24 +146,26 @@ UPDATE validator_duties
|
|
|
141
146
|
SET status = 'signed',
|
|
142
147
|
signature = $1,
|
|
143
148
|
completed_at = CURRENT_TIMESTAMP
|
|
144
|
-
WHERE
|
|
145
|
-
AND
|
|
146
|
-
AND
|
|
147
|
-
AND
|
|
149
|
+
WHERE rollup_address = $2
|
|
150
|
+
AND validator_address = $3
|
|
151
|
+
AND slot = $4
|
|
152
|
+
AND duty_type = $5
|
|
153
|
+
AND block_index_within_checkpoint = $6
|
|
148
154
|
AND status = 'signing'
|
|
149
|
-
AND lock_token = $
|
|
155
|
+
AND lock_token = $7;
|
|
150
156
|
`;
|
|
151
157
|
/**
|
|
152
158
|
* Query to delete a duty
|
|
153
159
|
* Only deletes if the lockToken matches
|
|
154
160
|
*/ export const DELETE_DUTY = `
|
|
155
161
|
DELETE FROM validator_duties
|
|
156
|
-
WHERE
|
|
157
|
-
AND
|
|
158
|
-
AND
|
|
159
|
-
AND
|
|
162
|
+
WHERE rollup_address = $1
|
|
163
|
+
AND validator_address = $2
|
|
164
|
+
AND slot = $3
|
|
165
|
+
AND duty_type = $4
|
|
166
|
+
AND block_index_within_checkpoint = $5
|
|
160
167
|
AND status = 'signing'
|
|
161
|
-
AND lock_token = $
|
|
168
|
+
AND lock_token = $6;
|
|
162
169
|
`;
|
|
163
170
|
/**
|
|
164
171
|
* Query to clean up old signed duties (for maintenance)
|
|
@@ -170,20 +177,29 @@ WHERE status = 'signed'
|
|
|
170
177
|
`;
|
|
171
178
|
/**
|
|
172
179
|
* Query to clean up old duties (for maintenance)
|
|
173
|
-
* Removes duties older than a specified
|
|
180
|
+
* Removes SIGNED duties older than a specified age (in milliseconds)
|
|
174
181
|
*/ export const CLEANUP_OLD_DUTIES = `
|
|
175
182
|
DELETE FROM validator_duties
|
|
176
|
-
WHERE status
|
|
177
|
-
AND started_at < $1;
|
|
183
|
+
WHERE status = 'signed'
|
|
184
|
+
AND started_at < CURRENT_TIMESTAMP - ($1 || ' milliseconds')::INTERVAL;
|
|
178
185
|
`;
|
|
179
186
|
/**
|
|
180
187
|
* Query to cleanup own stuck duties
|
|
181
188
|
* Removes duties in 'signing' status for a specific node that are older than maxAgeMs
|
|
189
|
+
* Uses DB's CURRENT_TIMESTAMP to avoid clock skew issues between nodes
|
|
182
190
|
*/ export const CLEANUP_OWN_STUCK_DUTIES = `
|
|
183
191
|
DELETE FROM validator_duties
|
|
184
192
|
WHERE node_id = $1
|
|
185
193
|
AND status = 'signing'
|
|
186
|
-
AND started_at < $2;
|
|
194
|
+
AND started_at < CURRENT_TIMESTAMP - ($2 || ' milliseconds')::INTERVAL;
|
|
195
|
+
`;
|
|
196
|
+
/**
|
|
197
|
+
* Query to cleanup duties with outdated rollup address
|
|
198
|
+
* Removes all duties where the rollup address doesn't match the current one
|
|
199
|
+
* Used after a rollup upgrade to clean up duties for the old rollup
|
|
200
|
+
*/ export const CLEANUP_OUTDATED_ROLLUP_DUTIES = `
|
|
201
|
+
DELETE FROM validator_duties
|
|
202
|
+
WHERE rollup_address != $1;
|
|
187
203
|
`;
|
|
188
204
|
/**
|
|
189
205
|
* SQL to drop the validator_duties table
|
|
@@ -196,6 +212,7 @@ WHERE node_id = $1
|
|
|
196
212
|
* Returns duties in 'signing' status that have been stuck for too long
|
|
197
213
|
*/ export const GET_STUCK_DUTIES = `
|
|
198
214
|
SELECT
|
|
215
|
+
rollup_address,
|
|
199
216
|
validator_address,
|
|
200
217
|
slot,
|
|
201
218
|
block_number,
|
package/dest/db/types.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type { Signature } from '@aztec/foundation/eth-signature';
|
|
|
5
5
|
* Row type from PostgreSQL query
|
|
6
6
|
*/
|
|
7
7
|
export interface DutyRow {
|
|
8
|
+
rollup_address: string;
|
|
8
9
|
validator_address: string;
|
|
9
10
|
slot: string;
|
|
10
11
|
block_number: string;
|
|
@@ -49,6 +50,8 @@ export declare enum DutyStatus {
|
|
|
49
50
|
* Record of a validator duty in the database
|
|
50
51
|
*/
|
|
51
52
|
export interface ValidatorDutyRecord {
|
|
53
|
+
/** Ethereum address of the rollup contract */
|
|
54
|
+
rollupAddress: EthAddress;
|
|
52
55
|
/** Ethereum address of the validator */
|
|
53
56
|
validatorAddress: EthAddress;
|
|
54
57
|
/** Slot number for this duty */
|
|
@@ -73,7 +76,7 @@ export interface ValidatorDutyRecord {
|
|
|
73
76
|
startedAt: Date;
|
|
74
77
|
/** When the duty signing was completed (success or failure) */
|
|
75
78
|
completedAt?: Date;
|
|
76
|
-
/** Error message
|
|
79
|
+
/** Error message (currently unused) */
|
|
77
80
|
errorMessage?: string;
|
|
78
81
|
}
|
|
79
82
|
/**
|
|
@@ -81,6 +84,7 @@ export interface ValidatorDutyRecord {
|
|
|
81
84
|
* blockIndexWithinCheckpoint is REQUIRED and must be >= 0.
|
|
82
85
|
*/
|
|
83
86
|
export interface BlockProposalDutyIdentifier {
|
|
87
|
+
rollupAddress: EthAddress;
|
|
84
88
|
validatorAddress: EthAddress;
|
|
85
89
|
slot: SlotNumber;
|
|
86
90
|
/** Block index within checkpoint (0, 1, 2...). Required for block proposals. */
|
|
@@ -92,6 +96,7 @@ export interface BlockProposalDutyIdentifier {
|
|
|
92
96
|
* blockIndexWithinCheckpoint is not applicable (internally stored as -1).
|
|
93
97
|
*/
|
|
94
98
|
export interface OtherDutyIdentifier {
|
|
99
|
+
rollupAddress: EthAddress;
|
|
95
100
|
validatorAddress: EthAddress;
|
|
96
101
|
slot: SlotNumber;
|
|
97
102
|
dutyType: DutyType.CHECKPOINT_PROPOSAL | DutyType.ATTESTATION | DutyType.ATTESTATIONS_AND_SIGNERS | DutyType.GOVERNANCE_VOTE | DutyType.SLASHING_VOTE | DutyType.AUTH_REQUEST | DutyType.TXS;
|
|
@@ -158,4 +163,4 @@ interface DeleteDutyExtra {
|
|
|
158
163
|
*/
|
|
159
164
|
export type DeleteDutyParams = DutyIdentifier & DeleteDutyExtra;
|
|
160
165
|
export {};
|
|
161
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEgsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakU7O0dBRUc7QUFDSCxNQUFNLFdBQVcsT0FBTztJQUN0QixjQUFjLEVBQUUsTUFBTSxDQUFDO0lBQ3ZCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztJQUMxQixJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ2IsWUFBWSxFQUFFLE1BQU0sQ0FBQztJQUNyQiw2QkFBNkIsRUFBRSxNQUFNLENBQUM7SUFDdEMsU0FBUyxFQUFFLFFBQVEsQ0FBQztJQUNwQixNQUFNLEVBQUUsVUFBVSxDQUFDO0lBQ25CLFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsU0FBUyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDekIsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUM7SUFDakIsWUFBWSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUM7SUFDMUIsYUFBYSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7Q0FDOUI7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxjQUFlLFNBQVEsT0FBTztJQUM3QyxNQUFNLEVBQUUsT0FBTyxDQUFDO0NBQ2pCO0FBRUQ7O0dBRUc7QUFDSCxvQkFBWSxRQUFRO0lBQ2xCLGNBQWMsbUJBQW1CO0lBQ2pDLG1CQUFtQix3QkFBd0I7SUFDM0MsV0FBVyxnQkFBZ0I7SUFDM0Isd0JBQXdCLDZCQUE2QjtJQUNy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
|
package/dest/db/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACxH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B,EAAE,MAAM,CAAC;IACtC,SAAS,EAAE,QAAQ,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;IACjB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,OAAO;IAC7C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,oBAAY,QAAQ;IAClB,cAAc,mBAAmB;IACjC,mBAAmB,wBAAwB;IAC3C,WAAW,gBAAgB;IAC3B,wBAAwB,6BAA6B;IACrD,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;IAC/B,YAAY,iBAAiB;IAC7B,GAAG,QAAQ;CACZ;AAED;;GAEG;AACH,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,gBAAgB,EAAE,UAAU,CAAC;IAC7B,gCAAgC;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,iCAAiC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,8FAA8F;IAC9F,0BAA0B,EAAE,MAAM,CAAC;IACnC,mCAAmC;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,iCAAiC;IACjC,MAAM,EAAE,UAAU,CAAC;IACnB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,IAAI,CAAC;IAChB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"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"}
|
package/dest/factory.d.ts
CHANGED
|
@@ -39,4 +39,17 @@ export declare function createHASigner(config: ValidatorHASignerConfig, deps?: C
|
|
|
39
39
|
signer: ValidatorHASigner;
|
|
40
40
|
db: SlashingProtectionDatabase;
|
|
41
41
|
}>;
|
|
42
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Create an in-memory SlashingProtectionDatabase that can be shared across
|
|
44
|
+
* multiple validator nodes in the same process. Used for testing HA setups.
|
|
45
|
+
*/
|
|
46
|
+
export declare function createSharedSlashingProtectionDb(): SlashingProtectionDatabase;
|
|
47
|
+
/**
|
|
48
|
+
* Create a ValidatorHASigner backed by a pre-existing SlashingProtectionDatabase.
|
|
49
|
+
* Used for testing HA setups where multiple nodes share the same protection database.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createSignerFromSharedDb(db: SlashingProtectionDatabase, config: Pick<ValidatorHASignerConfig, 'nodeId' | 'pollingIntervalMs' | 'signingTimeoutMs' | 'maxStuckDutiesAgeMs' | 'l1Contracts'>): {
|
|
52
|
+
signer: ValidatorHASigner;
|
|
53
|
+
db: SlashingProtectionDatabase;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHM0QsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDakYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILHdCQUFzQixjQUFjLENBQ2xDLE1BQU0sRUFBRSx1QkFBdUIsRUFDL0IsSUFBSSxDQUFDLEVBQUUsa0JBQWtCLEdBQ3hCLE9BQU8sQ0FBQztJQUNULE1BQU0sRUFBRSxpQkFBaUIsQ0FBQztJQUMxQixFQUFFLEVBQUUsMEJBQTBCLENBQUM7Q0FDaEMsQ0FBQyxDQStCRDtBQUVEOzs7R0FHRztBQUNILHdCQUFnQixnQ0FBZ0MsSUFBSSwwQkFBMEIsQ0FFN0U7QUFFRDs7O0dBR0c7QUFDSCx3QkFBZ0Isd0JBQXdCLENBQ3RDLEVBQUUsRUFBRSwwQkFBMEIsRUFDOUIsTUFBTSxFQUFFLElBQUksQ0FDVix1QkFBdUIsRUFDdkIsUUFBUSxHQUFHLG1CQUFtQixHQUFHLGtCQUFrQixHQUFHLHFCQUFxQixHQUFHLGFBQWEsQ0FDNUYsR0FDQTtJQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQztJQUFDLEVBQUUsRUFBRSwwQkFBMEIsQ0FBQTtDQUFFLENBVy9EIn0=
|
package/dest/factory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAG3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,uBAAuB,EAC/B,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC;IACT,MAAM,EAAE,iBAAiB,CAAC;IAC1B,EAAE,EAAE,0BAA0B,CAAC;CAChC,CAAC,CA+BD;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,IAAI,0BAA0B,CAE7E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,0BAA0B,EAC9B,MAAM,EAAE,IAAI,CACV,uBAAuB,EACvB,QAAQ,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,aAAa,CAC5F,GACA;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,0BAA0B,CAAA;CAAE,CAW/D"}
|
package/dest/factory.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Factory functions for creating validator HA signers
|
|
3
3
|
*/ import { Pool } from 'pg';
|
|
4
|
+
import { InMemorySlashingProtectionDatabase } from './db/in_memory.js';
|
|
4
5
|
import { PostgresSlashingProtectionDatabase } from './db/postgres.js';
|
|
5
6
|
import { ValidatorHASigner } from './validator_ha_signer.js';
|
|
6
7
|
/**
|
|
@@ -68,3 +69,27 @@ import { ValidatorHASigner } from './validator_ha_signer.js';
|
|
|
68
69
|
db
|
|
69
70
|
};
|
|
70
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Create an in-memory SlashingProtectionDatabase that can be shared across
|
|
74
|
+
* multiple validator nodes in the same process. Used for testing HA setups.
|
|
75
|
+
*/ export function createSharedSlashingProtectionDb() {
|
|
76
|
+
return new InMemorySlashingProtectionDatabase();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a ValidatorHASigner backed by a pre-existing SlashingProtectionDatabase.
|
|
80
|
+
* Used for testing HA setups where multiple nodes share the same protection database.
|
|
81
|
+
*/ export function createSignerFromSharedDb(db, config) {
|
|
82
|
+
const signerConfig = {
|
|
83
|
+
haSigningEnabled: true,
|
|
84
|
+
l1Contracts: config.l1Contracts,
|
|
85
|
+
nodeId: config.nodeId || `shared-${Date.now()}`,
|
|
86
|
+
pollingIntervalMs: config.pollingIntervalMs ?? 100,
|
|
87
|
+
signingTimeoutMs: config.signingTimeoutMs ?? 3000,
|
|
88
|
+
maxStuckDutiesAgeMs: config.maxStuckDutiesAgeMs
|
|
89
|
+
};
|
|
90
|
+
const signer = new ValidatorHASigner(db, signerConfig);
|
|
91
|
+
return {
|
|
92
|
+
signer,
|
|
93
|
+
db
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -23,6 +23,7 @@ export declare class SlashingProtectionService {
|
|
|
23
23
|
private readonly signingTimeoutMs;
|
|
24
24
|
private readonly maxStuckDutiesAgeMs;
|
|
25
25
|
private cleanupRunningPromise;
|
|
26
|
+
private lastOldDutiesCleanupAtMs?;
|
|
26
27
|
constructor(db: SlashingProtectionDatabase, config: ValidatorHASignerConfig);
|
|
27
28
|
/**
|
|
28
29
|
* Check if a duty can be performed and acquire the lock if so.
|
|
@@ -33,7 +34,6 @@ export declare class SlashingProtectionService {
|
|
|
33
34
|
* 2. If insert succeeds, we acquired the lock - return the lockToken
|
|
34
35
|
* 3. If a record exists, handle based on status:
|
|
35
36
|
* - SIGNED: Throw appropriate error (already signed or slashing protection)
|
|
36
|
-
* - FAILED: Delete the failed record
|
|
37
37
|
* - SIGNING: Wait and poll until status changes, then handle result
|
|
38
38
|
*
|
|
39
39
|
* @returns The lockToken that must be used for recordSuccess/deleteDuty
|
|
@@ -65,7 +65,11 @@ export declare class SlashingProtectionService {
|
|
|
65
65
|
* Start running tasks.
|
|
66
66
|
* Cleanup runs immediately on start to recover from any previous crashes.
|
|
67
67
|
*/
|
|
68
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Start the background cleanup task.
|
|
70
|
+
* Also performs one-time cleanup of duties with outdated rollup addresses.
|
|
71
|
+
*/
|
|
72
|
+
start(): Promise<void>;
|
|
69
73
|
/**
|
|
70
74
|
* Stop the background cleanup task.
|
|
71
75
|
*/
|
|
@@ -75,6 +79,6 @@ export declare class SlashingProtectionService {
|
|
|
75
79
|
* Should be called after stop() during graceful shutdown.
|
|
76
80
|
*/
|
|
77
81
|
close(): Promise<void>;
|
|
78
|
-
private
|
|
82
|
+
private cleanup;
|
|
79
83
|
}
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hpbmdfcHJvdGVjdGlvbl9zZXJ2aWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2xhc2hpbmdfcHJvdGVjdGlvbl9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE9BQU8sRUFDTCxLQUFLLG9CQUFvQixFQUN6QixLQUFLLGdCQUFnQixFQUVyQixLQUFLLG1CQUFtQixFQUV6QixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEtBQUssRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0Rjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILHFCQUFhLHlCQUF5QjtJQVVsQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7SUFDbkIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0lBVnpCLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFTO0lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQVM7SUFDM0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBUztJQUMxQyxPQUFPLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFTO0lBRTdDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBaUI7SUFDOUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQVM7SUFFMUMsWUFDbUIsRUFBRSxFQUFFLDBCQUEwQixFQUM5QixNQUFNLEVBQUUsdUJBQXVCLEVBU2pEO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDRyxjQUFjLENBQUMsTUFBTSxFQUFFLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FpRWxFO0lBRUQ7Ozs7OztPQU1HO0lBQ0csYUFBYSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBMkJqRTtJQUVEOzs7Ozs7T0FNRztJQUNHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQXdCM0Q7SUFFRDs7T0FFRztJQUNILElBQUksTUFBTSxJQUFJLE1BQU0sQ0FFbkI7SUFFRDs7O09BR0c7SUFDSDs7O09BR0c7SUFDRyxLQUFLLGtCQVdWO0lBRUQ7O09BRUc7SUFDRyxJQUFJLGtCQUdUO0lBRUQ7OztPQUdHO0lBQ0csS0FBSyxrQkFHVjtZQU1hLE9BQU87Q0E2QnRCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slashing_protection_service.d.ts","sourceRoot":"","sources":["../src/slashing_protection_service.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAErB,KAAK,mBAAmB,EAEzB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAEtF;;;;;;;;;;;;;;GAcG;AACH,qBAAa,yBAAyB;
|
|
1
|
+
{"version":3,"file":"slashing_protection_service.d.ts","sourceRoot":"","sources":["../src/slashing_protection_service.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAErB,KAAK,mBAAmB,EAEzB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAEtF;;;;;;;;;;;;;;GAcG;AACH,qBAAa,yBAAyB;IAUlC,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAE7C,OAAO,CAAC,qBAAqB,CAAiB;IAC9C,OAAO,CAAC,wBAAwB,CAAC,CAAS;IAE1C,YACmB,EAAE,EAAE,0BAA0B,EAC9B,MAAM,EAAE,uBAAuB,EASjD;IAED;;;;;;;;;;;;;;OAcG;IACG,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiElE;IAED;;;;;;OAMG;IACG,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CA2BjE;IAED;;;;;;OAMG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAwB3D;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;OAGG;IACH;;;OAGG;IACG,KAAK,kBAWV;IAED;;OAEG;IACG,IAAI,kBAGT;IAED;;;OAGG;IACG,KAAK,kBAGV;YAMa,OAAO;CA6BtB"}
|
|
@@ -30,6 +30,7 @@ import { DutyAlreadySignedError, SlashingProtectionError } from './errors.js';
|
|
|
30
30
|
signingTimeoutMs;
|
|
31
31
|
maxStuckDutiesAgeMs;
|
|
32
32
|
cleanupRunningPromise;
|
|
33
|
+
lastOldDutiesCleanupAtMs;
|
|
33
34
|
constructor(db, config){
|
|
34
35
|
this.db = db;
|
|
35
36
|
this.config = config;
|
|
@@ -38,7 +39,7 @@ import { DutyAlreadySignedError, SlashingProtectionError } from './errors.js';
|
|
|
38
39
|
this.signingTimeoutMs = config.signingTimeoutMs;
|
|
39
40
|
// Default to 144s (2x 72s Aztec slot duration) if not explicitly configured
|
|
40
41
|
this.maxStuckDutiesAgeMs = config.maxStuckDutiesAgeMs ?? 144_000;
|
|
41
|
-
this.cleanupRunningPromise = new RunningPromise(this.
|
|
42
|
+
this.cleanupRunningPromise = new RunningPromise(this.cleanup.bind(this), this.log, this.maxStuckDutiesAgeMs);
|
|
42
43
|
}
|
|
43
44
|
/**
|
|
44
45
|
* Check if a duty can be performed and acquire the lock if so.
|
|
@@ -49,7 +50,6 @@ import { DutyAlreadySignedError, SlashingProtectionError } from './errors.js';
|
|
|
49
50
|
* 2. If insert succeeds, we acquired the lock - return the lockToken
|
|
50
51
|
* 3. If a record exists, handle based on status:
|
|
51
52
|
* - SIGNED: Throw appropriate error (already signed or slashing protection)
|
|
52
|
-
* - FAILED: Delete the failed record
|
|
53
53
|
* - SIGNING: Wait and poll until status changes, then handle result
|
|
54
54
|
*
|
|
55
55
|
* @returns The lockToken that must be used for recordSuccess/deleteDuty
|
|
@@ -67,7 +67,7 @@ import { DutyAlreadySignedError, SlashingProtectionError } from './errors.js';
|
|
|
67
67
|
const { isNew, record } = await this.db.tryInsertOrGetExisting(params);
|
|
68
68
|
if (isNew) {
|
|
69
69
|
// We successfully acquired the lock
|
|
70
|
-
this.log.
|
|
70
|
+
this.log.verbose(`Acquired lock for duty ${dutyType} at slot ${slot}`, {
|
|
71
71
|
validatorAddress: validatorAddress.toString(),
|
|
72
72
|
nodeId
|
|
73
73
|
});
|
|
@@ -116,11 +116,11 @@ import { DutyAlreadySignedError, SlashingProtectionError } from './errors.js';
|
|
|
116
116
|
*
|
|
117
117
|
* @returns true if the update succeeded, false if token didn't match
|
|
118
118
|
*/ async recordSuccess(params) {
|
|
119
|
-
const { validatorAddress, slot, dutyType, signature, nodeId, lockToken } = params;
|
|
119
|
+
const { rollupAddress, validatorAddress, slot, dutyType, signature, nodeId, lockToken } = params;
|
|
120
120
|
const blockIndexWithinCheckpoint = getBlockIndexFromDutyIdentifier(params);
|
|
121
|
-
const success = await this.db.updateDutySigned(validatorAddress, slot, dutyType, signature.toString(), lockToken, blockIndexWithinCheckpoint);
|
|
121
|
+
const success = await this.db.updateDutySigned(rollupAddress, validatorAddress, slot, dutyType, signature.toString(), lockToken, blockIndexWithinCheckpoint);
|
|
122
122
|
if (success) {
|
|
123
|
-
this.log.
|
|
123
|
+
this.log.verbose(`Recorded successful signing for duty ${dutyType} at slot ${slot}`, {
|
|
124
124
|
validatorAddress: validatorAddress.toString(),
|
|
125
125
|
nodeId
|
|
126
126
|
});
|
|
@@ -139,9 +139,9 @@ import { DutyAlreadySignedError, SlashingProtectionError } from './errors.js';
|
|
|
139
139
|
*
|
|
140
140
|
* @returns true if the delete succeeded, false if token didn't match
|
|
141
141
|
*/ async deleteDuty(params) {
|
|
142
|
-
const { validatorAddress, slot, dutyType, lockToken } = params;
|
|
142
|
+
const { rollupAddress, validatorAddress, slot, dutyType, lockToken } = params;
|
|
143
143
|
const blockIndexWithinCheckpoint = getBlockIndexFromDutyIdentifier(params);
|
|
144
|
-
const success = await this.db.deleteDuty(validatorAddress, slot, dutyType, lockToken, blockIndexWithinCheckpoint);
|
|
144
|
+
const success = await this.db.deleteDuty(rollupAddress, validatorAddress, slot, dutyType, lockToken, blockIndexWithinCheckpoint);
|
|
145
145
|
if (success) {
|
|
146
146
|
this.log.info(`Deleted duty ${dutyType} at slot ${slot} to allow retry`, {
|
|
147
147
|
validatorAddress: validatorAddress.toString()
|
|
@@ -161,7 +161,17 @@ import { DutyAlreadySignedError, SlashingProtectionError } from './errors.js';
|
|
|
161
161
|
/**
|
|
162
162
|
* Start running tasks.
|
|
163
163
|
* Cleanup runs immediately on start to recover from any previous crashes.
|
|
164
|
-
*/
|
|
164
|
+
*/ /**
|
|
165
|
+
* Start the background cleanup task.
|
|
166
|
+
* Also performs one-time cleanup of duties with outdated rollup addresses.
|
|
167
|
+
*/ async start() {
|
|
168
|
+
// One-time cleanup at startup: remove duties from previous rollup versions
|
|
169
|
+
const numOutdatedRollupDuties = await this.db.cleanupOutdatedRollupDuties(this.config.l1Contracts.rollupAddress);
|
|
170
|
+
if (numOutdatedRollupDuties > 0) {
|
|
171
|
+
this.log.info(`Cleaned up ${numOutdatedRollupDuties} duties with outdated rollup address at startup`, {
|
|
172
|
+
currentRollupAddress: this.config.l1Contracts.rollupAddress.toString()
|
|
173
|
+
});
|
|
174
|
+
}
|
|
165
175
|
this.cleanupRunningPromise.start();
|
|
166
176
|
this.log.info('Slashing protection service started', {
|
|
167
177
|
nodeId: this.config.nodeId
|
|
@@ -183,14 +193,33 @@ import { DutyAlreadySignedError, SlashingProtectionError } from './errors.js';
|
|
|
183
193
|
this.log.info('Slashing protection database connection closed');
|
|
184
194
|
}
|
|
185
195
|
/**
|
|
186
|
-
*
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
196
|
+
* Periodic cleanup of stuck duties and optionally old signed duties.
|
|
197
|
+
* Runs in the background via RunningPromise.
|
|
198
|
+
*/ async cleanup() {
|
|
199
|
+
// 1. Clean up stuck duties (our own node's duties that got stuck in 'signing' status)
|
|
200
|
+
const numStuckDuties = await this.db.cleanupOwnStuckDuties(this.config.nodeId, this.maxStuckDutiesAgeMs);
|
|
201
|
+
if (numStuckDuties > 0) {
|
|
202
|
+
this.log.verbose(`Cleaned up ${numStuckDuties} stuck duties`, {
|
|
191
203
|
nodeId: this.config.nodeId,
|
|
192
204
|
maxStuckDutiesAgeMs: this.maxStuckDutiesAgeMs
|
|
193
205
|
});
|
|
194
206
|
}
|
|
207
|
+
// 2. Clean up old signed duties if configured
|
|
208
|
+
// we shouldn't run this as often as stuck duty cleanup.
|
|
209
|
+
if (this.config.cleanupOldDutiesAfterHours !== undefined) {
|
|
210
|
+
const maxAgeMs = this.config.cleanupOldDutiesAfterHours * 60 * 60 * 1000;
|
|
211
|
+
const nowMs = Date.now();
|
|
212
|
+
const shouldRun = this.lastOldDutiesCleanupAtMs === undefined || nowMs - this.lastOldDutiesCleanupAtMs >= maxAgeMs;
|
|
213
|
+
if (shouldRun) {
|
|
214
|
+
const numOldDuties = await this.db.cleanupOldDuties(maxAgeMs);
|
|
215
|
+
this.lastOldDutiesCleanupAtMs = nowMs;
|
|
216
|
+
if (numOldDuties > 0) {
|
|
217
|
+
this.log.verbose(`Cleaned up ${numOldDuties} old signed duties`, {
|
|
218
|
+
cleanupOldDutiesAfterHours: this.config.cleanupOldDutiesAfterHours,
|
|
219
|
+
maxAgeMs
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
195
224
|
}
|
|
196
225
|
}
|
package/dest/types.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ import { BlockNumber, type CheckpointNumber, type IndexWithinCheckpoint, type Sl
|
|
|
2
2
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
3
|
import type { Pool } from 'pg';
|
|
4
4
|
import type { ValidatorHASignerConfig } from './config.js';
|
|
5
|
-
import { type BlockProposalDutyIdentifier, type CheckAndRecordParams, type DeleteDutyParams, type DutyIdentifier, DutyType, type OtherDutyIdentifier, type RecordSuccessParams, type ValidatorDutyRecord } from './db/types.js';
|
|
6
|
-
export type { BlockProposalDutyIdentifier, CheckAndRecordParams, DeleteDutyParams, DutyIdentifier, OtherDutyIdentifier, RecordSuccessParams, ValidatorDutyRecord, ValidatorHASignerConfig, };
|
|
5
|
+
import { type BlockProposalDutyIdentifier, type CheckAndRecordParams, type DeleteDutyParams, type DutyIdentifier, type DutyRow, DutyType, type OtherDutyIdentifier, type RecordSuccessParams, type ValidatorDutyRecord } from './db/types.js';
|
|
6
|
+
export type { BlockProposalDutyIdentifier, CheckAndRecordParams, DeleteDutyParams, DutyIdentifier, DutyRow, OtherDutyIdentifier, RecordSuccessParams, ValidatorDutyRecord, ValidatorHASignerConfig, };
|
|
7
7
|
export { DutyStatus, DutyType, getBlockIndexFromDutyIdentifier, normalizeBlockIndex } from './db/types.js';
|
|
8
8
|
/**
|
|
9
9
|
* Result of tryInsertOrGetExisting operation
|
|
@@ -116,7 +116,7 @@ export interface SlashingProtectionDatabase {
|
|
|
116
116
|
*
|
|
117
117
|
* @returns true if the update succeeded, false if token didn't match or duty not found
|
|
118
118
|
*/
|
|
119
|
-
updateDutySigned(validatorAddress: EthAddress, slot: SlotNumber, dutyType: DutyType, signature: string, lockToken: string, blockIndexWithinCheckpoint: number): Promise<boolean>;
|
|
119
|
+
updateDutySigned(rollupAddress: EthAddress, validatorAddress: EthAddress, slot: SlotNumber, dutyType: DutyType, signature: string, lockToken: string, blockIndexWithinCheckpoint: number): Promise<boolean>;
|
|
120
120
|
/**
|
|
121
121
|
* Delete a duty record.
|
|
122
122
|
* Only succeeds if the lockToken matches (caller must be the one who created the duty).
|
|
@@ -124,16 +124,29 @@ export interface SlashingProtectionDatabase {
|
|
|
124
124
|
*
|
|
125
125
|
* @returns true if the delete succeeded, false if token didn't match or duty not found
|
|
126
126
|
*/
|
|
127
|
-
deleteDuty(validatorAddress: EthAddress, slot: SlotNumber, dutyType: DutyType, lockToken: string, blockIndexWithinCheckpoint: number): Promise<boolean>;
|
|
127
|
+
deleteDuty(rollupAddress: EthAddress, validatorAddress: EthAddress, slot: SlotNumber, dutyType: DutyType, lockToken: string, blockIndexWithinCheckpoint: number): Promise<boolean>;
|
|
128
128
|
/**
|
|
129
129
|
* Cleanup own stuck duties
|
|
130
130
|
* @returns the number of duties cleaned up
|
|
131
131
|
*/
|
|
132
132
|
cleanupOwnStuckDuties(nodeId: string, maxAgeMs: number): Promise<number>;
|
|
133
|
+
/**
|
|
134
|
+
* Cleanup duties with outdated rollup address.
|
|
135
|
+
* Removes all duties where the rollup address doesn't match the current one.
|
|
136
|
+
* Used after a rollup upgrade to clean up duties for the old rollup.
|
|
137
|
+
* @returns the number of duties cleaned up
|
|
138
|
+
*/
|
|
139
|
+
cleanupOutdatedRollupDuties(currentRollupAddress: EthAddress): Promise<number>;
|
|
140
|
+
/**
|
|
141
|
+
* Cleanup old signed duties.
|
|
142
|
+
* Removes only signed duties older than the specified age.
|
|
143
|
+
* @returns the number of duties cleaned up
|
|
144
|
+
*/
|
|
145
|
+
cleanupOldDuties(maxAgeMs: number): Promise<number>;
|
|
133
146
|
/**
|
|
134
147
|
* Close the database connection.
|
|
135
148
|
* Should be called during graceful shutdown.
|
|
136
149
|
*/
|
|
137
150
|
close(): Promise<void>;
|
|
138
151
|
}
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLEtBQUssZ0JBQWdCLEVBQ3JCLEtBQUsscUJBQXFCLEVBQzFCLEtBQUssVUFBVSxFQUNoQixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWhFLE9BQU8sS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQztBQUUvQixPQUFPLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsS0FBSywyQkFBMkIsRUFDaEMsS0FBSyxvQkFBb0IsRUFDekIsS0FBSyxnQkFBZ0IsRUFDckIsS0FBSyxjQUFjLEVBQ25CLEtBQUssT0FBTyxFQUNaLFFBQVEsRUFDUixLQUFLLG1CQUFtQixFQUN4QixLQUFLLG1CQUFtQixFQUN4QixLQUFLLG1CQUFtQixFQUN6QixNQUFNLGVBQWUsQ0FBQztBQUV2QixZQUFZLEVBQ1YsMkJBQTJCLEVBQzNCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQix1QkFBdUIsR0FDeEIsQ0FBQztBQUNGLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLCtCQUErQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNHOztHQUVHO0FBQ0gsTUFBTSxXQUFXLG9CQUFvQjtJQUNuQywyRUFBMkU7SUFDM0UsS0FBSyxFQUFFLE9BQU8sQ0FBQztJQUNmLHFEQUFxRDtJQUNyRCxNQUFNLEVBQUUsbUJBQW1CLENBQUM7Q0FDN0I7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxrQkFBa0I7SUFDakM7OztPQUdHO0lBQ0gsSUFBSSxD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
|
package/dest/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* node will sign for a given duty (slot + duty type).
|
|
7
7
|
*/
|
|
8
8
|
import type { Buffer32 } from '@aztec/foundation/buffer';
|
|
9
|
-
import
|
|
9
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
10
10
|
import type { Signature } from '@aztec/foundation/eth-signature';
|
|
11
11
|
import type { ValidatorHASignerConfig } from './config.js';
|
|
12
12
|
import { type HAProtectedSigningContext, type SlashingProtectionDatabase } from './types.js';
|
|
@@ -33,6 +33,7 @@ export declare class ValidatorHASigner {
|
|
|
33
33
|
private readonly config;
|
|
34
34
|
private readonly log;
|
|
35
35
|
private readonly slashingProtection;
|
|
36
|
+
private readonly rollupAddress;
|
|
36
37
|
constructor(db: SlashingProtectionDatabase, config: ValidatorHASignerConfig);
|
|
37
38
|
/**
|
|
38
39
|
* Sign a message with slashing protection.
|
|
@@ -60,11 +61,11 @@ export declare class ValidatorHASigner {
|
|
|
60
61
|
* Start the HA signer background tasks (cleanup of stuck duties).
|
|
61
62
|
* Should be called after construction and before signing operations.
|
|
62
63
|
*/
|
|
63
|
-
start(): void
|
|
64
|
+
start(): Promise<void>;
|
|
64
65
|
/**
|
|
65
66
|
* Stop the HA signer background tasks and close database connection.
|
|
66
67
|
* Should be called during graceful shutdown.
|
|
67
68
|
*/
|
|
68
69
|
stop(): Promise<void>;
|
|
69
70
|
}
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yX2hhX3NpZ25lci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3ZhbGlkYXRvcl9oYV9zaWduZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2pFLE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzNELE9BQU8sRUFDTCxLQUFLLHlCQUF5QixFQUM5QixLQUFLLDBCQUEwQixFQUVoQyxNQUFNLFlBQVksQ0FBQztBQUVwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gscUJBQWEsaUJBQWlCO0lBTzFCLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQU56QixPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBUztJQUM3QixPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUE0QjtJQUMvRCxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBYTtJQUUzQyxZQUNFLEVBQUUsRUFBRSwwQkFBMEIsRUFDYixNQUFNLEVBQUUsdUJBQXVCLEVBa0JqRDtJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0csa0JBQWtCLENBQ3RCLGdCQUFnQixFQUFFLFVBQVUsRUFDNUIsV0FBVyxFQUFFLFFBQVEsRUFDckIsT0FBTyxFQUFFLHlCQUF5QixFQUNsQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FDcEQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQStDcEI7SUFFRDs7T0FFRztJQUNILElBQUksTUFBTSxJQUFJLE1BQU0sQ0FFbkI7SUFFRDs7O09BR0c7SUFDRyxLQUFLLGtCQUVWO0lBRUQ7OztPQUdHO0lBQ0csSUFBSSxrQkFHVDtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator_ha_signer.d.ts","sourceRoot":"","sources":["../src/validator_ha_signer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"validator_ha_signer.d.ts","sourceRoot":"","sources":["../src/validator_ha_signer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAG3D,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAEhC,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAiB;IAO1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4B;IAC/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAE3C,YACE,EAAE,EAAE,0BAA0B,EACb,MAAM,EAAE,uBAAuB,EAkBjD;IAED;;;;;;;;;;;;;;;;OAgBG;IACG,kBAAkB,CACtB,gBAAgB,EAAE,UAAU,EAC5B,WAAW,EAAE,QAAQ,EACrB,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,CAAC,WAAW,EAAE,QAAQ,KAAK,OAAO,CAAC,SAAS,CAAC,GACpD,OAAO,CAAC,SAAS,CAAC,CA+CpB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;OAGG;IACG,KAAK,kBAEV;IAED;;;OAGG;IACG,IAAI,kBAGT;CACF"}
|
|
@@ -30,6 +30,7 @@ import { getBlockNumberFromSigningContext } from './types.js';
|
|
|
30
30
|
config;
|
|
31
31
|
log;
|
|
32
32
|
slashingProtection;
|
|
33
|
+
rollupAddress;
|
|
33
34
|
constructor(db, config){
|
|
34
35
|
this.config = config;
|
|
35
36
|
this.log = createLogger('validator-ha-signer');
|
|
@@ -40,9 +41,11 @@ import { getBlockNumberFromSigningContext } from './types.js';
|
|
|
40
41
|
if (!config.nodeId || config.nodeId === '') {
|
|
41
42
|
throw new Error('NODE_ID is required for high-availability setups');
|
|
42
43
|
}
|
|
44
|
+
this.rollupAddress = config.l1Contracts.rollupAddress;
|
|
43
45
|
this.slashingProtection = new SlashingProtectionService(db, config);
|
|
44
46
|
this.log.info('Validator HA Signer initialized with slashing protection', {
|
|
45
|
-
nodeId: config.nodeId
|
|
47
|
+
nodeId: config.nodeId,
|
|
48
|
+
rollupAddress: this.rollupAddress.toString()
|
|
46
49
|
});
|
|
47
50
|
}
|
|
48
51
|
/**
|
|
@@ -65,6 +68,7 @@ import { getBlockNumberFromSigningContext } from './types.js';
|
|
|
65
68
|
let dutyIdentifier;
|
|
66
69
|
if (context.dutyType === DutyType.BLOCK_PROPOSAL) {
|
|
67
70
|
dutyIdentifier = {
|
|
71
|
+
rollupAddress: this.rollupAddress,
|
|
68
72
|
validatorAddress,
|
|
69
73
|
slot: context.slot,
|
|
70
74
|
blockIndexWithinCheckpoint: context.blockIndexWithinCheckpoint,
|
|
@@ -72,6 +76,7 @@ import { getBlockNumberFromSigningContext } from './types.js';
|
|
|
72
76
|
};
|
|
73
77
|
} else {
|
|
74
78
|
dutyIdentifier = {
|
|
79
|
+
rollupAddress: this.rollupAddress,
|
|
75
80
|
validatorAddress,
|
|
76
81
|
slot: context.slot,
|
|
77
82
|
dutyType: context.dutyType
|
|
@@ -114,8 +119,8 @@ import { getBlockNumberFromSigningContext } from './types.js';
|
|
|
114
119
|
/**
|
|
115
120
|
* Start the HA signer background tasks (cleanup of stuck duties).
|
|
116
121
|
* Should be called after construction and before signing operations.
|
|
117
|
-
*/ start() {
|
|
118
|
-
this.slashingProtection.start();
|
|
122
|
+
*/ async start() {
|
|
123
|
+
await this.slashingProtection.start();
|
|
119
124
|
}
|
|
120
125
|
/**
|
|
121
126
|
* Stop the HA signer background tasks and close database connection.
|