@lodestar/builder 1.48.0 → 1.49.0-dev.04dd7ca9f2
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/builder.d.ts +3 -3
- package/lib/builder.d.ts.map +1 -1
- package/lib/builder.js +6 -6
- package/lib/builder.js.map +1 -1
- package/lib/services/payloadSource.d.ts +69 -0
- package/lib/services/payloadSource.d.ts.map +1 -0
- package/lib/services/payloadSource.js +56 -0
- package/lib/services/payloadSource.js.map +1 -0
- package/package.json +11 -11
- package/src/builder.ts +7 -7
- package/src/services/payloadSource.ts +157 -0
package/lib/builder.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export type BuilderModules = {
|
|
|
17
17
|
proposerPreferencesTracker: ProposerPreferencesTracker;
|
|
18
18
|
clock: IClock;
|
|
19
19
|
index: BuilderIndex;
|
|
20
|
-
|
|
20
|
+
payloadStore: PayloadStore;
|
|
21
21
|
};
|
|
22
22
|
export type BuilderOptions = {
|
|
23
23
|
logger: Logger;
|
|
@@ -42,8 +42,8 @@ export declare class Builder {
|
|
|
42
42
|
private readonly index;
|
|
43
43
|
private readonly logger;
|
|
44
44
|
private readonly executionFeeRecipient;
|
|
45
|
-
private readonly
|
|
46
|
-
constructor({ opts, builderSigner, blockObserver, builderStatusTracker, proposerPreferencesTracker, clock, index,
|
|
45
|
+
private readonly payloadStore;
|
|
46
|
+
constructor({ opts, builderSigner, blockObserver, builderStatusTracker, proposerPreferencesTracker, clock, index, payloadStore, }: BuilderModules);
|
|
47
47
|
static init(opts: BuilderOptions): Promise<Builder>;
|
|
48
48
|
private onSlot;
|
|
49
49
|
close(): Promise<void>;
|
package/lib/builder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AACxC,OAAO,EAAC,eAAe,EAAwC,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAQ,YAAY,EAAE,MAAM,EAAC,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAC,MAAM,EAAmB,MAAM,iBAAiB,CAAC;AAGzD,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAErC,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAE,OAAO,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAC,oBAAoB,EAAC,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAC,0BAA0B,EAAC,MAAM,0CAA0C,CAAC;AAEpF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,0BAA0B,EAAE,0BAA0B,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AACxC,OAAO,EAAC,eAAe,EAAwC,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAQ,YAAY,EAAE,MAAM,EAAC,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAC,MAAM,EAAmB,MAAM,iBAAiB,CAAC;AAGzD,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAErC,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAE,OAAO,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAC,oBAAoB,EAAC,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAC,0BAA0B,EAAC,MAAM,0CAA0C,CAAC;AAEpF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,0BAA0B,EAAE,0BAA0B,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,eAAe,CAAC;IACjC,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,qBAAqB,EAAE,gBAAgB,CAAC;IACxC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,0BAA0B,EAAE,0BAA0B,CAAC;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAmB;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAE5C,YAAY,EACV,IAAI,EACJ,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,EACL,KAAK,EACL,YAAY,GACb,EAAE,cAAc,EAuBhB;IAED,OAAa,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA4CxD;YAEa,MAAM;IAKd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;CACF"}
|
package/lib/builder.js
CHANGED
|
@@ -22,8 +22,8 @@ export class Builder {
|
|
|
22
22
|
index;
|
|
23
23
|
logger;
|
|
24
24
|
executionFeeRecipient;
|
|
25
|
-
|
|
26
|
-
constructor({ opts, builderSigner, blockObserver, builderStatusTracker, proposerPreferencesTracker, clock, index,
|
|
25
|
+
payloadStore;
|
|
26
|
+
constructor({ opts, builderSigner, blockObserver, builderStatusTracker, proposerPreferencesTracker, clock, index, payloadStore, }) {
|
|
27
27
|
this.builderSigner = builderSigner;
|
|
28
28
|
this.blockObserver = blockObserver;
|
|
29
29
|
this.builderStatusTracker = builderStatusTracker;
|
|
@@ -32,7 +32,7 @@ export class Builder {
|
|
|
32
32
|
this.controller = opts.abortController;
|
|
33
33
|
this.logger = opts.logger;
|
|
34
34
|
this.index = index;
|
|
35
|
-
this.
|
|
35
|
+
this.payloadStore = payloadStore;
|
|
36
36
|
this.executionFeeRecipient = opts.executionFeeRecipient;
|
|
37
37
|
this.clock.runEverySlot(async (slot) => this.onSlot(slot));
|
|
38
38
|
this.clock.runEveryEpoch((epoch) => this.builderStatusTracker.poll(epoch));
|
|
@@ -62,7 +62,7 @@ export class Builder {
|
|
|
62
62
|
const builderStatusTracker = new BuilderStatusTracker(api, logger, index, opts.metrics);
|
|
63
63
|
const blockObserver = new BlockObserver(config, logger, api);
|
|
64
64
|
const proposerPreferencesTracker = new ProposerPreferencesTracker(api, logger);
|
|
65
|
-
const
|
|
65
|
+
const payloadStore = new PayloadStore();
|
|
66
66
|
return new Builder({
|
|
67
67
|
opts,
|
|
68
68
|
builderSigner,
|
|
@@ -71,11 +71,11 @@ export class Builder {
|
|
|
71
71
|
proposerPreferencesTracker,
|
|
72
72
|
clock,
|
|
73
73
|
index,
|
|
74
|
-
|
|
74
|
+
payloadStore,
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
77
|
async onSlot(slot) {
|
|
78
|
-
this.
|
|
78
|
+
this.payloadStore.prune(slot);
|
|
79
79
|
this.proposerPreferencesTracker.prune(slot);
|
|
80
80
|
}
|
|
81
81
|
async close() {
|
package/lib/builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,iBAAiB,EAAE,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAC,KAAK,EAAuB,MAAM,4BAA4B,CAAC;AAEvE,OAAO,EAAS,KAAK,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAC,sBAAsB,EAAC,MAAM,eAAe,CAAC;AAErD,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAC,aAAa,EAAU,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAC,oBAAoB,EAAC,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAC,0BAA0B,EAAC,MAAM,0CAA0C,CAAC;AAwBpF;;GAEG;AACH,MAAM,OAAO,OAAO;IACT,aAAa,CAAgB;IAC7B,0BAA0B,CAA6B;IAC/C,aAAa,CAAgB;IAC7B,oBAAoB,CAAuB;IAC3C,UAAU,CAAkB;IAC5B,KAAK,CAAS;IACd,KAAK,CAAe;IACpB,MAAM,CAAS;IACf,qBAAqB,CAAmB;IACxC,
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { ForkPostGloas } from "@lodestar/params";
|
|
2
|
+
import type { BlobsBundle, ColumnIndex, ExecutionPayload, ExecutionRequests, RootHex, SSEPayloadAttributes } from "@lodestar/types";
|
|
3
|
+
import { LodestarError } from "@lodestar/utils";
|
|
4
|
+
export type PayloadId = string;
|
|
5
|
+
export type ForkchoiceState = {
|
|
6
|
+
headBlockHash: RootHex;
|
|
7
|
+
safeBlockHash: RootHex;
|
|
8
|
+
finalizedBlockHash: RootHex;
|
|
9
|
+
};
|
|
10
|
+
export type PayloadAttributes = SSEPayloadAttributes<ForkPostGloas>["payloadAttributes"];
|
|
11
|
+
export type BuildRequest = {
|
|
12
|
+
fork: ForkPostGloas;
|
|
13
|
+
forkchoiceState: ForkchoiceState;
|
|
14
|
+
payloadAttributes: PayloadAttributes;
|
|
15
|
+
};
|
|
16
|
+
export type BuildHandle = {
|
|
17
|
+
sourceId: string;
|
|
18
|
+
fork: ForkPostGloas;
|
|
19
|
+
payloadId: PayloadId;
|
|
20
|
+
};
|
|
21
|
+
export type BuiltPayload = {
|
|
22
|
+
sourceId: string;
|
|
23
|
+
fork: ForkPostGloas;
|
|
24
|
+
executionPayload: ExecutionPayload<ForkPostGloas>;
|
|
25
|
+
executionRequests: ExecutionRequests<ForkPostGloas>;
|
|
26
|
+
blobsBundle: BlobsBundle<ForkPostGloas>;
|
|
27
|
+
executionPayloadValue: bigint;
|
|
28
|
+
};
|
|
29
|
+
export type EnginePayloadResult = {
|
|
30
|
+
executionPayload: ExecutionPayload<ForkPostGloas>;
|
|
31
|
+
executionPayloadValue: bigint;
|
|
32
|
+
blobsBundle?: BlobsBundle<ForkPostGloas>;
|
|
33
|
+
executionRequests?: ExecutionRequests<ForkPostGloas>;
|
|
34
|
+
};
|
|
35
|
+
/** Narrow Engine boundary whose transport owns serialization, retries, and request execution. */
|
|
36
|
+
export interface PayloadSourceEngine {
|
|
37
|
+
notifyForkchoiceUpdate(fork: ForkPostGloas, headBlockHash: RootHex, safeBlockHash: RootHex, finalizedBlockHash: RootHex, payloadAttributes: PayloadAttributes, custodyColumns: ColumnIndex[] | null, signal: AbortSignal): Promise<PayloadId | null>;
|
|
38
|
+
getPayload(fork: ForkPostGloas, payloadId: PayloadId, signal: AbortSignal): Promise<EnginePayloadResult>;
|
|
39
|
+
}
|
|
40
|
+
/** Source that prepares and retrieves complete execution payloads without owning build scheduling policy. */
|
|
41
|
+
export interface PayloadSource {
|
|
42
|
+
readonly id: string;
|
|
43
|
+
prepare(request: BuildRequest, signal: AbortSignal): Promise<BuildHandle>;
|
|
44
|
+
getPayload(handle: BuildHandle, signal: AbortSignal): Promise<BuiltPayload>;
|
|
45
|
+
}
|
|
46
|
+
export declare enum PayloadSourceErrorCode {
|
|
47
|
+
NO_PAYLOAD_ID = "PAYLOAD_SOURCE_ERROR_NO_PAYLOAD_ID",
|
|
48
|
+
MISSING_BLOBS_BUNDLE = "PAYLOAD_SOURCE_ERROR_MISSING_BLOBS_BUNDLE",
|
|
49
|
+
MISSING_EXECUTION_REQUESTS = "PAYLOAD_SOURCE_ERROR_MISSING_EXECUTION_REQUESTS"
|
|
50
|
+
}
|
|
51
|
+
export type PayloadSourceErrorType = {
|
|
52
|
+
code: PayloadSourceErrorCode.NO_PAYLOAD_ID;
|
|
53
|
+
sourceId: string;
|
|
54
|
+
} | {
|
|
55
|
+
code: PayloadSourceErrorCode.MISSING_BLOBS_BUNDLE | PayloadSourceErrorCode.MISSING_EXECUTION_REQUESTS;
|
|
56
|
+
sourceId: string;
|
|
57
|
+
payloadId: PayloadId;
|
|
58
|
+
};
|
|
59
|
+
export declare class PayloadSourceError extends LodestarError<PayloadSourceErrorType> {
|
|
60
|
+
}
|
|
61
|
+
/** Payload source backed by an injected Engine boundary. Engine ownership and lifecycle remain caller policy. */
|
|
62
|
+
export declare class EnginePayloadSource implements PayloadSource {
|
|
63
|
+
readonly id: string;
|
|
64
|
+
private readonly engine;
|
|
65
|
+
constructor(id: string, engine: PayloadSourceEngine);
|
|
66
|
+
prepare(request: BuildRequest, signal: AbortSignal): Promise<BuildHandle>;
|
|
67
|
+
getPayload(handle: BuildHandle, signal: AbortSignal): Promise<BuiltPayload>;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=payloadSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payloadSource.d.ts","sourceRoot":"","sources":["../../src/services/payloadSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { LodestarError } from "@lodestar/utils";
|
|
2
|
+
export var PayloadSourceErrorCode;
|
|
3
|
+
(function (PayloadSourceErrorCode) {
|
|
4
|
+
PayloadSourceErrorCode["NO_PAYLOAD_ID"] = "PAYLOAD_SOURCE_ERROR_NO_PAYLOAD_ID";
|
|
5
|
+
PayloadSourceErrorCode["MISSING_BLOBS_BUNDLE"] = "PAYLOAD_SOURCE_ERROR_MISSING_BLOBS_BUNDLE";
|
|
6
|
+
PayloadSourceErrorCode["MISSING_EXECUTION_REQUESTS"] = "PAYLOAD_SOURCE_ERROR_MISSING_EXECUTION_REQUESTS";
|
|
7
|
+
})(PayloadSourceErrorCode || (PayloadSourceErrorCode = {}));
|
|
8
|
+
export class PayloadSourceError extends LodestarError {
|
|
9
|
+
}
|
|
10
|
+
/** Payload source backed by an injected Engine boundary. Engine ownership and lifecycle remain caller policy. */
|
|
11
|
+
export class EnginePayloadSource {
|
|
12
|
+
id;
|
|
13
|
+
engine;
|
|
14
|
+
constructor(id, engine) {
|
|
15
|
+
this.id = id;
|
|
16
|
+
this.engine = engine;
|
|
17
|
+
}
|
|
18
|
+
async prepare(request, signal) {
|
|
19
|
+
const { headBlockHash, safeBlockHash, finalizedBlockHash } = request.forkchoiceState;
|
|
20
|
+
const payloadId = await this.engine.notifyForkchoiceUpdate(request.fork, headBlockHash, safeBlockHash, finalizedBlockHash, request.payloadAttributes,
|
|
21
|
+
// The builder does not custody or sample data columns, so it never provides a custody set.
|
|
22
|
+
// A null custody set leaves the execution client's blobpool sampling set untouched, which is
|
|
23
|
+
// also what the spec's own build call does (`prepare_execution_payload` passes `custody_columns=None`).
|
|
24
|
+
null, signal);
|
|
25
|
+
if (payloadId === null) {
|
|
26
|
+
throw new PayloadSourceError({ code: PayloadSourceErrorCode.NO_PAYLOAD_ID, sourceId: this.id }, `Execution client did not return a payload ID sourceId=${this.id}`);
|
|
27
|
+
}
|
|
28
|
+
return { sourceId: this.id, fork: request.fork, payloadId };
|
|
29
|
+
}
|
|
30
|
+
async getPayload(handle, signal) {
|
|
31
|
+
const { executionPayload, executionPayloadValue, blobsBundle, executionRequests } = await this.engine.getPayload(handle.fork, handle.payloadId, signal);
|
|
32
|
+
if (blobsBundle === undefined) {
|
|
33
|
+
throw new PayloadSourceError({
|
|
34
|
+
code: PayloadSourceErrorCode.MISSING_BLOBS_BUNDLE,
|
|
35
|
+
sourceId: this.id,
|
|
36
|
+
payloadId: handle.payloadId,
|
|
37
|
+
}, `Execution client did not return a blobs bundle sourceId=${this.id} payloadId=${handle.payloadId}`);
|
|
38
|
+
}
|
|
39
|
+
if (executionRequests === undefined) {
|
|
40
|
+
throw new PayloadSourceError({
|
|
41
|
+
code: PayloadSourceErrorCode.MISSING_EXECUTION_REQUESTS,
|
|
42
|
+
sourceId: this.id,
|
|
43
|
+
payloadId: handle.payloadId,
|
|
44
|
+
}, `Execution client did not return execution requests sourceId=${this.id} payloadId=${handle.payloadId}`);
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
sourceId: this.id,
|
|
48
|
+
fork: handle.fork,
|
|
49
|
+
executionPayload,
|
|
50
|
+
executionRequests,
|
|
51
|
+
blobsBundle,
|
|
52
|
+
executionPayloadValue,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=payloadSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payloadSource.js","sourceRoot":"","sources":["../../src/services/payloadSource.ts"],"names":[],"mappings":"AASA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AA6D9C,MAAM,CAAN,IAAY,sBAIX;AAJD,WAAY,sBAAsB;IAChC,8EAAoD,CAAA;IACpD,4FAAkE,CAAA;IAClE,wGAA8E,CAAA;AAChF,CAAC,EAJW,sBAAsB,KAAtB,sBAAsB,QAIjC;AAUD,MAAM,OAAO,kBAAmB,SAAQ,aAAqC;CAAG;AAEhF,iHAAiH;AACjH,MAAM,OAAO,mBAAmB;IAEnB,EAAE;IACM,MAAM;IAFzB,YACW,EAAU,EACF,MAA2B;kBADnC,EAAE;sBACM,MAAM;IACtB,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAAqB,EAAE,MAAmB;QACtD,MAAM,EAAC,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAC,GAAG,OAAO,CAAC,eAAe,CAAC;QACnF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,sBAAsB,CACxD,OAAO,CAAC,IAAI,EACZ,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,OAAO,CAAC,iBAAiB;QACzB,2FAA2F;QAC3F,6FAA6F;QAC7F,wGAAwG;QACxG,IAAI,EACJ,MAAM,CACP,CAAC;QAEF,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,kBAAkB,CAC1B,EAAC,IAAI,EAAE,sBAAsB,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAC,EAC/D,yDAAyD,IAAI,CAAC,EAAE,EAAE,CACnE,CAAC;QACJ,CAAC;QAED,OAAO,EAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAmB,EAAE,MAAmB;QACvD,MAAM,EAAC,gBAAgB,EAAE,qBAAqB,EAAE,WAAW,EAAE,iBAAiB,EAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAC5G,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,SAAS,EAChB,MAAM,CACP,CAAC;QAEF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,kBAAkB,CAC1B;gBACE,IAAI,EAAE,sBAAsB,CAAC,oBAAoB;gBACjD,QAAQ,EAAE,IAAI,CAAC,EAAE;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,EACD,2DAA2D,IAAI,CAAC,EAAE,cAAc,MAAM,CAAC,SAAS,EAAE,CACnG,CAAC;QACJ,CAAC;QAED,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,kBAAkB,CAC1B;gBACE,IAAI,EAAE,sBAAsB,CAAC,0BAA0B;gBACvD,QAAQ,EAAE,IAAI,CAAC,EAAE;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,EACD,+DAA+D,IAAI,CAAC,EAAE,cAAc,MAAM,CAAC,SAAS,EAAE,CACvG,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,EAAE;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,gBAAgB;YAChB,iBAAiB;YACjB,WAAW;YACX,qBAAqB;SACtB,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodestar/builder",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.49.0-dev.04dd7ca9f2",
|
|
4
4
|
"description": "A Typescript implementation of the builder client",
|
|
5
5
|
"author": "ChainSafe Systems",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -47,17 +47,17 @@
|
|
|
47
47
|
],
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@chainsafe/lodestar-z": "catalog:",
|
|
50
|
-
"@chainsafe/ssz": "^1.
|
|
51
|
-
"@lodestar/api": "^1.
|
|
52
|
-
"@lodestar/config": "^1.
|
|
53
|
-
"@lodestar/params": "^1.
|
|
54
|
-
"@lodestar/state-transition": "^1.
|
|
55
|
-
"@lodestar/types": "^1.
|
|
56
|
-
"@lodestar/utils": "^1.
|
|
50
|
+
"@chainsafe/ssz": "^1.8.0",
|
|
51
|
+
"@lodestar/api": "^1.49.0-dev.04dd7ca9f2",
|
|
52
|
+
"@lodestar/config": "^1.49.0-dev.04dd7ca9f2",
|
|
53
|
+
"@lodestar/params": "^1.49.0-dev.04dd7ca9f2",
|
|
54
|
+
"@lodestar/state-transition": "^1.49.0-dev.04dd7ca9f2",
|
|
55
|
+
"@lodestar/types": "^1.49.0-dev.04dd7ca9f2",
|
|
56
|
+
"@lodestar/utils": "^1.49.0-dev.04dd7ca9f2"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@lodestar/logger": "^1.
|
|
60
|
-
"@lodestar/test-utils": "^1.
|
|
59
|
+
"@lodestar/logger": "^1.49.0-dev.04dd7ca9f2",
|
|
60
|
+
"@lodestar/test-utils": "^1.49.0-dev.04dd7ca9f2"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "35c4c766f920e72ff449f32aabd0bf92b76e180e"
|
|
63
63
|
}
|
package/src/builder.ts
CHANGED
|
@@ -21,7 +21,7 @@ export type BuilderModules = {
|
|
|
21
21
|
proposerPreferencesTracker: ProposerPreferencesTracker;
|
|
22
22
|
clock: IClock;
|
|
23
23
|
index: BuilderIndex;
|
|
24
|
-
|
|
24
|
+
payloadStore: PayloadStore;
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
export type BuilderOptions = {
|
|
@@ -48,7 +48,7 @@ export class Builder {
|
|
|
48
48
|
private readonly index: BuilderIndex;
|
|
49
49
|
private readonly logger: Logger;
|
|
50
50
|
private readonly executionFeeRecipient: ExecutionAddress;
|
|
51
|
-
private readonly
|
|
51
|
+
private readonly payloadStore: PayloadStore;
|
|
52
52
|
|
|
53
53
|
constructor({
|
|
54
54
|
opts,
|
|
@@ -58,7 +58,7 @@ export class Builder {
|
|
|
58
58
|
proposerPreferencesTracker,
|
|
59
59
|
clock,
|
|
60
60
|
index,
|
|
61
|
-
|
|
61
|
+
payloadStore,
|
|
62
62
|
}: BuilderModules) {
|
|
63
63
|
this.builderSigner = builderSigner;
|
|
64
64
|
this.blockObserver = blockObserver;
|
|
@@ -68,7 +68,7 @@ export class Builder {
|
|
|
68
68
|
this.controller = opts.abortController;
|
|
69
69
|
this.logger = opts.logger;
|
|
70
70
|
this.index = index;
|
|
71
|
-
this.
|
|
71
|
+
this.payloadStore = payloadStore;
|
|
72
72
|
|
|
73
73
|
this.executionFeeRecipient = opts.executionFeeRecipient;
|
|
74
74
|
|
|
@@ -116,7 +116,7 @@ export class Builder {
|
|
|
116
116
|
const blockObserver = new BlockObserver(config, logger, api);
|
|
117
117
|
const proposerPreferencesTracker = new ProposerPreferencesTracker(api, logger);
|
|
118
118
|
|
|
119
|
-
const
|
|
119
|
+
const payloadStore = new PayloadStore();
|
|
120
120
|
|
|
121
121
|
return new Builder({
|
|
122
122
|
opts,
|
|
@@ -126,12 +126,12 @@ export class Builder {
|
|
|
126
126
|
proposerPreferencesTracker,
|
|
127
127
|
clock,
|
|
128
128
|
index,
|
|
129
|
-
|
|
129
|
+
payloadStore,
|
|
130
130
|
});
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
private async onSlot(slot: number): Promise<void> {
|
|
134
|
-
this.
|
|
134
|
+
this.payloadStore.prune(slot);
|
|
135
135
|
this.proposerPreferencesTracker.prune(slot);
|
|
136
136
|
}
|
|
137
137
|
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type {ForkPostGloas} from "@lodestar/params";
|
|
2
|
+
import type {
|
|
3
|
+
BlobsBundle,
|
|
4
|
+
ColumnIndex,
|
|
5
|
+
ExecutionPayload,
|
|
6
|
+
ExecutionRequests,
|
|
7
|
+
RootHex,
|
|
8
|
+
SSEPayloadAttributes,
|
|
9
|
+
} from "@lodestar/types";
|
|
10
|
+
import {LodestarError} from "@lodestar/utils";
|
|
11
|
+
|
|
12
|
+
export type PayloadId = string;
|
|
13
|
+
|
|
14
|
+
export type ForkchoiceState = {
|
|
15
|
+
headBlockHash: RootHex;
|
|
16
|
+
safeBlockHash: RootHex;
|
|
17
|
+
finalizedBlockHash: RootHex;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type PayloadAttributes = SSEPayloadAttributes<ForkPostGloas>["payloadAttributes"];
|
|
21
|
+
|
|
22
|
+
export type BuildRequest = {
|
|
23
|
+
fork: ForkPostGloas;
|
|
24
|
+
forkchoiceState: ForkchoiceState;
|
|
25
|
+
payloadAttributes: PayloadAttributes;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type BuildHandle = {
|
|
29
|
+
sourceId: string;
|
|
30
|
+
fork: ForkPostGloas;
|
|
31
|
+
payloadId: PayloadId;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export type BuiltPayload = {
|
|
35
|
+
sourceId: string;
|
|
36
|
+
fork: ForkPostGloas;
|
|
37
|
+
executionPayload: ExecutionPayload<ForkPostGloas>;
|
|
38
|
+
executionRequests: ExecutionRequests<ForkPostGloas>;
|
|
39
|
+
blobsBundle: BlobsBundle<ForkPostGloas>;
|
|
40
|
+
executionPayloadValue: bigint;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export type EnginePayloadResult = {
|
|
44
|
+
executionPayload: ExecutionPayload<ForkPostGloas>;
|
|
45
|
+
executionPayloadValue: bigint;
|
|
46
|
+
blobsBundle?: BlobsBundle<ForkPostGloas>;
|
|
47
|
+
executionRequests?: ExecutionRequests<ForkPostGloas>;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/** Narrow Engine boundary whose transport owns serialization, retries, and request execution. */
|
|
51
|
+
export interface PayloadSourceEngine {
|
|
52
|
+
notifyForkchoiceUpdate(
|
|
53
|
+
fork: ForkPostGloas,
|
|
54
|
+
headBlockHash: RootHex,
|
|
55
|
+
safeBlockHash: RootHex,
|
|
56
|
+
finalizedBlockHash: RootHex,
|
|
57
|
+
payloadAttributes: PayloadAttributes,
|
|
58
|
+
custodyColumns: ColumnIndex[] | null,
|
|
59
|
+
signal: AbortSignal
|
|
60
|
+
): Promise<PayloadId | null>;
|
|
61
|
+
getPayload(fork: ForkPostGloas, payloadId: PayloadId, signal: AbortSignal): Promise<EnginePayloadResult>;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Source that prepares and retrieves complete execution payloads without owning build scheduling policy. */
|
|
65
|
+
export interface PayloadSource {
|
|
66
|
+
readonly id: string;
|
|
67
|
+
prepare(request: BuildRequest, signal: AbortSignal): Promise<BuildHandle>;
|
|
68
|
+
getPayload(handle: BuildHandle, signal: AbortSignal): Promise<BuiltPayload>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export enum PayloadSourceErrorCode {
|
|
72
|
+
NO_PAYLOAD_ID = "PAYLOAD_SOURCE_ERROR_NO_PAYLOAD_ID",
|
|
73
|
+
MISSING_BLOBS_BUNDLE = "PAYLOAD_SOURCE_ERROR_MISSING_BLOBS_BUNDLE",
|
|
74
|
+
MISSING_EXECUTION_REQUESTS = "PAYLOAD_SOURCE_ERROR_MISSING_EXECUTION_REQUESTS",
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export type PayloadSourceErrorType =
|
|
78
|
+
| {code: PayloadSourceErrorCode.NO_PAYLOAD_ID; sourceId: string}
|
|
79
|
+
| {
|
|
80
|
+
code: PayloadSourceErrorCode.MISSING_BLOBS_BUNDLE | PayloadSourceErrorCode.MISSING_EXECUTION_REQUESTS;
|
|
81
|
+
sourceId: string;
|
|
82
|
+
payloadId: PayloadId;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export class PayloadSourceError extends LodestarError<PayloadSourceErrorType> {}
|
|
86
|
+
|
|
87
|
+
/** Payload source backed by an injected Engine boundary. Engine ownership and lifecycle remain caller policy. */
|
|
88
|
+
export class EnginePayloadSource implements PayloadSource {
|
|
89
|
+
constructor(
|
|
90
|
+
readonly id: string,
|
|
91
|
+
private readonly engine: PayloadSourceEngine
|
|
92
|
+
) {}
|
|
93
|
+
|
|
94
|
+
async prepare(request: BuildRequest, signal: AbortSignal): Promise<BuildHandle> {
|
|
95
|
+
const {headBlockHash, safeBlockHash, finalizedBlockHash} = request.forkchoiceState;
|
|
96
|
+
const payloadId = await this.engine.notifyForkchoiceUpdate(
|
|
97
|
+
request.fork,
|
|
98
|
+
headBlockHash,
|
|
99
|
+
safeBlockHash,
|
|
100
|
+
finalizedBlockHash,
|
|
101
|
+
request.payloadAttributes,
|
|
102
|
+
// The builder does not custody or sample data columns, so it never provides a custody set.
|
|
103
|
+
// A null custody set leaves the execution client's blobpool sampling set untouched, which is
|
|
104
|
+
// also what the spec's own build call does (`prepare_execution_payload` passes `custody_columns=None`).
|
|
105
|
+
null,
|
|
106
|
+
signal
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
if (payloadId === null) {
|
|
110
|
+
throw new PayloadSourceError(
|
|
111
|
+
{code: PayloadSourceErrorCode.NO_PAYLOAD_ID, sourceId: this.id},
|
|
112
|
+
`Execution client did not return a payload ID sourceId=${this.id}`
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return {sourceId: this.id, fork: request.fork, payloadId};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async getPayload(handle: BuildHandle, signal: AbortSignal): Promise<BuiltPayload> {
|
|
120
|
+
const {executionPayload, executionPayloadValue, blobsBundle, executionRequests} = await this.engine.getPayload(
|
|
121
|
+
handle.fork,
|
|
122
|
+
handle.payloadId,
|
|
123
|
+
signal
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
if (blobsBundle === undefined) {
|
|
127
|
+
throw new PayloadSourceError(
|
|
128
|
+
{
|
|
129
|
+
code: PayloadSourceErrorCode.MISSING_BLOBS_BUNDLE,
|
|
130
|
+
sourceId: this.id,
|
|
131
|
+
payloadId: handle.payloadId,
|
|
132
|
+
},
|
|
133
|
+
`Execution client did not return a blobs bundle sourceId=${this.id} payloadId=${handle.payloadId}`
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (executionRequests === undefined) {
|
|
138
|
+
throw new PayloadSourceError(
|
|
139
|
+
{
|
|
140
|
+
code: PayloadSourceErrorCode.MISSING_EXECUTION_REQUESTS,
|
|
141
|
+
sourceId: this.id,
|
|
142
|
+
payloadId: handle.payloadId,
|
|
143
|
+
},
|
|
144
|
+
`Execution client did not return execution requests sourceId=${this.id} payloadId=${handle.payloadId}`
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return {
|
|
149
|
+
sourceId: this.id,
|
|
150
|
+
fork: handle.fork,
|
|
151
|
+
executionPayload,
|
|
152
|
+
executionRequests,
|
|
153
|
+
blobsBundle,
|
|
154
|
+
executionPayloadValue,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|