@lodestar/beacon-node 1.30.0-dev.d8bc6b1378 → 1.30.0-dev.d92238fd84
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/blocks/blockInput/blockInput.d.ts +164 -0
- package/lib/chain/blocks/blockInput/blockInput.js +522 -0
- package/lib/chain/blocks/blockInput/blockInput.js.map +1 -0
- package/lib/chain/blocks/blockInput/errors.d.ts +38 -0
- package/lib/chain/blocks/blockInput/errors.js +17 -0
- package/lib/chain/blocks/blockInput/errors.js.map +1 -0
- package/lib/chain/blocks/blockInput/index.d.ts +4 -0
- package/lib/chain/blocks/blockInput/index.js +4 -0
- package/lib/chain/blocks/blockInput/index.js.map +1 -0
- package/lib/chain/blocks/blockInput/types.d.ts +116 -0
- package/lib/chain/blocks/blockInput/types.js +19 -0
- package/lib/chain/blocks/blockInput/types.js.map +1 -0
- package/package.json +14 -14
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { ForkName, ForkPreDeneb } from "@lodestar/params";
|
|
2
|
+
import { BlobIndex, ColumnIndex, SignedBeaconBlock, Slot, deneb, fulu } from "@lodestar/types";
|
|
3
|
+
import { VersionedHashes } from "../../../execution/index.js";
|
|
4
|
+
import { AddBlob, AddBlock, AddColumn, BlobMeta, BlobWithSource, BlockInputInit, ColumnMeta, ColumnWithSource, CreateBlockInputMeta, DAData, DAType, IBlockInput, LogMetaBasic, LogMetaBlobs, LogMetaColumns, PromiseParts, SourceMeta } from "./types.js";
|
|
5
|
+
export type BlockInput = BlockInputPreData | BlockInputBlobs | BlockInputColumns;
|
|
6
|
+
export declare function createPromise<T>(): PromiseParts<T>;
|
|
7
|
+
type BlockInputState<F extends ForkName> = {
|
|
8
|
+
hasBlock: false;
|
|
9
|
+
hasAllData: false;
|
|
10
|
+
} | {
|
|
11
|
+
hasBlock: false;
|
|
12
|
+
hasAllData: true;
|
|
13
|
+
} | {
|
|
14
|
+
hasBlock: true;
|
|
15
|
+
hasAllData: false;
|
|
16
|
+
block: SignedBeaconBlock<F>;
|
|
17
|
+
source: SourceMeta;
|
|
18
|
+
} | {
|
|
19
|
+
hasBlock: true;
|
|
20
|
+
hasAllData: true;
|
|
21
|
+
block: SignedBeaconBlock<F>;
|
|
22
|
+
source: SourceMeta;
|
|
23
|
+
timeCompleteSec: number;
|
|
24
|
+
};
|
|
25
|
+
declare abstract class AbstractBlockInput<F extends ForkName = ForkName, TData extends DAData = DAData> implements IBlockInput<F, TData> {
|
|
26
|
+
abstract type: DAType;
|
|
27
|
+
daOutOfRange: boolean;
|
|
28
|
+
timeCreated: number;
|
|
29
|
+
forkName: ForkName;
|
|
30
|
+
slot: Slot;
|
|
31
|
+
blockRootHex: string;
|
|
32
|
+
parentRootHex: string;
|
|
33
|
+
abstract state: BlockInputState<F>;
|
|
34
|
+
protected blockPromise: PromiseParts<SignedBeaconBlock<F>>;
|
|
35
|
+
protected dataPromise: PromiseParts<TData>;
|
|
36
|
+
constructor(init: BlockInputInit);
|
|
37
|
+
abstract addBlock(props: AddBlock<F>): void;
|
|
38
|
+
hasBlock(): boolean;
|
|
39
|
+
getBlock(): SignedBeaconBlock<F>;
|
|
40
|
+
getBlockSource(): SourceMeta;
|
|
41
|
+
hasAllData(): boolean;
|
|
42
|
+
hasBlockAndAllData(): boolean;
|
|
43
|
+
getLogMeta(): LogMetaBasic;
|
|
44
|
+
getTimeComplete(): number;
|
|
45
|
+
waitForBlock(timeout: number, signal?: AbortSignal): Promise<SignedBeaconBlock<F>>;
|
|
46
|
+
waitForAllData(timeout: number, signal?: AbortSignal): Promise<TData>;
|
|
47
|
+
waitForBlockAndAllData(timeout: number, signal?: AbortSignal): Promise<this>;
|
|
48
|
+
}
|
|
49
|
+
type BlockInputPreDataState = {
|
|
50
|
+
hasBlock: true;
|
|
51
|
+
hasAllData: true;
|
|
52
|
+
block: SignedBeaconBlock<ForkPreDeneb>;
|
|
53
|
+
source: SourceMeta;
|
|
54
|
+
timeCompleteSec: number;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Pre-DA, BlockInput only has a single state.
|
|
58
|
+
* - the block simply exists
|
|
59
|
+
*/
|
|
60
|
+
export declare class BlockInputPreData extends AbstractBlockInput<ForkPreDeneb, null> {
|
|
61
|
+
type: DAType.PreData;
|
|
62
|
+
state: BlockInputPreDataState;
|
|
63
|
+
private constructor();
|
|
64
|
+
static createFromBlock(props: AddBlock & CreateBlockInputMeta): BlockInputPreData;
|
|
65
|
+
addBlock(_: AddBlock): void;
|
|
66
|
+
}
|
|
67
|
+
export type ForkBlobsDA = ForkName.deneb | ForkName.electra;
|
|
68
|
+
type BlockInputBlobsState = {
|
|
69
|
+
hasBlock: true;
|
|
70
|
+
hasAllData: true;
|
|
71
|
+
versionedHashes: VersionedHashes;
|
|
72
|
+
block: SignedBeaconBlock<ForkBlobsDA>;
|
|
73
|
+
source: SourceMeta;
|
|
74
|
+
timeCompleteSec: number;
|
|
75
|
+
} | {
|
|
76
|
+
hasBlock: true;
|
|
77
|
+
hasAllData: false;
|
|
78
|
+
versionedHashes: VersionedHashes;
|
|
79
|
+
block: SignedBeaconBlock<ForkBlobsDA>;
|
|
80
|
+
source: SourceMeta;
|
|
81
|
+
} | {
|
|
82
|
+
hasBlock: false;
|
|
83
|
+
hasAllData: false;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* With blobs, BlockInput has several states:
|
|
87
|
+
* - The block is seen and all blobs are seen
|
|
88
|
+
* - The block is seen and all blobs are not yet seen
|
|
89
|
+
* - The block is yet not seen and its unknown if all blobs are seen
|
|
90
|
+
*/
|
|
91
|
+
export declare class BlockInputBlobs extends AbstractBlockInput<ForkBlobsDA, deneb.BlobSidecars> {
|
|
92
|
+
type: DAType.Blobs;
|
|
93
|
+
state: BlockInputBlobsState;
|
|
94
|
+
private blobsCache;
|
|
95
|
+
private constructor();
|
|
96
|
+
static createFromBlock(props: AddBlock<ForkBlobsDA> & CreateBlockInputMeta): BlockInputBlobs;
|
|
97
|
+
static createFromBlob(props: AddBlob & CreateBlockInputMeta): BlockInputBlobs;
|
|
98
|
+
getLogMeta(): LogMetaBlobs;
|
|
99
|
+
addBlock({ blockRootHex, block, source }: AddBlock<ForkBlobsDA>): void;
|
|
100
|
+
hasBlob(blobIndex: BlobIndex): boolean;
|
|
101
|
+
addBlob({ blockRootHex, blobSidecar, source, peerIdStr, seenTimestampSec }: AddBlob): void;
|
|
102
|
+
getVersionedHashes(): VersionedHashes;
|
|
103
|
+
getMissingBlobMeta(): BlobMeta[];
|
|
104
|
+
getAllBlobsWithSource(): BlobWithSource[];
|
|
105
|
+
getBlobs(): deneb.BlobSidecars;
|
|
106
|
+
}
|
|
107
|
+
export type ForkColumnsDA = ForkName.fulu;
|
|
108
|
+
type BlockInputColumnsState = {
|
|
109
|
+
hasBlock: true;
|
|
110
|
+
hasAllData: true;
|
|
111
|
+
versionedHashes: VersionedHashes;
|
|
112
|
+
block: SignedBeaconBlock<ForkColumnsDA>;
|
|
113
|
+
source: SourceMeta;
|
|
114
|
+
timeCompleteSec: number;
|
|
115
|
+
} | {
|
|
116
|
+
hasBlock: true;
|
|
117
|
+
hasAllData: false;
|
|
118
|
+
versionedHashes: VersionedHashes;
|
|
119
|
+
block: SignedBeaconBlock<ForkColumnsDA>;
|
|
120
|
+
source: SourceMeta;
|
|
121
|
+
} | {
|
|
122
|
+
hasBlock: false;
|
|
123
|
+
hasAllData: true;
|
|
124
|
+
versionedHashes: VersionedHashes;
|
|
125
|
+
} | {
|
|
126
|
+
hasBlock: false;
|
|
127
|
+
hasAllData: false;
|
|
128
|
+
versionedHashes: VersionedHashes;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* With columns, BlockInput has several states:
|
|
132
|
+
* - The block is seen and all required sampled columns are seen
|
|
133
|
+
* - The block is seen and all required sampled columns are not yet seen
|
|
134
|
+
* - The block is not yet seen and all required sampled columns are seen
|
|
135
|
+
* - The block is not yet seen and all required sampled columns are not yet seen
|
|
136
|
+
*/
|
|
137
|
+
export declare class BlockInputColumns extends AbstractBlockInput<ForkColumnsDA, fulu.DataColumnSidecars> {
|
|
138
|
+
type: DAType.Columns;
|
|
139
|
+
state: BlockInputColumnsState;
|
|
140
|
+
private columnsCache;
|
|
141
|
+
private readonly sampledColumns;
|
|
142
|
+
private readonly custodyColumns;
|
|
143
|
+
private constructor();
|
|
144
|
+
static createFromBlock(props: AddBlock<ForkColumnsDA> & CreateBlockInputMeta & {
|
|
145
|
+
sampledColumns: ColumnIndex[];
|
|
146
|
+
custodyColumns: ColumnIndex[];
|
|
147
|
+
}): BlockInputColumns;
|
|
148
|
+
static createFromColumn(props: AddColumn & CreateBlockInputMeta & {
|
|
149
|
+
sampledColumns: ColumnIndex[];
|
|
150
|
+
custodyColumns: ColumnIndex[];
|
|
151
|
+
}): BlockInputColumns;
|
|
152
|
+
getLogMeta(): LogMetaColumns;
|
|
153
|
+
addBlock(props: AddBlock<ForkColumnsDA>): void;
|
|
154
|
+
addColumn({ blockRootHex, columnSidecar, source, seenTimestampSec, peerIdStr }: AddColumn): void;
|
|
155
|
+
hasColumn(columnIndex: number): boolean;
|
|
156
|
+
getVersionedHashes(): VersionedHashes;
|
|
157
|
+
getCustodyColumns(): fulu.DataColumnSidecars;
|
|
158
|
+
getSampledColumns(): fulu.DataColumnSidecars;
|
|
159
|
+
getAllColumnsWithSource(): ColumnWithSource[];
|
|
160
|
+
getAllColumns(): fulu.DataColumnSidecars;
|
|
161
|
+
getMissingSampledColumnMeta(): ColumnMeta[];
|
|
162
|
+
}
|
|
163
|
+
export {};
|
|
164
|
+
//# sourceMappingURL=blockInput.d.ts.map
|
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
import { fromHex, prettyBytes, toHex, withTimeout } from "@lodestar/utils";
|
|
2
|
+
import { kzgCommitmentToVersionedHash } from "../../../util/blobs.js";
|
|
3
|
+
import { byteArrayEquals } from "../../../util/bytes.js";
|
|
4
|
+
import { BlockInputError, BlockInputErrorCode } from "./errors.js";
|
|
5
|
+
import { DAType, } from "./types.js";
|
|
6
|
+
export function createPromise() {
|
|
7
|
+
let resolve;
|
|
8
|
+
let reject;
|
|
9
|
+
const promise = new Promise((_resolve, _reject) => {
|
|
10
|
+
resolve = _resolve;
|
|
11
|
+
reject = _reject;
|
|
12
|
+
});
|
|
13
|
+
return {
|
|
14
|
+
promise,
|
|
15
|
+
resolve,
|
|
16
|
+
reject,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
class AbstractBlockInput {
|
|
20
|
+
constructor(init) {
|
|
21
|
+
this.blockPromise = createPromise();
|
|
22
|
+
this.dataPromise = createPromise();
|
|
23
|
+
this.daOutOfRange = init.daOutOfRange;
|
|
24
|
+
this.timeCreated = init.timeCreated;
|
|
25
|
+
this.forkName = init.forkName;
|
|
26
|
+
this.slot = init.slot;
|
|
27
|
+
this.blockRootHex = init.blockRootHex;
|
|
28
|
+
this.parentRootHex = init.parentRootHex;
|
|
29
|
+
}
|
|
30
|
+
hasBlock() {
|
|
31
|
+
return this.state.hasBlock;
|
|
32
|
+
}
|
|
33
|
+
getBlock() {
|
|
34
|
+
if (!this.state.hasBlock) {
|
|
35
|
+
throw new BlockInputError({
|
|
36
|
+
code: BlockInputErrorCode.MISSING_BLOCK,
|
|
37
|
+
blockRoot: this.blockRootHex,
|
|
38
|
+
}, "Cannot getBlock from BlockInput without a block");
|
|
39
|
+
}
|
|
40
|
+
return this.state.block;
|
|
41
|
+
}
|
|
42
|
+
getBlockSource() {
|
|
43
|
+
if (!this.state.hasBlock) {
|
|
44
|
+
throw new BlockInputError({
|
|
45
|
+
code: BlockInputErrorCode.MISSING_BLOCK,
|
|
46
|
+
blockRoot: this.blockRootHex,
|
|
47
|
+
}, "Cannot getBlockSource from BlockInput without a block");
|
|
48
|
+
}
|
|
49
|
+
return this.state.source;
|
|
50
|
+
}
|
|
51
|
+
hasAllData() {
|
|
52
|
+
return this.state.hasAllData;
|
|
53
|
+
}
|
|
54
|
+
hasBlockAndAllData() {
|
|
55
|
+
return this.state.hasBlock && this.state.hasAllData;
|
|
56
|
+
}
|
|
57
|
+
getLogMeta() {
|
|
58
|
+
return {
|
|
59
|
+
blockRoot: prettyBytes(this.blockRootHex),
|
|
60
|
+
slot: this.slot,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
getTimeComplete() {
|
|
64
|
+
if (!this.state.hasBlock || !this.state.hasAllData) {
|
|
65
|
+
throw new BlockInputError({
|
|
66
|
+
code: BlockInputErrorCode.MISSING_TIME_COMPLETE,
|
|
67
|
+
blockRoot: this.blockRootHex,
|
|
68
|
+
}, "Cannot getTimeComplete from BlockInput without a block and data");
|
|
69
|
+
}
|
|
70
|
+
return this.state.timeCompleteSec;
|
|
71
|
+
}
|
|
72
|
+
waitForBlock(timeout, signal) {
|
|
73
|
+
if (!this.state.hasBlock) {
|
|
74
|
+
return withTimeout(() => this.blockPromise.promise, timeout, signal);
|
|
75
|
+
}
|
|
76
|
+
return Promise.resolve(this.state.block);
|
|
77
|
+
}
|
|
78
|
+
waitForAllData(timeout, signal) {
|
|
79
|
+
return withTimeout(() => this.dataPromise.promise, timeout, signal);
|
|
80
|
+
}
|
|
81
|
+
async waitForBlockAndAllData(timeout, signal) {
|
|
82
|
+
if (!this.state.hasBlock || !this.state.hasAllData) {
|
|
83
|
+
await withTimeout(() => Promise.all([this.blockPromise.promise, this.dataPromise.promise]), timeout, signal);
|
|
84
|
+
}
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Pre-DA, BlockInput only has a single state.
|
|
90
|
+
* - the block simply exists
|
|
91
|
+
*/
|
|
92
|
+
export class BlockInputPreData extends AbstractBlockInput {
|
|
93
|
+
constructor(init, state) {
|
|
94
|
+
super(init);
|
|
95
|
+
this.type = DAType.PreData;
|
|
96
|
+
this.state = state;
|
|
97
|
+
}
|
|
98
|
+
static createFromBlock(props) {
|
|
99
|
+
const init = {
|
|
100
|
+
daOutOfRange: props.daOutOfRange,
|
|
101
|
+
timeCreated: props.source.seenTimestampSec,
|
|
102
|
+
forkName: props.forkName,
|
|
103
|
+
slot: props.block.message.slot,
|
|
104
|
+
blockRootHex: props.blockRootHex,
|
|
105
|
+
parentRootHex: toHex(props.block.message.parentRoot),
|
|
106
|
+
};
|
|
107
|
+
const state = {
|
|
108
|
+
hasBlock: true,
|
|
109
|
+
hasAllData: true,
|
|
110
|
+
block: props.block,
|
|
111
|
+
source: props.source,
|
|
112
|
+
timeCompleteSec: props.source.seenTimestampSec,
|
|
113
|
+
};
|
|
114
|
+
return new BlockInputPreData(init, state);
|
|
115
|
+
}
|
|
116
|
+
addBlock(_) {
|
|
117
|
+
throw new BlockInputError({
|
|
118
|
+
code: BlockInputErrorCode.INVALID_CONSTRUCTION,
|
|
119
|
+
blockRoot: this.blockRootHex,
|
|
120
|
+
}, "Cannot addBlock to BlockInputPreData");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* With blobs, BlockInput has several states:
|
|
125
|
+
* - The block is seen and all blobs are seen
|
|
126
|
+
* - The block is seen and all blobs are not yet seen
|
|
127
|
+
* - The block is yet not seen and its unknown if all blobs are seen
|
|
128
|
+
*/
|
|
129
|
+
export class BlockInputBlobs extends AbstractBlockInput {
|
|
130
|
+
constructor(init, state) {
|
|
131
|
+
super(init);
|
|
132
|
+
this.type = DAType.Blobs;
|
|
133
|
+
this.blobsCache = new Map();
|
|
134
|
+
this.state = state;
|
|
135
|
+
}
|
|
136
|
+
static createFromBlock(props) {
|
|
137
|
+
const hasAllData = props.daOutOfRange || props.block.message.body.blobKzgCommitments.length === 0;
|
|
138
|
+
const state = {
|
|
139
|
+
hasBlock: true,
|
|
140
|
+
hasAllData,
|
|
141
|
+
versionedHashes: props.block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash),
|
|
142
|
+
block: props.block,
|
|
143
|
+
source: props.source,
|
|
144
|
+
timeCompleteSec: hasAllData ? props.source.seenTimestampSec : undefined,
|
|
145
|
+
};
|
|
146
|
+
const init = {
|
|
147
|
+
daOutOfRange: props.daOutOfRange,
|
|
148
|
+
timeCreated: props.source.seenTimestampSec,
|
|
149
|
+
forkName: props.forkName,
|
|
150
|
+
slot: props.block.message.slot,
|
|
151
|
+
blockRootHex: props.blockRootHex,
|
|
152
|
+
parentRootHex: toHex(props.block.message.parentRoot),
|
|
153
|
+
};
|
|
154
|
+
const blockInput = new BlockInputBlobs(init, state);
|
|
155
|
+
blockInput.blockPromise.resolve(props.block);
|
|
156
|
+
if (hasAllData) {
|
|
157
|
+
blockInput.dataPromise.resolve([]);
|
|
158
|
+
}
|
|
159
|
+
return blockInput;
|
|
160
|
+
}
|
|
161
|
+
static createFromBlob(props) {
|
|
162
|
+
const state = {
|
|
163
|
+
hasBlock: false,
|
|
164
|
+
hasAllData: false,
|
|
165
|
+
};
|
|
166
|
+
const init = {
|
|
167
|
+
daOutOfRange: props.daOutOfRange,
|
|
168
|
+
timeCreated: props.seenTimestampSec,
|
|
169
|
+
forkName: props.forkName,
|
|
170
|
+
blockRootHex: props.blockRootHex,
|
|
171
|
+
parentRootHex: toHex(props.blobSidecar.signedBlockHeader.message.parentRoot),
|
|
172
|
+
slot: props.blobSidecar.signedBlockHeader.message.slot,
|
|
173
|
+
};
|
|
174
|
+
const blockInput = new BlockInputBlobs(init, state);
|
|
175
|
+
blockInput.blobsCache.set(props.blobSidecar.index, {
|
|
176
|
+
blobSidecar: props.blobSidecar,
|
|
177
|
+
source: props.source,
|
|
178
|
+
seenTimestampSec: props.seenTimestampSec,
|
|
179
|
+
peerIdStr: props.peerIdStr,
|
|
180
|
+
});
|
|
181
|
+
return blockInput;
|
|
182
|
+
}
|
|
183
|
+
getLogMeta() {
|
|
184
|
+
return {
|
|
185
|
+
blockRoot: prettyBytes(this.blockRootHex),
|
|
186
|
+
slot: this.slot,
|
|
187
|
+
expectedBlobs: this.state.hasBlock ? this.state.block.message.body.blobKzgCommitments.length : "unknown",
|
|
188
|
+
receivedBlobs: this.blobsCache.size,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
addBlock({ blockRootHex, block, source }) {
|
|
192
|
+
if (!this.state.hasBlock) {
|
|
193
|
+
throw new BlockInputError({
|
|
194
|
+
code: BlockInputErrorCode.INVALID_CONSTRUCTION,
|
|
195
|
+
blockRoot: this.blockRootHex,
|
|
196
|
+
}, "Cannot addBlock to BlockInputBlobs after it already has a block");
|
|
197
|
+
}
|
|
198
|
+
// this check suffices for checking slot, parentRoot, and forkName
|
|
199
|
+
if (blockRootHex !== this.blockRootHex) {
|
|
200
|
+
throw new BlockInputError({
|
|
201
|
+
code: BlockInputErrorCode.MISMATCHED_ROOT_HEX,
|
|
202
|
+
blockInputRoot: this.blockRootHex,
|
|
203
|
+
mismatchedRoot: blockRootHex,
|
|
204
|
+
source: source.source,
|
|
205
|
+
peerId: `${source.peerIdStr}`,
|
|
206
|
+
}, "addBlock blockRootHex does not match BlockInput.blockRootHex");
|
|
207
|
+
}
|
|
208
|
+
for (const { blobSidecar } of this.blobsCache.values()) {
|
|
209
|
+
if (!blockAndBlobArePaired(block, blobSidecar)) {
|
|
210
|
+
this.blobsCache.delete(blobSidecar.index);
|
|
211
|
+
// TODO: (@matthewkeil) spec says to ignore invalid blobs but should we downscore the peer maybe?
|
|
212
|
+
// this.logger?.error(`Removing blobIndex=${blobSidecar.index} from BlockInput`, {}, err);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const hasAllData = this.blobsCache.size === block.message.body.blobKzgCommitments.length;
|
|
216
|
+
this.state = {
|
|
217
|
+
...this.state,
|
|
218
|
+
hasAllData,
|
|
219
|
+
block,
|
|
220
|
+
versionedHashes: block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash),
|
|
221
|
+
source,
|
|
222
|
+
timeCompleteSec: hasAllData ? source.seenTimestampSec : undefined,
|
|
223
|
+
};
|
|
224
|
+
this.blockPromise.resolve(block);
|
|
225
|
+
if (hasAllData) {
|
|
226
|
+
this.dataPromise.resolve(this.getBlobs());
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
hasBlob(blobIndex) {
|
|
230
|
+
return this.blobsCache.has(blobIndex);
|
|
231
|
+
}
|
|
232
|
+
addBlob({ blockRootHex, blobSidecar, source, peerIdStr, seenTimestampSec }) {
|
|
233
|
+
if (this.state.hasAllData) {
|
|
234
|
+
throw new BlockInputError({
|
|
235
|
+
code: BlockInputErrorCode.INVALID_CONSTRUCTION,
|
|
236
|
+
blockRoot: this.blockRootHex,
|
|
237
|
+
}, "Cannot addBlob to BlockInputBlobs after it already is complete");
|
|
238
|
+
}
|
|
239
|
+
if (this.blobsCache.has(blobSidecar.index)) {
|
|
240
|
+
throw new BlockInputError({
|
|
241
|
+
code: BlockInputErrorCode.INVALID_CONSTRUCTION,
|
|
242
|
+
blockRoot: this.blockRootHex,
|
|
243
|
+
}, "Cannot addBlob to BlockInputBlobs with duplicate blobIndex");
|
|
244
|
+
}
|
|
245
|
+
// this check suffices for checking slot, parentRoot, and forkName
|
|
246
|
+
if (blockRootHex !== this.blockRootHex) {
|
|
247
|
+
throw new BlockInputError({
|
|
248
|
+
code: BlockInputErrorCode.MISMATCHED_ROOT_HEX,
|
|
249
|
+
blockInputRoot: this.blockRootHex,
|
|
250
|
+
mismatchedRoot: blockRootHex,
|
|
251
|
+
source: source,
|
|
252
|
+
peerId: `${peerIdStr}`,
|
|
253
|
+
}, "Blob BeaconBlockHeader blockRootHex does not match BlockInput.blockRootHex");
|
|
254
|
+
}
|
|
255
|
+
if (this.state.hasBlock) {
|
|
256
|
+
assertBlockAndBlobArePaired(this.blockRootHex, this.state.block, blobSidecar);
|
|
257
|
+
}
|
|
258
|
+
this.blobsCache.set(blobSidecar.index, { blobSidecar, source, seenTimestampSec, peerIdStr });
|
|
259
|
+
if (this.state.hasBlock && this.blobsCache.size === this.state.block.message.body.blobKzgCommitments.length) {
|
|
260
|
+
this.state = {
|
|
261
|
+
...this.state,
|
|
262
|
+
hasAllData: true,
|
|
263
|
+
timeCompleteSec: seenTimestampSec,
|
|
264
|
+
};
|
|
265
|
+
this.dataPromise.resolve([...this.blobsCache.values()].map(({ blobSidecar }) => blobSidecar));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
getVersionedHashes() {
|
|
269
|
+
if (!this.state.hasBlock) {
|
|
270
|
+
throw new BlockInputError({
|
|
271
|
+
code: BlockInputErrorCode.INCOMPLETE_DATA,
|
|
272
|
+
...this.getLogMeta(),
|
|
273
|
+
}, "Cannot get versioned hashes. Block is unknown");
|
|
274
|
+
}
|
|
275
|
+
return this.state.versionedHashes;
|
|
276
|
+
}
|
|
277
|
+
getMissingBlobMeta() {
|
|
278
|
+
if (!this.state.hasBlock) {
|
|
279
|
+
throw new BlockInputError({
|
|
280
|
+
code: BlockInputErrorCode.INCOMPLETE_DATA,
|
|
281
|
+
...this.getLogMeta(),
|
|
282
|
+
}, "Cannot get missing blobs. Block is unknown");
|
|
283
|
+
}
|
|
284
|
+
if (this.state.hasAllData) {
|
|
285
|
+
return [];
|
|
286
|
+
}
|
|
287
|
+
const blobMeta = [];
|
|
288
|
+
const versionedHashes = this.state.versionedHashes;
|
|
289
|
+
for (let index = 0; index < versionedHashes.length; index++) {
|
|
290
|
+
if (!this.blobsCache.has(index)) {
|
|
291
|
+
blobMeta.push({
|
|
292
|
+
index,
|
|
293
|
+
blockRoot: fromHex(this.blockRootHex),
|
|
294
|
+
versionHash: versionedHashes[index],
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return blobMeta;
|
|
299
|
+
}
|
|
300
|
+
getAllBlobsWithSource() {
|
|
301
|
+
if (!this.state.hasAllData) {
|
|
302
|
+
throw new BlockInputError({
|
|
303
|
+
code: BlockInputErrorCode.INCOMPLETE_DATA,
|
|
304
|
+
...this.getLogMeta(),
|
|
305
|
+
}, "Cannot get all blobs. DA status is not complete");
|
|
306
|
+
}
|
|
307
|
+
return [...this.blobsCache.values()];
|
|
308
|
+
}
|
|
309
|
+
getBlobs() {
|
|
310
|
+
return this.getAllBlobsWithSource().map(({ blobSidecar }) => blobSidecar);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
function blockAndBlobArePaired(block, blobSidecar) {
|
|
314
|
+
return byteArrayEquals(block.message.body.blobKzgCommitments[blobSidecar.index], blobSidecar.kzgCommitment);
|
|
315
|
+
}
|
|
316
|
+
function assertBlockAndBlobArePaired(blockRootHex, block, blobSidecar) {
|
|
317
|
+
if (!blockAndBlobArePaired(block, blobSidecar)) {
|
|
318
|
+
// TODO: (@matthewkeil) should this eject the bad blob instead? No way to tell if the blob or the block
|
|
319
|
+
// has the invalid commitment. Guessing it would be the blob though because we match via block
|
|
320
|
+
// hashTreeRoot and we do not take a hashTreeRoot of the BlobSidecar
|
|
321
|
+
throw new BlockInputError({
|
|
322
|
+
code: BlockInputErrorCode.MISMATCHED_KZG_COMMITMENT,
|
|
323
|
+
blockRoot: blockRootHex,
|
|
324
|
+
slot: block.message.slot,
|
|
325
|
+
sidecarIndex: blobSidecar.index,
|
|
326
|
+
}, "BlobSidecar commitment does not match block commitment");
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* With columns, BlockInput has several states:
|
|
331
|
+
* - The block is seen and all required sampled columns are seen
|
|
332
|
+
* - The block is seen and all required sampled columns are not yet seen
|
|
333
|
+
* - The block is not yet seen and all required sampled columns are seen
|
|
334
|
+
* - The block is not yet seen and all required sampled columns are not yet seen
|
|
335
|
+
*/
|
|
336
|
+
export class BlockInputColumns extends AbstractBlockInput {
|
|
337
|
+
constructor(init, state, sampledColumns, custodyColumns) {
|
|
338
|
+
super(init);
|
|
339
|
+
this.type = DAType.Columns;
|
|
340
|
+
this.columnsCache = new Map();
|
|
341
|
+
this.state = state;
|
|
342
|
+
this.sampledColumns = sampledColumns;
|
|
343
|
+
this.custodyColumns = custodyColumns;
|
|
344
|
+
}
|
|
345
|
+
static createFromBlock(props) {
|
|
346
|
+
const hasAllData = props.daOutOfRange ||
|
|
347
|
+
props.block.message.body.blobKzgCommitments.length === 0 ||
|
|
348
|
+
props.sampledColumns.length === 0;
|
|
349
|
+
const state = {
|
|
350
|
+
hasBlock: true,
|
|
351
|
+
hasAllData,
|
|
352
|
+
versionedHashes: props.block.message.body.blobKzgCommitments.map(kzgCommitmentToVersionedHash),
|
|
353
|
+
block: props.block,
|
|
354
|
+
source: props.source,
|
|
355
|
+
timeCreated: props.source.seenTimestampSec,
|
|
356
|
+
timeCompleteSec: hasAllData ? props.source.seenTimestampSec : undefined,
|
|
357
|
+
};
|
|
358
|
+
const init = {
|
|
359
|
+
daOutOfRange: props.daOutOfRange,
|
|
360
|
+
timeCreated: props.source.seenTimestampSec,
|
|
361
|
+
forkName: props.forkName,
|
|
362
|
+
blockRootHex: props.blockRootHex,
|
|
363
|
+
parentRootHex: toHex(props.block.message.parentRoot),
|
|
364
|
+
slot: props.block.message.slot,
|
|
365
|
+
};
|
|
366
|
+
const blockInput = new BlockInputColumns(init, state, props.sampledColumns, props.custodyColumns);
|
|
367
|
+
blockInput.blockPromise.resolve(props.block);
|
|
368
|
+
if (hasAllData) {
|
|
369
|
+
blockInput.dataPromise.resolve([]);
|
|
370
|
+
}
|
|
371
|
+
return blockInput;
|
|
372
|
+
}
|
|
373
|
+
static createFromColumn(props) {
|
|
374
|
+
const hasAllData = props.sampledColumns.length === 0;
|
|
375
|
+
const state = {
|
|
376
|
+
hasBlock: false,
|
|
377
|
+
hasAllData,
|
|
378
|
+
versionedHashes: props.columnSidecar.kzgCommitments.map(kzgCommitmentToVersionedHash),
|
|
379
|
+
};
|
|
380
|
+
const init = {
|
|
381
|
+
daOutOfRange: false,
|
|
382
|
+
timeCreated: props.seenTimestampSec,
|
|
383
|
+
forkName: props.forkName,
|
|
384
|
+
blockRootHex: props.blockRootHex,
|
|
385
|
+
parentRootHex: toHex(props.columnSidecar.signedBlockHeader.message.parentRoot),
|
|
386
|
+
slot: props.columnSidecar.signedBlockHeader.message.slot,
|
|
387
|
+
};
|
|
388
|
+
const blockInput = new BlockInputColumns(init, state, props.sampledColumns, props.custodyColumns);
|
|
389
|
+
if (hasAllData) {
|
|
390
|
+
blockInput.dataPromise.resolve([]);
|
|
391
|
+
}
|
|
392
|
+
return blockInput;
|
|
393
|
+
}
|
|
394
|
+
getLogMeta() {
|
|
395
|
+
return {
|
|
396
|
+
blockRoot: prettyBytes(this.blockRootHex),
|
|
397
|
+
slot: this.slot,
|
|
398
|
+
expectedColumns: this.state.hasBlock && this.state.block.message.body.blobKzgCommitments.length === 0
|
|
399
|
+
? 0
|
|
400
|
+
: this.sampledColumns.length,
|
|
401
|
+
receivedColumns: this.getSampledColumns().length,
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
addBlock(props) {
|
|
405
|
+
if (this.state.hasBlock) {
|
|
406
|
+
throw new BlockInputError({
|
|
407
|
+
code: BlockInputErrorCode.INVALID_CONSTRUCTION,
|
|
408
|
+
blockRoot: this.blockRootHex,
|
|
409
|
+
}, "Cannot addBlock to BlockInputColumns after it already has a block");
|
|
410
|
+
}
|
|
411
|
+
if (props.blockRootHex !== this.blockRootHex) {
|
|
412
|
+
throw new BlockInputError({
|
|
413
|
+
code: BlockInputErrorCode.MISMATCHED_ROOT_HEX,
|
|
414
|
+
blockInputRoot: this.blockRootHex,
|
|
415
|
+
mismatchedRoot: props.blockRootHex,
|
|
416
|
+
source: props.source.source,
|
|
417
|
+
peerId: `${props.source.peerIdStr}`,
|
|
418
|
+
}, "addBlock blockRootHex does not match BlockInput.blockRootHex");
|
|
419
|
+
}
|
|
420
|
+
for (const { columnSidecar } of this.columnsCache.values()) {
|
|
421
|
+
if (!blockAndColumnArePaired(props.block, columnSidecar)) {
|
|
422
|
+
this.columnsCache.delete(columnSidecar.index);
|
|
423
|
+
// this.logger?.error(`Removing columnIndex=${columnSidecar.index} from BlockInput`, {}, err);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
const hasAllData = props.block.message.body.blobKzgCommitments.length === 0 || this.state.hasAllData;
|
|
427
|
+
this.state = {
|
|
428
|
+
...this.state,
|
|
429
|
+
hasBlock: true,
|
|
430
|
+
hasAllData,
|
|
431
|
+
block: props.block,
|
|
432
|
+
source: props.source,
|
|
433
|
+
timeCompleteSec: hasAllData ? props.source.seenTimestampSec : undefined,
|
|
434
|
+
};
|
|
435
|
+
this.blockPromise.resolve(props.block);
|
|
436
|
+
}
|
|
437
|
+
addColumn({ blockRootHex, columnSidecar, source, seenTimestampSec, peerIdStr }) {
|
|
438
|
+
if (blockRootHex !== this.blockRootHex) {
|
|
439
|
+
throw new BlockInputError({
|
|
440
|
+
code: BlockInputErrorCode.MISMATCHED_ROOT_HEX,
|
|
441
|
+
blockInputRoot: this.blockRootHex,
|
|
442
|
+
mismatchedRoot: blockRootHex,
|
|
443
|
+
source: source,
|
|
444
|
+
peerId: `${peerIdStr}`,
|
|
445
|
+
}, "Column BeaconBlockHeader blockRootHex does not match BlockInput.blockRootHex");
|
|
446
|
+
}
|
|
447
|
+
if (this.state.hasBlock) {
|
|
448
|
+
assertBlockAndColumnArePaired(this.blockRootHex, this.state.block, columnSidecar);
|
|
449
|
+
}
|
|
450
|
+
this.columnsCache.set(columnSidecar.index, { columnSidecar, source, seenTimestampSec, peerIdStr });
|
|
451
|
+
const sampledColumns = this.getSampledColumns();
|
|
452
|
+
const hasAllData = this.state.hasAllData || sampledColumns.length === this.sampledColumns.length;
|
|
453
|
+
this.state = {
|
|
454
|
+
...this.state,
|
|
455
|
+
hasAllData: hasAllData || this.state.hasAllData,
|
|
456
|
+
timeCompleteSec: hasAllData ? seenTimestampSec : undefined,
|
|
457
|
+
};
|
|
458
|
+
if (hasAllData && sampledColumns !== null) {
|
|
459
|
+
this.dataPromise.resolve(sampledColumns);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
hasColumn(columnIndex) {
|
|
463
|
+
return this.columnsCache.has(columnIndex);
|
|
464
|
+
}
|
|
465
|
+
getVersionedHashes() {
|
|
466
|
+
return this.state.versionedHashes;
|
|
467
|
+
}
|
|
468
|
+
getCustodyColumns() {
|
|
469
|
+
const columns = [];
|
|
470
|
+
for (const index of this.custodyColumns) {
|
|
471
|
+
const column = this.columnsCache.get(index);
|
|
472
|
+
if (column) {
|
|
473
|
+
columns.push(column.columnSidecar);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
return columns;
|
|
477
|
+
}
|
|
478
|
+
getSampledColumns() {
|
|
479
|
+
const columns = [];
|
|
480
|
+
for (const index of this.sampledColumns) {
|
|
481
|
+
const column = this.columnsCache.get(index);
|
|
482
|
+
if (column) {
|
|
483
|
+
columns.push(column.columnSidecar);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
return columns;
|
|
487
|
+
}
|
|
488
|
+
getAllColumnsWithSource() {
|
|
489
|
+
return [...this.columnsCache.values()];
|
|
490
|
+
}
|
|
491
|
+
getAllColumns() {
|
|
492
|
+
return this.getAllColumnsWithSource().map(({ columnSidecar }) => columnSidecar);
|
|
493
|
+
}
|
|
494
|
+
getMissingSampledColumnMeta() {
|
|
495
|
+
if (this.state.hasAllData) {
|
|
496
|
+
return [];
|
|
497
|
+
}
|
|
498
|
+
const needed = [];
|
|
499
|
+
const blockRoot = fromHex(this.blockRootHex);
|
|
500
|
+
for (const index of this.sampledColumns) {
|
|
501
|
+
if (!this.columnsCache.has(index)) {
|
|
502
|
+
needed.push({ index, blockRoot });
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return needed;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
function blockAndColumnArePaired(block, columnSidecar) {
|
|
509
|
+
return (block.message.body.blobKzgCommitments.length === columnSidecar.kzgCommitments.length &&
|
|
510
|
+
block.message.body.blobKzgCommitments.every((commitment, index) => byteArrayEquals(commitment, columnSidecar.kzgCommitments[index])));
|
|
511
|
+
}
|
|
512
|
+
function assertBlockAndColumnArePaired(blockRootHex, block, columnSidecar) {
|
|
513
|
+
if (!blockAndColumnArePaired(block, columnSidecar)) {
|
|
514
|
+
throw new BlockInputError({
|
|
515
|
+
code: BlockInputErrorCode.MISMATCHED_KZG_COMMITMENT,
|
|
516
|
+
blockRoot: blockRootHex,
|
|
517
|
+
slot: block.message.slot,
|
|
518
|
+
sidecarIndex: columnSidecar.index,
|
|
519
|
+
}, "DataColumnsSidecar kzgCommitment does not match block kzgCommitment");
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
//# sourceMappingURL=blockInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockInput.js","sourceRoot":"","sources":["../../../../src/chain/blocks/blockInput/blockInput.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Slot } from "@lodestar/types";
|
|
2
|
+
import { LodestarError } from "@lodestar/utils";
|
|
3
|
+
import { PeerIdStr } from "../../../util/peerId.js";
|
|
4
|
+
import { BlockInputSource, LogMetaBlobs, LogMetaColumns } from "./types.js";
|
|
5
|
+
export declare enum BlockInputErrorCode {
|
|
6
|
+
INVALID_CONSTRUCTION = "BLOCK_INPUT_ERROR_INVALID_CONSTRUCTION",
|
|
7
|
+
INCOMPLETE_DATA = "BLOCK_INPUT_ERROR_INCOMPLETE_DATA",
|
|
8
|
+
MISSING_BLOCK = "BLOCK_INPUT_ERROR_MISSING_BLOCK",
|
|
9
|
+
MISSING_TIME_COMPLETE = "BLOCK_INPUT_ERROR_MISSING_TIME_COMPLETE",
|
|
10
|
+
MISMATCHED_ROOT_HEX = "BLOCK_INPUT_ERROR_MISMATCHED_ROOT_HEX",
|
|
11
|
+
MISMATCHED_KZG_COMMITMENT = "BLOCK_INPUT_ERROR_MISMATCHED_KZG_COMMITMENT"
|
|
12
|
+
}
|
|
13
|
+
export type BlockInputErrorType = {
|
|
14
|
+
code: BlockInputErrorCode.MISSING_BLOCK | BlockInputErrorCode.MISSING_TIME_COMPLETE;
|
|
15
|
+
blockRoot: string;
|
|
16
|
+
} | {
|
|
17
|
+
code: BlockInputErrorCode.INVALID_CONSTRUCTION;
|
|
18
|
+
blockRoot: string;
|
|
19
|
+
} | {
|
|
20
|
+
code: BlockInputErrorCode.MISMATCHED_ROOT_HEX;
|
|
21
|
+
blockInputRoot: string;
|
|
22
|
+
mismatchedRoot: string;
|
|
23
|
+
source: BlockInputSource;
|
|
24
|
+
peerId: PeerIdStr;
|
|
25
|
+
} | {
|
|
26
|
+
code: BlockInputErrorCode.MISMATCHED_KZG_COMMITMENT;
|
|
27
|
+
blockRoot: string;
|
|
28
|
+
slot: undefined | Slot;
|
|
29
|
+
sidecarIndex: number;
|
|
30
|
+
commitmentIndex?: number;
|
|
31
|
+
} | (LogMetaBlobs & {
|
|
32
|
+
code: BlockInputErrorCode.INCOMPLETE_DATA;
|
|
33
|
+
}) | (LogMetaColumns & {
|
|
34
|
+
code: BlockInputErrorCode.INCOMPLETE_DATA;
|
|
35
|
+
});
|
|
36
|
+
export declare class BlockInputError extends LodestarError<BlockInputErrorType> {
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { LodestarError } from "@lodestar/utils";
|
|
2
|
+
export var BlockInputErrorCode;
|
|
3
|
+
(function (BlockInputErrorCode) {
|
|
4
|
+
// Bad Arguments
|
|
5
|
+
BlockInputErrorCode["INVALID_CONSTRUCTION"] = "BLOCK_INPUT_ERROR_INVALID_CONSTRUCTION";
|
|
6
|
+
// Attempt to get all data but some is missing
|
|
7
|
+
BlockInputErrorCode["INCOMPLETE_DATA"] = "BLOCK_INPUT_ERROR_INCOMPLETE_DATA";
|
|
8
|
+
// Missing class property values for getters
|
|
9
|
+
BlockInputErrorCode["MISSING_BLOCK"] = "BLOCK_INPUT_ERROR_MISSING_BLOCK";
|
|
10
|
+
BlockInputErrorCode["MISSING_TIME_COMPLETE"] = "BLOCK_INPUT_ERROR_MISSING_TIME_COMPLETE";
|
|
11
|
+
// Mismatched values
|
|
12
|
+
BlockInputErrorCode["MISMATCHED_ROOT_HEX"] = "BLOCK_INPUT_ERROR_MISMATCHED_ROOT_HEX";
|
|
13
|
+
BlockInputErrorCode["MISMATCHED_KZG_COMMITMENT"] = "BLOCK_INPUT_ERROR_MISMATCHED_KZG_COMMITMENT";
|
|
14
|
+
})(BlockInputErrorCode || (BlockInputErrorCode = {}));
|
|
15
|
+
export class BlockInputError extends LodestarError {
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/chain/blocks/blockInput/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAI9C,MAAM,CAAN,IAAY,mBAcX;AAdD,WAAY,mBAAmB;IAC7B,gBAAgB;IAChB,sFAA+D,CAAA;IAE/D,8CAA8C;IAC9C,4EAAqD,CAAA;IAErD,4CAA4C;IAC5C,wEAAiD,CAAA;IACjD,wFAAiE,CAAA;IAEjE,oBAAoB;IACpB,oFAA6D,CAAA;IAC7D,gGAAyE,CAAA;AAC3E,CAAC,EAdW,mBAAmB,KAAnB,mBAAmB,QAc9B;AA4BD,MAAM,OAAO,eAAgB,SAAQ,aAAkC;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/chain/blocks/blockInput/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { ForkName } from "@lodestar/params";
|
|
2
|
+
import { RootHex, SignedBeaconBlock, Slot, deneb, fulu } from "@lodestar/types";
|
|
3
|
+
export declare enum DAType {
|
|
4
|
+
PreData = "pre-data",
|
|
5
|
+
Blobs = "blobs",
|
|
6
|
+
Columns = "columns"
|
|
7
|
+
}
|
|
8
|
+
export type DAData = null | deneb.BlobSidecars | fulu.DataColumnSidecars;
|
|
9
|
+
/**
|
|
10
|
+
* Represents were input originated. Blocks and Data can come from different
|
|
11
|
+
* sources so each should be labelled individually.
|
|
12
|
+
*/
|
|
13
|
+
export declare enum BlockInputSource {
|
|
14
|
+
gossip = "gossip",
|
|
15
|
+
api = "api",
|
|
16
|
+
engine = "engine",
|
|
17
|
+
byRange = "req_resp_by_range",
|
|
18
|
+
byRoot = "req_resp_by_root"
|
|
19
|
+
}
|
|
20
|
+
export type PromiseParts<T> = {
|
|
21
|
+
promise: Promise<T>;
|
|
22
|
+
resolve: (value: T) => void;
|
|
23
|
+
reject: (e: Error) => void;
|
|
24
|
+
};
|
|
25
|
+
export type LogMetaBasic = {
|
|
26
|
+
slot: number;
|
|
27
|
+
blockRoot: string;
|
|
28
|
+
};
|
|
29
|
+
export type LogMetaBlobs = LogMetaBasic & {
|
|
30
|
+
expectedBlobs: number | string;
|
|
31
|
+
receivedBlobs: number;
|
|
32
|
+
};
|
|
33
|
+
export type LogMetaColumns = LogMetaBasic & {
|
|
34
|
+
expectedColumns: number;
|
|
35
|
+
receivedColumns: number;
|
|
36
|
+
};
|
|
37
|
+
export type SourceMeta = {
|
|
38
|
+
source: BlockInputSource;
|
|
39
|
+
seenTimestampSec: number;
|
|
40
|
+
peerIdStr?: string;
|
|
41
|
+
};
|
|
42
|
+
export type BlobWithSource = SourceMeta & {
|
|
43
|
+
blobSidecar: deneb.BlobSidecar;
|
|
44
|
+
};
|
|
45
|
+
export type ColumnWithSource = SourceMeta & {
|
|
46
|
+
columnSidecar: fulu.DataColumnSidecar;
|
|
47
|
+
};
|
|
48
|
+
export type BlockHeaderMeta = {
|
|
49
|
+
forkName: ForkName;
|
|
50
|
+
slot: Slot;
|
|
51
|
+
blockRootHex: string;
|
|
52
|
+
parentRootHex: string;
|
|
53
|
+
};
|
|
54
|
+
export type CreateBlockInputMeta = {
|
|
55
|
+
daOutOfRange: boolean;
|
|
56
|
+
forkName: ForkName;
|
|
57
|
+
blockRootHex: string;
|
|
58
|
+
};
|
|
59
|
+
export type BlockInputInit = BlockHeaderMeta & {
|
|
60
|
+
daOutOfRange: boolean;
|
|
61
|
+
timeCreated: number;
|
|
62
|
+
};
|
|
63
|
+
export type AddBlock<F extends ForkName = ForkName> = {
|
|
64
|
+
block: SignedBeaconBlock<F>;
|
|
65
|
+
blockRootHex: string;
|
|
66
|
+
source: SourceMeta;
|
|
67
|
+
};
|
|
68
|
+
export type AddBlob = BlobWithSource & {
|
|
69
|
+
blockRootHex: RootHex;
|
|
70
|
+
};
|
|
71
|
+
export type AddColumn = ColumnWithSource & {
|
|
72
|
+
blockRootHex: RootHex;
|
|
73
|
+
};
|
|
74
|
+
export type BlobMeta = ColumnMeta & {
|
|
75
|
+
versionHash: Uint8Array;
|
|
76
|
+
};
|
|
77
|
+
export type ColumnMeta = {
|
|
78
|
+
blockRoot: Uint8Array;
|
|
79
|
+
index: number;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* This is used to validate that BlockInput implementations follow some minimal subset of operations
|
|
83
|
+
* and that adding a new implementation won't break consumers that rely on this subset.
|
|
84
|
+
*
|
|
85
|
+
* Practically speaking, this interface is only used internally.
|
|
86
|
+
*/
|
|
87
|
+
export interface IBlockInput<F extends ForkName = ForkName, TData extends DAData = DAData> {
|
|
88
|
+
type: DAType;
|
|
89
|
+
/** validator activities can't be performed on out of range data */
|
|
90
|
+
daOutOfRange: boolean;
|
|
91
|
+
timeCreated: number;
|
|
92
|
+
forkName: ForkName;
|
|
93
|
+
slot: Slot;
|
|
94
|
+
blockRootHex: string;
|
|
95
|
+
parentRootHex: string;
|
|
96
|
+
addBlock(props: AddBlock<F>): void;
|
|
97
|
+
/** Whether the block has been seen and validated. If true, `getBlock` is guaranteed to not throw */
|
|
98
|
+
hasBlock(): boolean;
|
|
99
|
+
getBlock(): SignedBeaconBlock<F>;
|
|
100
|
+
getBlockSource(): SourceMeta;
|
|
101
|
+
/** Whether all expected DA data has been seen and validated. */
|
|
102
|
+
hasAllData(): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Whether the block and all DA data retrieved.
|
|
105
|
+
* If true, `getBlock` is guaranteed to not throw,
|
|
106
|
+
* and `getDAStatus` is guaranteed to be DAStatus.Complete
|
|
107
|
+
*/
|
|
108
|
+
hasBlockAndAllData(): boolean;
|
|
109
|
+
getLogMeta(): LogMetaBasic;
|
|
110
|
+
/** Only safe to call when `hasBlockAndAllData` is true */
|
|
111
|
+
getTimeComplete(): number;
|
|
112
|
+
waitForBlock(timeout: number, signal?: AbortSignal): Promise<SignedBeaconBlock<F>>;
|
|
113
|
+
waitForAllData(timeout: number, signal?: AbortSignal): Promise<TData>;
|
|
114
|
+
waitForBlockAndAllData(timeout: number, signal?: AbortSignal): Promise<this>;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export var DAType;
|
|
2
|
+
(function (DAType) {
|
|
3
|
+
DAType["PreData"] = "pre-data";
|
|
4
|
+
DAType["Blobs"] = "blobs";
|
|
5
|
+
DAType["Columns"] = "columns";
|
|
6
|
+
})(DAType || (DAType = {}));
|
|
7
|
+
/**
|
|
8
|
+
* Represents were input originated. Blocks and Data can come from different
|
|
9
|
+
* sources so each should be labelled individually.
|
|
10
|
+
*/
|
|
11
|
+
export var BlockInputSource;
|
|
12
|
+
(function (BlockInputSource) {
|
|
13
|
+
BlockInputSource["gossip"] = "gossip";
|
|
14
|
+
BlockInputSource["api"] = "api";
|
|
15
|
+
BlockInputSource["engine"] = "engine";
|
|
16
|
+
BlockInputSource["byRange"] = "req_resp_by_range";
|
|
17
|
+
BlockInputSource["byRoot"] = "req_resp_by_root";
|
|
18
|
+
})(BlockInputSource || (BlockInputSource = {}));
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/chain/blocks/blockInput/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAN,IAAY,MAIX;AAJD,WAAY,MAAM;IAChB,8BAAoB,CAAA;IACpB,yBAAe,CAAA;IACf,6BAAmB,CAAA;AACrB,CAAC,EAJW,MAAM,KAAN,MAAM,QAIjB;AAID;;;GAGG;AACH,MAAM,CAAN,IAAY,gBAMX;AAND,WAAY,gBAAgB;IAC1B,qCAAiB,CAAA;IACjB,+BAAW,CAAA;IACX,qCAAiB,CAAA;IACjB,iDAA6B,CAAA;IAC7B,+CAA2B,CAAA;AAC7B,CAAC,EANW,gBAAgB,KAAhB,gBAAgB,QAM3B"}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"bugs": {
|
|
12
12
|
"url": "https://github.com/ChainSafe/lodestar/issues"
|
|
13
13
|
},
|
|
14
|
-
"version": "1.30.0-dev.
|
|
14
|
+
"version": "1.30.0-dev.d92238fd84",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -117,18 +117,18 @@
|
|
|
117
117
|
"@libp2p/peer-id": "^5.1.0",
|
|
118
118
|
"@libp2p/prometheus-metrics": "^4.3.15",
|
|
119
119
|
"@libp2p/tcp": "^10.1.8",
|
|
120
|
-
"@lodestar/api": "1.30.0-dev.
|
|
121
|
-
"@lodestar/config": "1.30.0-dev.
|
|
122
|
-
"@lodestar/db": "1.30.0-dev.
|
|
123
|
-
"@lodestar/fork-choice": "1.30.0-dev.
|
|
124
|
-
"@lodestar/light-client": "1.30.0-dev.
|
|
125
|
-
"@lodestar/logger": "1.30.0-dev.
|
|
126
|
-
"@lodestar/params": "1.30.0-dev.
|
|
127
|
-
"@lodestar/reqresp": "1.30.0-dev.
|
|
128
|
-
"@lodestar/state-transition": "1.30.0-dev.
|
|
129
|
-
"@lodestar/types": "1.30.0-dev.
|
|
130
|
-
"@lodestar/utils": "1.30.0-dev.
|
|
131
|
-
"@lodestar/validator": "1.30.0-dev.
|
|
120
|
+
"@lodestar/api": "1.30.0-dev.d92238fd84",
|
|
121
|
+
"@lodestar/config": "1.30.0-dev.d92238fd84",
|
|
122
|
+
"@lodestar/db": "1.30.0-dev.d92238fd84",
|
|
123
|
+
"@lodestar/fork-choice": "1.30.0-dev.d92238fd84",
|
|
124
|
+
"@lodestar/light-client": "1.30.0-dev.d92238fd84",
|
|
125
|
+
"@lodestar/logger": "1.30.0-dev.d92238fd84",
|
|
126
|
+
"@lodestar/params": "1.30.0-dev.d92238fd84",
|
|
127
|
+
"@lodestar/reqresp": "1.30.0-dev.d92238fd84",
|
|
128
|
+
"@lodestar/state-transition": "1.30.0-dev.d92238fd84",
|
|
129
|
+
"@lodestar/types": "1.30.0-dev.d92238fd84",
|
|
130
|
+
"@lodestar/utils": "1.30.0-dev.d92238fd84",
|
|
131
|
+
"@lodestar/validator": "1.30.0-dev.d92238fd84",
|
|
132
132
|
"@multiformats/multiaddr": "^12.1.3",
|
|
133
133
|
"c-kzg": "^2.1.2",
|
|
134
134
|
"datastore-core": "^10.0.2",
|
|
@@ -165,5 +165,5 @@
|
|
|
165
165
|
"beacon",
|
|
166
166
|
"blockchain"
|
|
167
167
|
],
|
|
168
|
-
"gitHead": "
|
|
168
|
+
"gitHead": "4fce75abd369b3df8dbdd4430bf8a9fd96629ade"
|
|
169
169
|
}
|