@lodestar/beacon-node 1.49.0-dev.258ee1abfb → 1.49.0-dev.2b55a3acab
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/chain/emitter.d.ts +10 -0
- package/lib/chain/emitter.d.ts.map +1 -1
- package/lib/chain/emitter.js +4 -0
- package/lib/chain/emitter.js.map +1 -1
- package/lib/chain/errors/attesterSlashingError.d.ts +4 -1
- package/lib/chain/errors/attesterSlashingError.d.ts.map +1 -1
- package/lib/chain/errors/attesterSlashingError.js +1 -0
- package/lib/chain/errors/attesterSlashingError.js.map +1 -1
- package/lib/chain/errors/proposerSlashingError.d.ts +4 -1
- package/lib/chain/errors/proposerSlashingError.d.ts.map +1 -1
- package/lib/chain/errors/proposerSlashingError.js +1 -0
- package/lib/chain/errors/proposerSlashingError.js.map +1 -1
- package/lib/chain/validation/attesterSlashing.d.ts.map +1 -1
- package/lib/chain/validation/attesterSlashing.js +1 -2
- package/lib/chain/validation/attesterSlashing.js.map +1 -1
- package/lib/chain/validation/proposerSlashing.js +1 -2
- package/lib/chain/validation/proposerSlashing.js.map +1 -1
- package/lib/network/processor/gossipValidatorFn.d.ts +2 -0
- package/lib/network/processor/gossipValidatorFn.d.ts.map +1 -1
- package/lib/network/processor/gossipValidatorFn.js +88 -7
- package/lib/network/processor/gossipValidatorFn.js.map +1 -1
- package/lib/network/processor/index.d.ts +6 -2
- package/lib/network/processor/index.d.ts.map +1 -1
- package/lib/network/processor/index.js +26 -9
- package/lib/network/processor/index.js.map +1 -1
- package/lib/sync/types.d.ts +4 -0
- package/lib/sync/types.d.ts.map +1 -1
- package/lib/sync/types.js +4 -0
- package/lib/sync/types.js.map +1 -1
- package/lib/sync/unknownBlock.d.ts +1 -0
- package/lib/sync/unknownBlock.d.ts.map +1 -1
- package/lib/sync/unknownBlock.js +15 -0
- package/lib/sync/unknownBlock.js.map +1 -1
- package/package.json +14 -14
- package/src/chain/emitter.ts +7 -2
- package/src/chain/errors/attesterSlashingError.ts +3 -1
- package/src/chain/errors/proposerSlashingError.ts +3 -1
- package/src/chain/validation/attesterSlashing.ts +1 -2
- package/src/chain/validation/proposerSlashing.ts +1 -2
- package/src/network/processor/gossipValidatorFn.ts +111 -7
- package/src/network/processor/index.ts +37 -9
- package/src/sync/types.ts +6 -3
- package/src/sync/unknownBlock.ts +15 -0
package/lib/chain/emitter.d.ts
CHANGED
|
@@ -71,6 +71,10 @@ export declare enum ChainEvent {
|
|
|
71
71
|
* Trigger BlockInputSync to find a SignedExecutionPayloadEnvelope with specified block root.
|
|
72
72
|
*/
|
|
73
73
|
unknownEnvelopeBlockRoot = "unknownEnvelopeBlockRoot",
|
|
74
|
+
/**
|
|
75
|
+
* Same as unknownEnvelopeBlockRoot, but with slot
|
|
76
|
+
*/
|
|
77
|
+
unknownEnvelopeBlockRootSlot = "unknownEnvelopeBlockRootSlot",
|
|
74
78
|
/**
|
|
75
79
|
* Trigger BlockInputSync for blocks that are partially received via gossip but are not complete by time the
|
|
76
80
|
* cut-off window passes for waiting on gossip
|
|
@@ -109,6 +113,11 @@ export type ChainEventData = {
|
|
|
109
113
|
source: BlockInputSource;
|
|
110
114
|
};
|
|
111
115
|
[ChainEvent.unknownEnvelopeBlockRoot]: {
|
|
116
|
+
rootHex: RootHex;
|
|
117
|
+
peer?: PeerIdStr;
|
|
118
|
+
source: BlockInputSource;
|
|
119
|
+
};
|
|
120
|
+
[ChainEvent.unknownEnvelopeBlockRootSlot]: {
|
|
112
121
|
rootHex: RootHex;
|
|
113
122
|
slot: Slot;
|
|
114
123
|
peer?: PeerIdStr;
|
|
@@ -129,6 +138,7 @@ export type IChainEvents = ApiEvents & {
|
|
|
129
138
|
[ChainEvent.incompleteBlockInput]: (data: ChainEventData[ChainEvent.incompleteBlockInput]) => void;
|
|
130
139
|
[ChainEvent.incompletePayloadEnvelope]: (data: ChainEventData[ChainEvent.incompletePayloadEnvelope]) => void;
|
|
131
140
|
[ChainEvent.unknownEnvelopeBlockRoot]: (data: ChainEventData[ChainEvent.unknownEnvelopeBlockRoot]) => void;
|
|
141
|
+
[ChainEvent.unknownEnvelopeBlockRootSlot]: (data: ChainEventData[ChainEvent.unknownEnvelopeBlockRootSlot]) => void;
|
|
132
142
|
};
|
|
133
143
|
declare const ChainEventEmitter_base: new () => StrictEventEmitter<EventEmitter, IChainEvents>;
|
|
134
144
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/chain/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AACzC,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAC,gBAAgB,EAAC,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAC,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAC,oBAAoB,EAAC,MAAM,uDAAuD,CAAC;AAE3F;;;;;;;GAOG;AACH,oBAAY,UAAU;IACpB;;;;;OAKG;IACH,UAAU,eAAe;IACzB;;;;OAIG;IACH,mBAAmB,yBAAyB;IAC5C;;;;OAIG;IACH,mBAAmB,yBAAyB;IAC5C;;OAEG;IACH,6BAA6B,kCAAkC;IAC/D;;;OAGG;IACH,kBAAkB,uBAAuB;IACzC;;;OAGG;IACH,mBAAmB,wBAAwB;IAC3C;;;OAGG;IACH,uBAAuB,4BAA4B;IACnD;;OAEG;IACH,YAAY,iBAAiB;IAC7B;;;OAGG;IACH,kBAAkB,uBAAuB;IACzC;;OAEG;IACH,gBAAgB,qBAAqB;IACrC;;OAEG;IACH,wBAAwB,6BAA6B;IACrD;;;OAGG;IACH,oBAAoB,yBAAyB;IAC7C;;;OAGG;IACH,yBAAyB,8BAA8B;CACxD;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAClF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AAGzF,KAAK,SAAS,GAAG;KAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;CAAC,CAAC;AAE9F,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;QAAC,UAAU,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAC,CAAC;IACtG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAC,CAAC;IAC9F,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE;QAAC,UAAU,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAC,CAAC;IACxG,CAAC,UAAU,CAAC,yBAAyB,CAAC,EAAE;QACtC,YAAY,EAAE,oBAAoB,CAAC;QACnC,IAAI,EAAE,SAAS,CAAC;QAChB,MAAM,EAAE,gBAAgB,CAAC;KAC1B,CAAC;
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/chain/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AACzC,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAC,gBAAgB,EAAC,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAC,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAC,oBAAoB,EAAC,MAAM,uDAAuD,CAAC;AAE3F;;;;;;;GAOG;AACH,oBAAY,UAAU;IACpB;;;;;OAKG;IACH,UAAU,eAAe;IACzB;;;;OAIG;IACH,mBAAmB,yBAAyB;IAC5C;;;;OAIG;IACH,mBAAmB,yBAAyB;IAC5C;;OAEG;IACH,6BAA6B,kCAAkC;IAC/D;;;OAGG;IACH,kBAAkB,uBAAuB;IACzC;;;OAGG;IACH,mBAAmB,wBAAwB;IAC3C;;;OAGG;IACH,uBAAuB,4BAA4B;IACnD;;OAEG;IACH,YAAY,iBAAiB;IAC7B;;;OAGG;IACH,kBAAkB,uBAAuB;IACzC;;OAEG;IACH,gBAAgB,qBAAqB;IACrC;;OAEG;IACH,wBAAwB,6BAA6B;IACrD;;OAEG;IACH,4BAA4B,iCAAiC;IAC7D;;;OAGG;IACH,oBAAoB,yBAAyB;IAC7C;;;OAGG;IACH,yBAAyB,8BAA8B;CACxD;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAClF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AAGzF,KAAK,SAAS,GAAG;KAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;CAAC,CAAC;AAE9F,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;QAAC,UAAU,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAC,CAAC;IACtG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAC,CAAC;IAC9F,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE;QAAC,UAAU,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAC,CAAC;IACxG,CAAC,UAAU,CAAC,yBAAyB,CAAC,EAAE;QACtC,YAAY,EAAE,oBAAoB,CAAC;QACnC,IAAI,EAAE,SAAS,CAAC;QAChB,MAAM,EAAE,gBAAgB,CAAC;KAC1B,CAAC;IACF,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAC,CAAC;IACtG,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAA;KAAC,CAAC;CACvH,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG;IACrC,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAE1F,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC1E,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAE1E,CAAC,UAAU,CAAC,6BAA6B,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;IAE/E,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IAEzE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC;IAE1E,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,KAAK,IAAI,CAAC;IAE1F,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAItC,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAC;IAC/F,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC3F,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACnG,CAAC,UAAU,CAAC,yBAAyB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,yBAAyB,CAAC,KAAK,IAAI,CAAC;IAC7G,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,wBAAwB,CAAC,KAAK,IAAI,CAAC;IAC3G,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,4BAA4B,CAAC,KAAK,IAAI,CAAC;CACpH,CAAC;gDAW+D,kBAAkB,CAAC,YAAY,EAAE,YAAY,CAAC;AAT/G;;;;;;;;GAQG;AACH,qBAAa,iBAAkB,SAAQ,sBAA0E;CAAG"}
|
package/lib/chain/emitter.js
CHANGED
|
@@ -64,6 +64,10 @@ export var ChainEvent;
|
|
|
64
64
|
* Trigger BlockInputSync to find a SignedExecutionPayloadEnvelope with specified block root.
|
|
65
65
|
*/
|
|
66
66
|
ChainEvent["unknownEnvelopeBlockRoot"] = "unknownEnvelopeBlockRoot";
|
|
67
|
+
/**
|
|
68
|
+
* Same as unknownEnvelopeBlockRoot, but with slot
|
|
69
|
+
*/
|
|
70
|
+
ChainEvent["unknownEnvelopeBlockRootSlot"] = "unknownEnvelopeBlockRootSlot";
|
|
67
71
|
/**
|
|
68
72
|
* Trigger BlockInputSync for blocks that are partially received via gossip but are not complete by time the
|
|
69
73
|
* cut-off window passes for waiting on gossip
|
package/lib/chain/emitter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/chain/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAUzC;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/chain/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAUzC;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,UAsEX;AAtED,WAAY,UAAU;IACpB;;;;;OAKG;IACH,uCAAyB,CAAA;IACzB;;;;OAIG;IACH,0DAA4C,CAAA;IAC5C;;;;OAIG;IACH,0DAA4C,CAAA;IAC5C;;OAEG;IACH,6EAA+D,CAAA;IAC/D;;;OAGG;IACH,uDAAyC,CAAA;IACzC;;;OAGG;IACH,yDAA2C,CAAA;IAC3C;;;OAGG;IACH,iEAAmD,CAAA;IACnD;;OAEG;IACH,2CAA6B,CAAA;IAC7B;;;OAGG;IACH,uDAAyC,CAAA;IACzC;;OAEG;IACH,mDAAqC,CAAA;IACrC;;OAEG;IACH,mEAAqD,CAAA;IACrD;;OAEG;IACH,2EAA6D,CAAA;IAC7D;;;OAGG;IACH,2DAA6C,CAAA;IAC7C;;;OAGG;IACH,qEAAuD,CAAA;AACzD,CAAC,EAtEW,UAAU,KAAV,UAAU,QAsErB;AA+CD;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAkB,SAAS,YAAyE;CAAG"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { GossipActionError } from "./gossipValidation.js";
|
|
2
2
|
export declare enum AttesterSlashingErrorCode {
|
|
3
3
|
ALREADY_EXISTS = "ATTESTATION_SLASHING_ERROR_ALREADY_EXISTS",
|
|
4
|
-
INVALID = "ATTESTATION_SLASHING_ERROR_INVALID"
|
|
4
|
+
INVALID = "ATTESTATION_SLASHING_ERROR_INVALID",
|
|
5
|
+
INVALID_SIGNATURE = "ATTESTATION_SLASHING_ERROR_INVALID_SIGNATURE"
|
|
5
6
|
}
|
|
6
7
|
export type AttesterSlashingErrorType = {
|
|
7
8
|
code: AttesterSlashingErrorCode.ALREADY_EXISTS;
|
|
8
9
|
} | {
|
|
9
10
|
code: AttesterSlashingErrorCode.INVALID;
|
|
10
11
|
error: Error;
|
|
12
|
+
} | {
|
|
13
|
+
code: AttesterSlashingErrorCode.INVALID_SIGNATURE;
|
|
11
14
|
};
|
|
12
15
|
export declare class AttesterSlashingError extends GossipActionError<AttesterSlashingErrorType> {
|
|
13
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attesterSlashingError.d.ts","sourceRoot":"","sources":["../../../src/chain/errors/attesterSlashingError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAExD,oBAAY,yBAAyB;IACnC,cAAc,8CAA8C;IAC5D,OAAO,uCAAuC;
|
|
1
|
+
{"version":3,"file":"attesterSlashingError.d.ts","sourceRoot":"","sources":["../../../src/chain/errors/attesterSlashingError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAExD,oBAAY,yBAAyB;IACnC,cAAc,8CAA8C;IAC5D,OAAO,uCAAuC;IAC9C,iBAAiB,iDAAiD;CACnE;AACD,MAAM,MAAM,yBAAyB,GACjC;IAAC,IAAI,EAAE,yBAAyB,CAAC,cAAc,CAAA;CAAC,GAChD;IAAC,IAAI,EAAE,yBAAyB,CAAC,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAC,GACvD;IAAC,IAAI,EAAE,yBAAyB,CAAC,iBAAiB,CAAA;CAAC,CAAC;AAExD,qBAAa,qBAAsB,SAAQ,iBAAiB,CAAC,yBAAyB,CAAC;CAAG"}
|
|
@@ -3,6 +3,7 @@ export var AttesterSlashingErrorCode;
|
|
|
3
3
|
(function (AttesterSlashingErrorCode) {
|
|
4
4
|
AttesterSlashingErrorCode["ALREADY_EXISTS"] = "ATTESTATION_SLASHING_ERROR_ALREADY_EXISTS";
|
|
5
5
|
AttesterSlashingErrorCode["INVALID"] = "ATTESTATION_SLASHING_ERROR_INVALID";
|
|
6
|
+
AttesterSlashingErrorCode["INVALID_SIGNATURE"] = "ATTESTATION_SLASHING_ERROR_INVALID_SIGNATURE";
|
|
6
7
|
})(AttesterSlashingErrorCode || (AttesterSlashingErrorCode = {}));
|
|
7
8
|
export class AttesterSlashingError extends GossipActionError {
|
|
8
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attesterSlashingError.js","sourceRoot":"","sources":["../../../src/chain/errors/attesterSlashingError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"attesterSlashingError.js","sourceRoot":"","sources":["../../../src/chain/errors/attesterSlashingError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAN,IAAY,yBAIX;AAJD,WAAY,yBAAyB;IACnC,yFAA4D,CAAA;IAC5D,2EAA8C,CAAA;IAC9C,+FAAkE,CAAA;AACpE,CAAC,EAJW,yBAAyB,KAAzB,yBAAyB,QAIpC;AAMD,MAAM,OAAO,qBAAsB,SAAQ,iBAA4C;CAAG"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { GossipActionError } from "./gossipValidation.js";
|
|
2
2
|
export declare enum ProposerSlashingErrorCode {
|
|
3
3
|
ALREADY_EXISTS = "PROPOSER_SLASHING_ERROR_ALREADY_EXISTS",
|
|
4
|
-
INVALID = "PROPOSER_SLASHING_ERROR_INVALID"
|
|
4
|
+
INVALID = "PROPOSER_SLASHING_ERROR_INVALID",
|
|
5
|
+
INVALID_SIGNATURE = "PROPOSER_SLASHING_ERROR_INVALID_SIGNATURE"
|
|
5
6
|
}
|
|
6
7
|
export type ProposerSlashingErrorType = {
|
|
7
8
|
code: ProposerSlashingErrorCode.ALREADY_EXISTS;
|
|
8
9
|
} | {
|
|
9
10
|
code: ProposerSlashingErrorCode.INVALID;
|
|
10
11
|
error: Error;
|
|
12
|
+
} | {
|
|
13
|
+
code: ProposerSlashingErrorCode.INVALID_SIGNATURE;
|
|
11
14
|
};
|
|
12
15
|
export declare class ProposerSlashingError extends GossipActionError<ProposerSlashingErrorType> {
|
|
13
16
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposerSlashingError.d.ts","sourceRoot":"","sources":["../../../src/chain/errors/proposerSlashingError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAExD,oBAAY,yBAAyB;IACnC,cAAc,2CAA2C;IACzD,OAAO,oCAAoC;
|
|
1
|
+
{"version":3,"file":"proposerSlashingError.d.ts","sourceRoot":"","sources":["../../../src/chain/errors/proposerSlashingError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAExD,oBAAY,yBAAyB;IACnC,cAAc,2CAA2C;IACzD,OAAO,oCAAoC;IAC3C,iBAAiB,8CAA8C;CAChE;AACD,MAAM,MAAM,yBAAyB,GACjC;IAAC,IAAI,EAAE,yBAAyB,CAAC,cAAc,CAAA;CAAC,GAChD;IAAC,IAAI,EAAE,yBAAyB,CAAC,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAC,GACvD;IAAC,IAAI,EAAE,yBAAyB,CAAC,iBAAiB,CAAA;CAAC,CAAC;AAExD,qBAAa,qBAAsB,SAAQ,iBAAiB,CAAC,yBAAyB,CAAC;CAAG"}
|
|
@@ -3,6 +3,7 @@ export var ProposerSlashingErrorCode;
|
|
|
3
3
|
(function (ProposerSlashingErrorCode) {
|
|
4
4
|
ProposerSlashingErrorCode["ALREADY_EXISTS"] = "PROPOSER_SLASHING_ERROR_ALREADY_EXISTS";
|
|
5
5
|
ProposerSlashingErrorCode["INVALID"] = "PROPOSER_SLASHING_ERROR_INVALID";
|
|
6
|
+
ProposerSlashingErrorCode["INVALID_SIGNATURE"] = "PROPOSER_SLASHING_ERROR_INVALID_SIGNATURE";
|
|
6
7
|
})(ProposerSlashingErrorCode || (ProposerSlashingErrorCode = {}));
|
|
7
8
|
export class ProposerSlashingError extends GossipActionError {
|
|
8
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposerSlashingError.js","sourceRoot":"","sources":["../../../src/chain/errors/proposerSlashingError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"proposerSlashingError.js","sourceRoot":"","sources":["../../../src/chain/errors/proposerSlashingError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAN,IAAY,yBAIX;AAJD,WAAY,yBAAyB;IACnC,sFAAyD,CAAA;IACzD,wEAA2C,CAAA;IAC3C,4FAA+D,CAAA;AACjE,CAAC,EAJW,yBAAyB,KAAzB,yBAAyB,QAIpC;AAMD,MAAM,OAAO,qBAAsB,SAAQ,iBAA4C;CAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attesterSlashing.d.ts","sourceRoot":"","sources":["../../../src/chain/validation/attesterSlashing.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAEzC,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,YAAY,EACnB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,YAAY,EACnB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,YAAY,EACnB,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,UAAQ,GACpB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"attesterSlashing.d.ts","sourceRoot":"","sources":["../../../src/chain/validation/attesterSlashing.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAEzC,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,YAAY,EACnB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,YAAY,EACnB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,YAAY,EACnB,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,UAAQ,GACpB,OAAO,CAAC,IAAI,CAAC,CAuCf"}
|
|
@@ -40,8 +40,7 @@ export async function validateAttesterSlashing(chain, attesterSlashing, prioriti
|
|
|
40
40
|
const signatureSets = getAttesterSlashingSignatureSets(chain.config, state.slot, attesterSlashing);
|
|
41
41
|
if (!(await chain.bls.verifySignatureSets(signatureSets, { batchable: true, priority: prioritizeBls }))) {
|
|
42
42
|
throw new AttesterSlashingError(GossipAction.REJECT, {
|
|
43
|
-
code: AttesterSlashingErrorCode.
|
|
44
|
-
error: Error("Invalid signature"),
|
|
43
|
+
code: AttesterSlashingErrorCode.INVALID_SIGNATURE,
|
|
45
44
|
});
|
|
46
45
|
}
|
|
47
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attesterSlashing.js","sourceRoot":"","sources":["../../../src/chain/validation/attesterSlashing.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,gCAAgC,EAChC,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,qBAAqB,EAAE,yBAAyB,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAGlG,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAmB,EACnB,gBAAkC;IAElC,MAAM,aAAa,GAAG,IAAI,CAAC;IAC3B,OAAO,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAAmB,EACnB,gBAAkC;IAElC,OAAO,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAmB,EACnB,gBAAkC,EAClC,aAAa,GAAG,KAAK;IAErB,qHAAqH;IACrH,uCAAuC;IACvC,iHAAiH;IACjH,+FAA+F;IAC/F,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,gBAAgB,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,cAAc;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IAEnC,mFAAmF;IACnF,IAAI,CAAC;QACH,mDAAmD;QACnD,2BAA2B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvG,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,OAAO;YACvC,KAAK,EAAE,CAAU;SAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;IACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QACxG,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,OAAO;YACvC,KAAK,EAAE,KAAK,CAAC,8CAA8C,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,aAAa,GAAG,gCAAgC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACnG,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,aAAa,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAC,CAAC,CAAC,EAAE,CAAC;QACtG,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,
|
|
1
|
+
{"version":3,"file":"attesterSlashing.js","sourceRoot":"","sources":["../../../src/chain/validation/attesterSlashing.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,gCAAgC,EAChC,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,qBAAqB,EAAE,yBAAyB,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAGlG,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAmB,EACnB,gBAAkC;IAElC,MAAM,aAAa,GAAG,IAAI,CAAC;IAC3B,OAAO,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAAmB,EACnB,gBAAkC;IAElC,OAAO,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAmB,EACnB,gBAAkC,EAClC,aAAa,GAAG,KAAK;IAErB,qHAAqH;IACrH,uCAAuC;IACvC,iHAAiH;IACjH,+FAA+F;IAC/F,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,gBAAgB,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,cAAc;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IAEnC,mFAAmF;IACnF,IAAI,CAAC;QACH,mDAAmD;QACnD,2BAA2B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvG,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,OAAO;YACvC,KAAK,EAAE,CAAU;SAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;IACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QACxG,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,OAAO;YACvC,KAAK,EAAE,KAAK,CAAC,8CAA8C,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,aAAa,GAAG,gCAAgC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACnG,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,aAAa,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAC,CAAC,CAAC,EAAE,CAAC;QACtG,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,iBAAiB;SAClD,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -31,8 +31,7 @@ async function validateProposerSlashing(chain, proposerSlashing, prioritizeBls =
|
|
|
31
31
|
const signatureSets = getProposerSlashingSignatureSets(chain.config, state.slot, proposerSlashing);
|
|
32
32
|
if (!(await chain.bls.verifySignatureSets(signatureSets, { batchable: true, priority: prioritizeBls }))) {
|
|
33
33
|
throw new ProposerSlashingError(GossipAction.REJECT, {
|
|
34
|
-
code: ProposerSlashingErrorCode.
|
|
35
|
-
error: Error("Invalid signature"),
|
|
34
|
+
code: ProposerSlashingErrorCode.INVALID_SIGNATURE,
|
|
36
35
|
});
|
|
37
36
|
}
|
|
38
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposerSlashing.js","sourceRoot":"","sources":["../../../src/chain/validation/proposerSlashing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,2BAA2B,EAAE,gCAAgC,EAAC,MAAM,4BAA4B,CAAC;AAEzG,OAAO,EAAC,YAAY,EAAE,qBAAqB,EAAE,yBAAyB,EAAC,MAAM,oBAAoB,CAAC;AAGlG,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAmB,EACnB,gBAAyC;IAEzC,MAAM,aAAa,GAAG,IAAI,CAAC;IAC3B,OAAO,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAAmB,EACnB,gBAAyC;IAEzC,OAAO,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,KAAmB,EACnB,gBAAyC,EACzC,aAAa,GAAG,KAAK;IAErB,2GAA2G;IAC3G,4DAA4D;IAC5D,IAAI,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/F,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,cAAc;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IAEnC,mFAAmF;IACnF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1F,mDAAmD;QACnD,2BAA2B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,OAAO;YACvC,KAAK,EAAE,CAAU;SAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,aAAa,GAAG,gCAAgC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACnG,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,aAAa,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAC,CAAC,CAAC,EAAE,CAAC;QACtG,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,
|
|
1
|
+
{"version":3,"file":"proposerSlashing.js","sourceRoot":"","sources":["../../../src/chain/validation/proposerSlashing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,2BAA2B,EAAE,gCAAgC,EAAC,MAAM,4BAA4B,CAAC;AAEzG,OAAO,EAAC,YAAY,EAAE,qBAAqB,EAAE,yBAAyB,EAAC,MAAM,oBAAoB,CAAC;AAGlG,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAmB,EACnB,gBAAyC;IAEzC,MAAM,aAAa,GAAG,IAAI,CAAC;IAC3B,OAAO,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAAmB,EACnB,gBAAyC;IAEzC,OAAO,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,KAAmB,EACnB,gBAAyC,EACzC,aAAa,GAAG,KAAK;IAErB,2GAA2G;IAC3G,4DAA4D;IAC5D,IAAI,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/F,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,cAAc;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IAEnC,mFAAmF;IACnF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1F,mDAAmD;QACnD,2BAA2B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,OAAO;YACvC,KAAK,EAAE,CAAU;SAClB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,aAAa,GAAG,gCAAgC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACnG,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,aAAa,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAC,CAAC,CAAC,EAAE,CAAC;QACtG,MAAM,IAAI,qBAAqB,CAAC,YAAY,CAAC,MAAM,EAAE;YACnD,IAAI,EAAE,yBAAyB,CAAC,iBAAiB;SAClD,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { ChainForkConfig } from "@lodestar/config";
|
|
2
2
|
import { Logger } from "@lodestar/utils";
|
|
3
3
|
import { Metrics } from "../../metrics/index.js";
|
|
4
|
+
import { INetworkCore } from "../core/index.js";
|
|
4
5
|
import { GossipHandlers, GossipValidatorBatchFn, GossipValidatorFn } from "../gossip/interface.js";
|
|
5
6
|
export type ValidatorFnModules = {
|
|
6
7
|
config: ChainForkConfig;
|
|
7
8
|
logger: Logger;
|
|
8
9
|
metrics: Metrics | null;
|
|
10
|
+
core: INetworkCore;
|
|
9
11
|
};
|
|
10
12
|
/**
|
|
11
13
|
* Similar to getGossipValidatorFn but return a function to accept a batch of beacon_attestation messages
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gossipValidatorFn.d.ts","sourceRoot":"","sources":["../../../src/network/processor/gossipValidatorFn.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"gossipValidatorFn.d.ts","sourceRoot":"","sources":["../../../src/network/processor/gossipValidatorFn.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAmBvC,OAAO,EAAC,OAAO,EAAC,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAGL,cAAc,EAGd,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAIhC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,YAAY,CAAC;CACpB,CAAC;AA+EF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,kBAAkB,GAC1B,sBAAsB,CAoExB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CA8DnH"}
|
|
@@ -1,12 +1,87 @@
|
|
|
1
1
|
import { TopicValidatorResult } from "@libp2p/gossipsub";
|
|
2
|
-
import { AttestationError, GossipAction, GossipActionError } from "../../chain/errors/index.js";
|
|
2
|
+
import { AttestationError, AttestationErrorCode, AttesterSlashingErrorCode, BlobSidecarErrorCode, BlockErrorCode, BlsToExecutionChangeErrorCode, DataColumnSidecarErrorCode, ExecutionPayloadBidErrorCode, ExecutionPayloadEnvelopeErrorCode, GossipAction, GossipActionError, PayloadAttestationErrorCode, ProposerPreferencesErrorCode, ProposerSlashingErrorCode, SyncCommitteeErrorCode, VoluntaryExitErrorCode, } from "../../chain/errors/index.js";
|
|
3
|
+
import { GossipType, } from "../gossip/interface.js";
|
|
4
|
+
import { PeerAction } from "../peers/index.js";
|
|
3
5
|
import { prettyPrintPeerIdStr } from "../util.js";
|
|
6
|
+
/**
|
|
7
|
+
* PeerAction mapping based on the topic and specific codes.
|
|
8
|
+
* Invalid signatures are Fatal on every topic.
|
|
9
|
+
*/
|
|
10
|
+
const gossipRejectPeerAction = {
|
|
11
|
+
[GossipType.beacon_block]: {
|
|
12
|
+
default: PeerAction.LowToleranceError,
|
|
13
|
+
byCode: { [BlockErrorCode.PROPOSAL_SIGNATURE_INVALID]: PeerAction.Fatal },
|
|
14
|
+
},
|
|
15
|
+
[GossipType.blob_sidecar]: {
|
|
16
|
+
default: PeerAction.LowToleranceError,
|
|
17
|
+
byCode: { [BlobSidecarErrorCode.PROPOSAL_SIGNATURE_INVALID]: PeerAction.Fatal },
|
|
18
|
+
},
|
|
19
|
+
[GossipType.data_column_sidecar]: {
|
|
20
|
+
default: PeerAction.LowToleranceError,
|
|
21
|
+
byCode: { [DataColumnSidecarErrorCode.PROPOSAL_SIGNATURE_INVALID]: PeerAction.Fatal },
|
|
22
|
+
},
|
|
23
|
+
[GossipType.execution_payload]: {
|
|
24
|
+
default: PeerAction.LowToleranceError,
|
|
25
|
+
byCode: { [ExecutionPayloadEnvelopeErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
26
|
+
},
|
|
27
|
+
[GossipType.beacon_aggregate_and_proof]: {
|
|
28
|
+
default: PeerAction.MidToleranceError,
|
|
29
|
+
byCode: { [AttestationErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
30
|
+
},
|
|
31
|
+
[GossipType.beacon_attestation]: {
|
|
32
|
+
default: PeerAction.MidToleranceError,
|
|
33
|
+
byCode: { [AttestationErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
34
|
+
},
|
|
35
|
+
[GossipType.sync_committee_contribution_and_proof]: {
|
|
36
|
+
default: PeerAction.MidToleranceError,
|
|
37
|
+
byCode: { [SyncCommitteeErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
38
|
+
},
|
|
39
|
+
[GossipType.sync_committee]: {
|
|
40
|
+
default: PeerAction.MidToleranceError,
|
|
41
|
+
byCode: { [SyncCommitteeErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
42
|
+
},
|
|
43
|
+
[GossipType.payload_attestation_message]: {
|
|
44
|
+
default: PeerAction.MidToleranceError,
|
|
45
|
+
byCode: { [PayloadAttestationErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
46
|
+
},
|
|
47
|
+
[GossipType.execution_payload_bid]: {
|
|
48
|
+
default: PeerAction.HighToleranceError,
|
|
49
|
+
byCode: { [ExecutionPayloadBidErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
50
|
+
},
|
|
51
|
+
[GossipType.proposer_preferences]: {
|
|
52
|
+
default: PeerAction.HighToleranceError,
|
|
53
|
+
byCode: { [ProposerPreferencesErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
54
|
+
},
|
|
55
|
+
[GossipType.voluntary_exit]: {
|
|
56
|
+
default: PeerAction.HighToleranceError,
|
|
57
|
+
byCode: { [VoluntaryExitErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
58
|
+
},
|
|
59
|
+
[GossipType.bls_to_execution_change]: {
|
|
60
|
+
default: PeerAction.HighToleranceError,
|
|
61
|
+
byCode: { [BlsToExecutionChangeErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
62
|
+
},
|
|
63
|
+
[GossipType.proposer_slashing]: {
|
|
64
|
+
default: PeerAction.HighToleranceError,
|
|
65
|
+
byCode: { [ProposerSlashingErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
66
|
+
},
|
|
67
|
+
[GossipType.attester_slashing]: {
|
|
68
|
+
default: PeerAction.HighToleranceError,
|
|
69
|
+
byCode: { [AttesterSlashingErrorCode.INVALID_SIGNATURE]: PeerAction.Fatal },
|
|
70
|
+
},
|
|
71
|
+
// light client validators only throw IGNORE
|
|
72
|
+
[GossipType.light_client_finality_update]: { default: PeerAction.HighToleranceError },
|
|
73
|
+
[GossipType.light_client_optimistic_update]: { default: PeerAction.HighToleranceError },
|
|
74
|
+
};
|
|
75
|
+
function rejectPeerAction(type, code) {
|
|
76
|
+
const rule = gossipRejectPeerAction[type];
|
|
77
|
+
return rule.byCode?.[code] ?? rule.default;
|
|
78
|
+
}
|
|
4
79
|
/**
|
|
5
80
|
* Similar to getGossipValidatorFn but return a function to accept a batch of beacon_attestation messages
|
|
6
81
|
* with the same attestation data
|
|
7
82
|
*/
|
|
8
83
|
export function getGossipValidatorBatchFn(gossipHandlers, modules) {
|
|
9
|
-
const { logger, metrics } = modules;
|
|
84
|
+
const { logger, metrics, core } = modules;
|
|
10
85
|
return async function gossipValidatorBatchFn(messageInfos) {
|
|
11
86
|
// all messageInfos have same topic type
|
|
12
87
|
const type = messageInfos[0].topic.type;
|
|
@@ -37,12 +112,15 @@ export function getGossipValidatorBatchFn(gossipHandlers, modules) {
|
|
|
37
112
|
// only beacon_attestation topic is validated in batch
|
|
38
113
|
metrics?.networkProcessor.gossipAttestationIgnoreByReason.inc({ reason: e.type.code });
|
|
39
114
|
return TopicValidatorResult.Ignore;
|
|
40
|
-
case GossipAction.REJECT:
|
|
115
|
+
case GossipAction.REJECT: {
|
|
41
116
|
metrics?.networkProcessor.gossipValidationReject.inc({ topic: type });
|
|
42
117
|
// only beacon_attestation topic is validated in batch
|
|
43
118
|
metrics?.networkProcessor.gossipAttestationRejectByReason.inc({ reason: e.type.code });
|
|
44
|
-
|
|
119
|
+
const peerAction = rejectPeerAction(type, e.type.code);
|
|
120
|
+
core.reportPeer(propagationSource, peerAction, e.type.code);
|
|
121
|
+
logger.debug(`Gossip validation ${type} rejected`, { peer: propagationSource, clientAgent, clientVersion, peerAction }, e);
|
|
45
122
|
return TopicValidatorResult.Reject;
|
|
123
|
+
}
|
|
46
124
|
}
|
|
47
125
|
});
|
|
48
126
|
}
|
|
@@ -72,7 +150,7 @@ export function getGossipValidatorBatchFn(gossipHandlers, modules) {
|
|
|
72
150
|
* @see getGossipHandlers for reasoning on why GossipHandlerFn are used for gossip validation.
|
|
73
151
|
*/
|
|
74
152
|
export function getGossipValidatorFn(gossipHandlers, modules) {
|
|
75
|
-
const { logger, metrics } = modules;
|
|
153
|
+
const { logger, metrics, core } = modules;
|
|
76
154
|
return async function gossipValidatorFn({ topic, msg, propagationSource, clientAgent, clientVersion, seenTimestampSec, msgSlot, }) {
|
|
77
155
|
const type = topic.type;
|
|
78
156
|
try {
|
|
@@ -101,10 +179,13 @@ export function getGossipValidatorFn(gossipHandlers, modules) {
|
|
|
101
179
|
case GossipAction.IGNORE:
|
|
102
180
|
metrics?.networkProcessor.gossipValidationIgnore.inc({ topic: type });
|
|
103
181
|
return TopicValidatorResult.Ignore;
|
|
104
|
-
case GossipAction.REJECT:
|
|
182
|
+
case GossipAction.REJECT: {
|
|
105
183
|
metrics?.networkProcessor.gossipValidationReject.inc({ topic: type });
|
|
106
|
-
|
|
184
|
+
const peerAction = rejectPeerAction(type, e.type.code);
|
|
185
|
+
core.reportPeer(propagationSource, peerAction, e.type.code);
|
|
186
|
+
logger.debug(`Gossip validation ${type} rejected`, { peer: propagationSource, clientAgent, clientVersion, peerAction }, e);
|
|
107
187
|
return TopicValidatorResult.Reject;
|
|
188
|
+
}
|
|
108
189
|
}
|
|
109
190
|
}
|
|
110
191
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gossipValidatorFn.js","sourceRoot":"","sources":["../../../src/network/processor/gossipValidatorFn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,mBAAmB,CAAC;AAGvD,OAAO,
|
|
1
|
+
{"version":3,"file":"gossipValidatorFn.js","sourceRoot":"","sources":["../../../src/network/processor/gossipValidatorFn.ts"],"names":[],"mappings":"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"}
|
|
@@ -124,12 +124,12 @@ export declare class NetworkProcessor {
|
|
|
124
124
|
*/
|
|
125
125
|
searchUnknownBlock({ slot, root }: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
126
126
|
/**
|
|
127
|
-
* Search envelope via `ChainEvent.unknownEnvelopeBlockRoot` event
|
|
127
|
+
* Search envelope via `ChainEvent.unknownEnvelopeBlockRoot` / `ChainEvent.unknownEnvelopeBlockRootSlot` event
|
|
128
128
|
* Slot is the message slot, which is not necessarily the same as the envelope's slot, but it can be used for a good prune strategy.
|
|
129
129
|
* In the rare case, if 2 messages on 2 slots search for the same root (for example beacon_attestation) we may emit the same root twice but BlockInputSync should handle it well.
|
|
130
130
|
* Same peer-forwarding + dedup behavior as searchUnknownBlock.
|
|
131
131
|
*/
|
|
132
|
-
searchUnknownEnvelope({ slot, root }: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr): void;
|
|
132
|
+
searchUnknownEnvelope({ slot, root }: SlotRootHex, source: BlockInputSource, peer?: PeerIdStr, slotIsPayloadSlot?: boolean): void;
|
|
133
133
|
private onPendingGossipsubMessage;
|
|
134
134
|
/**
|
|
135
135
|
* Buffer a gossip message that must wait for an unknown block before it can be validated.
|
|
@@ -150,6 +150,10 @@ export declare class NetworkProcessor {
|
|
|
150
150
|
* Cap distinct roots we buffer per slot.
|
|
151
151
|
*/
|
|
152
152
|
tryReserveBufferedRoot(slot: Slot, root: RootHex): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* Search block/envelope given a SlotRootHex
|
|
155
|
+
* envelopeSlotIsPayloadSlot: the message slot is the payload's slot or not
|
|
156
|
+
*/
|
|
153
157
|
private searchUnknownRoot;
|
|
154
158
|
private pushPendingGossipsubMessageToQueue;
|
|
155
159
|
private onBlockProcessed;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/network/processor/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAC,MAAM,EAA2B,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAC,gBAAgB,EAAC,MAAM,wCAAwC,CAAC;AAGxE,OAAO,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAC,OAAO,EAAC,MAAM,0BAA0B,CAAC;AAEjD,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAW/C,OAAO,EAAe,eAAe,EAAC,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,cAAc,EAEd,UAAU,EAGX,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAC,iBAAiB,EAAE,mBAAmB,EAAoB,MAAM,qBAAqB,CAAC;AAE9F,OAAO,EAAC,kBAAkB,EAAkD,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAC,uBAAuB,EAAC,MAAM,YAAY,CAAC;AAEnD,cAAc,YAAY,CAAC;AAE3B,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,GACvD,kBAAkB,GAAG;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAExB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAEJ,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG;IACrD,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,CAAC;AAOF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAI9E,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/network/processor/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -259,12 +259,12 @@ export class NetworkProcessor {
|
|
|
259
259
|
}
|
|
260
260
|
}
|
|
261
261
|
/**
|
|
262
|
-
* Search envelope via `ChainEvent.unknownEnvelopeBlockRoot` event
|
|
262
|
+
* Search envelope via `ChainEvent.unknownEnvelopeBlockRoot` / `ChainEvent.unknownEnvelopeBlockRootSlot` event
|
|
263
263
|
* Slot is the message slot, which is not necessarily the same as the envelope's slot, but it can be used for a good prune strategy.
|
|
264
264
|
* In the rare case, if 2 messages on 2 slots search for the same root (for example beacon_attestation) we may emit the same root twice but BlockInputSync should handle it well.
|
|
265
265
|
* Same peer-forwarding + dedup behavior as searchUnknownBlock.
|
|
266
266
|
*/
|
|
267
|
-
searchUnknownEnvelope({ slot, root }, source, peer) {
|
|
267
|
+
searchUnknownEnvelope({ slot, root }, source, peer, slotIsPayloadSlot = false) {
|
|
268
268
|
if (this.chain.seenPayloadEnvelope(root)) {
|
|
269
269
|
return;
|
|
270
270
|
}
|
|
@@ -280,8 +280,18 @@ export class NetworkProcessor {
|
|
|
280
280
|
forwardedPeers.add(peer);
|
|
281
281
|
shouldEmit = true;
|
|
282
282
|
}
|
|
283
|
+
// the payload-slot seed must reach the sync once, even if a slot-less trigger started the search first
|
|
284
|
+
if (slotIsPayloadSlot && !entry.envelopeSlotEmitted) {
|
|
285
|
+
shouldEmit = true;
|
|
286
|
+
}
|
|
283
287
|
if (shouldEmit) {
|
|
284
|
-
|
|
288
|
+
if (slotIsPayloadSlot) {
|
|
289
|
+
entry.envelopeSlotEmitted = true;
|
|
290
|
+
this.chain.emitter.emit(ChainEvent.unknownEnvelopeBlockRootSlot, { rootHex: root, slot, peer, source });
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
this.chain.emitter.emit(ChainEvent.unknownEnvelopeBlockRoot, { rootHex: root, peer, source });
|
|
294
|
+
}
|
|
285
295
|
}
|
|
286
296
|
}
|
|
287
297
|
onPendingGossipsubMessage = (message) => {
|
|
@@ -396,8 +406,9 @@ export class NetworkProcessor {
|
|
|
396
406
|
break;
|
|
397
407
|
const payloadPresent = getPayloadPresentFromPayloadAttestationMessageSerialized(message.msg.data);
|
|
398
408
|
if (payloadPresent && !this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
|
|
399
|
-
// payload attestation votes that the payload is available but it is not yet known
|
|
400
|
-
|
|
409
|
+
// payload attestation votes that the payload is available but it is not yet known.
|
|
410
|
+
// the PTC vote's slot is the payload's slot
|
|
411
|
+
this.searchUnknownRoot({ slot, root }, false, true, peerId, true);
|
|
401
412
|
// do not await the envelope, payload attestation processing only requires that the block is known
|
|
402
413
|
// also do not reset preprocessResult, we may already await for the block
|
|
403
414
|
}
|
|
@@ -407,7 +418,8 @@ export class NetworkProcessor {
|
|
|
407
418
|
if (root == null)
|
|
408
419
|
break;
|
|
409
420
|
if (!this.chain.forkChoice.hasPayloadHexUnsafe(root)) {
|
|
410
|
-
|
|
421
|
+
// the sidecar's slot is the block's (and so the payload's) slot
|
|
422
|
+
this.searchUnknownRoot({ slot, root }, false, true, peerId, true);
|
|
411
423
|
// do not await the envelope, we can do gossip validation
|
|
412
424
|
// also do not reset preprocessResult, we may already await for the block
|
|
413
425
|
}
|
|
@@ -532,15 +544,20 @@ export class NetworkProcessor {
|
|
|
532
544
|
this.bufferedRootsBySlot.getOrDefault(slot).add(root);
|
|
533
545
|
return true;
|
|
534
546
|
}
|
|
535
|
-
|
|
547
|
+
/**
|
|
548
|
+
* Search block/envelope given a SlotRootHex
|
|
549
|
+
* envelopeSlotIsPayloadSlot: the message slot is the payload's slot or not
|
|
550
|
+
*/
|
|
551
|
+
searchUnknownRoot(slotRoot, searchBlock, searchEnvelope, peerId, envelopeSlotIsPayloadSlot = false) {
|
|
536
552
|
if (!searchBlock && !searchEnvelope)
|
|
537
553
|
return;
|
|
538
554
|
if (this.tooManySearchedRoots(slotRoot.slot, slotRoot.root))
|
|
539
555
|
return;
|
|
540
556
|
if (searchBlock)
|
|
541
557
|
this.searchUnknownBlock(slotRoot, BlockInputSource.network_processor, peerId);
|
|
542
|
-
if (searchEnvelope)
|
|
543
|
-
this.searchUnknownEnvelope(slotRoot, BlockInputSource.network_processor, peerId);
|
|
558
|
+
if (searchEnvelope) {
|
|
559
|
+
this.searchUnknownEnvelope(slotRoot, BlockInputSource.network_processor, peerId, envelopeSlotIsPayloadSlot);
|
|
560
|
+
}
|
|
544
561
|
}
|
|
545
562
|
pushPendingGossipsubMessageToQueue(message) {
|
|
546
563
|
const topicType = message.topic.type;
|