@lodestar/beacon-node 1.23.0-dev.0dceb831ca → 1.23.0-dev.1fa3f37ab7
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/api/impl/beacon/pool/index.js +13 -22
- package/lib/api/impl/beacon/pool/index.js.map +1 -1
- package/lib/api/impl/beacon/state/index.d.ts +1 -1
- package/lib/api/impl/beacon/state/index.js +37 -2
- package/lib/api/impl/beacon/state/index.js.map +1 -1
- package/lib/api/impl/beacon/state/utils.d.ts +2 -1
- package/lib/api/impl/beacon/state/utils.js +1 -1
- package/lib/api/impl/beacon/state/utils.js.map +1 -1
- package/lib/api/impl/config/constants.d.ts +0 -1
- package/lib/api/impl/config/constants.js +1 -2
- package/lib/api/impl/config/constants.js.map +1 -1
- package/lib/api/impl/debug/index.js +30 -0
- package/lib/api/impl/debug/index.js.map +1 -1
- package/lib/api/impl/errors.d.ts +8 -0
- package/lib/api/impl/errors.js +7 -0
- package/lib/api/impl/errors.js.map +1 -1
- package/lib/api/impl/validator/index.js +1 -1
- package/lib/api/impl/validator/index.js.map +1 -1
- package/lib/api/rest/base.d.ts +1 -0
- package/lib/api/rest/base.js +31 -4
- package/lib/api/rest/base.js.map +1 -1
- package/lib/api/rest/index.js +1 -0
- package/lib/api/rest/index.js.map +1 -1
- package/lib/chain/archiver/archiveStates.d.ts +3 -2
- package/lib/chain/archiver/archiveStates.js +8 -4
- package/lib/chain/archiver/archiveStates.js.map +1 -1
- package/lib/chain/archiver/index.d.ts +3 -1
- package/lib/chain/archiver/index.js +3 -2
- package/lib/chain/archiver/index.js.map +1 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js +2 -1
- package/lib/chain/blocks/verifyBlocksExecutionPayloads.js.map +1 -1
- package/lib/chain/chain.d.ts +2 -41
- package/lib/chain/chain.js +3 -2
- package/lib/chain/chain.js.map +1 -1
- package/lib/chain/historicalState/getHistoricalState.d.ts +2 -1
- package/lib/chain/historicalState/getHistoricalState.js.map +1 -1
- package/lib/chain/historicalState/worker.js +1 -1
- package/lib/chain/historicalState/worker.js.map +1 -1
- package/lib/chain/interface.d.ts +2 -1
- package/lib/chain/options.js +1 -1
- package/lib/chain/options.js.map +1 -1
- package/lib/chain/produceBlock/produceBlockBody.js +7 -1
- package/lib/chain/produceBlock/produceBlockBody.js.map +1 -1
- package/lib/chain/regen/regen.js +1 -1
- package/lib/chain/regen/regen.js.map +1 -1
- package/lib/chain/rewards/attestationsRewards.js +2 -1
- package/lib/chain/rewards/attestationsRewards.js.map +1 -1
- package/lib/chain/serializeState.js +63 -10
- package/lib/chain/serializeState.js.map +1 -1
- package/lib/chain/stateCache/fifoBlockStateCache.d.ts +7 -2
- package/lib/chain/stateCache/fifoBlockStateCache.js +7 -2
- package/lib/chain/stateCache/fifoBlockStateCache.js.map +1 -1
- package/lib/chain/stateCache/persistentCheckpointsCache.d.ts +4 -3
- package/lib/chain/stateCache/persistentCheckpointsCache.js +25 -20
- package/lib/chain/stateCache/persistentCheckpointsCache.js.map +1 -1
- package/lib/chain/validation/attestation.d.ts +3 -17
- package/lib/chain/validation/attestation.js +7 -26
- package/lib/chain/validation/attestation.js.map +1 -1
- package/lib/execution/engine/http.d.ts +3 -2
- package/lib/execution/engine/http.js +27 -10
- package/lib/execution/engine/http.js.map +1 -1
- package/lib/execution/engine/interface.d.ts +5 -4
- package/lib/execution/engine/interface.js.map +1 -1
- package/lib/execution/engine/mock.js +0 -2
- package/lib/execution/engine/mock.js.map +1 -1
- package/lib/execution/engine/payloadIdCache.d.ts +0 -17
- package/lib/execution/engine/payloadIdCache.js.map +1 -1
- package/lib/execution/engine/types.d.ts +29 -25
- package/lib/execution/engine/types.js +28 -42
- package/lib/execution/engine/types.js.map +1 -1
- package/lib/metrics/metrics/lodestar.d.ts +3 -1
- package/lib/metrics/metrics/lodestar.js +6 -5
- package/lib/metrics/metrics/lodestar.js.map +1 -1
- package/lib/network/gossip/interface.d.ts +8 -6
- package/lib/network/gossip/interface.js.map +1 -1
- package/lib/network/gossip/topic.d.ts +0 -27
- package/lib/network/options.js +0 -2
- package/lib/network/options.js.map +1 -1
- package/lib/network/processor/gossipHandlers.d.ts +0 -2
- package/lib/network/processor/gossipHandlers.js +15 -61
- package/lib/network/processor/gossipHandlers.js.map +1 -1
- package/lib/network/processor/gossipQueues/index.d.ts +1 -1
- package/lib/network/processor/gossipQueues/index.js +6 -19
- package/lib/network/processor/gossipQueues/index.js.map +1 -1
- package/lib/network/processor/gossipQueues/types.d.ts +1 -2
- package/lib/network/processor/gossipQueues/types.js +0 -6
- package/lib/network/processor/gossipQueues/types.js.map +1 -1
- package/lib/network/processor/index.js +1 -1
- package/lib/network/processor/index.js.map +1 -1
- package/package.json +20 -19
- package/lib/network/processor/gossipQueues/indexedAvgTime.d.ts +0 -31
- package/lib/network/processor/gossipQueues/indexedAvgTime.js +0 -115
- package/lib/network/processor/gossipQueues/indexedAvgTime.js.map +0 -1
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.23.0-dev.
|
|
14
|
+
"version": "1.23.0-dev.1fa3f37ab7",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -103,13 +103,14 @@
|
|
|
103
103
|
"@chainsafe/libp2p-noise": "^15.0.0",
|
|
104
104
|
"@chainsafe/persistent-merkle-tree": "^0.8.0",
|
|
105
105
|
"@chainsafe/prometheus-gc-stats": "^1.0.0",
|
|
106
|
+
"@chainsafe/pubkey-index-map": "2.0.0",
|
|
106
107
|
"@chainsafe/ssz": "^0.17.1",
|
|
107
108
|
"@chainsafe/threads": "^1.11.1",
|
|
108
109
|
"@ethersproject/abi": "^5.7.0",
|
|
109
|
-
"@fastify/bearer-auth": "^
|
|
110
|
-
"@fastify/cors": "^
|
|
111
|
-
"@fastify/swagger": "^
|
|
112
|
-
"@fastify/swagger-ui": "^
|
|
110
|
+
"@fastify/bearer-auth": "^10.0.1",
|
|
111
|
+
"@fastify/cors": "^10.0.1",
|
|
112
|
+
"@fastify/swagger": "^9.0.0",
|
|
113
|
+
"@fastify/swagger-ui": "^5.0.1",
|
|
113
114
|
"@libp2p/bootstrap": "^10.0.21",
|
|
114
115
|
"@libp2p/identify": "^1.0.20",
|
|
115
116
|
"@libp2p/interface": "^1.3.0",
|
|
@@ -119,24 +120,24 @@
|
|
|
119
120
|
"@libp2p/peer-id-factory": "^4.1.0",
|
|
120
121
|
"@libp2p/prometheus-metrics": "^3.0.21",
|
|
121
122
|
"@libp2p/tcp": "9.0.23",
|
|
122
|
-
"@lodestar/api": "1.23.0-dev.
|
|
123
|
-
"@lodestar/config": "1.23.0-dev.
|
|
124
|
-
"@lodestar/db": "1.23.0-dev.
|
|
125
|
-
"@lodestar/fork-choice": "1.23.0-dev.
|
|
126
|
-
"@lodestar/light-client": "1.23.0-dev.
|
|
127
|
-
"@lodestar/logger": "1.23.0-dev.
|
|
128
|
-
"@lodestar/params": "1.23.0-dev.
|
|
129
|
-
"@lodestar/reqresp": "1.23.0-dev.
|
|
130
|
-
"@lodestar/state-transition": "1.23.0-dev.
|
|
131
|
-
"@lodestar/types": "1.23.0-dev.
|
|
132
|
-
"@lodestar/utils": "1.23.0-dev.
|
|
133
|
-
"@lodestar/validator": "1.23.0-dev.
|
|
123
|
+
"@lodestar/api": "1.23.0-dev.1fa3f37ab7",
|
|
124
|
+
"@lodestar/config": "1.23.0-dev.1fa3f37ab7",
|
|
125
|
+
"@lodestar/db": "1.23.0-dev.1fa3f37ab7",
|
|
126
|
+
"@lodestar/fork-choice": "1.23.0-dev.1fa3f37ab7",
|
|
127
|
+
"@lodestar/light-client": "1.23.0-dev.1fa3f37ab7",
|
|
128
|
+
"@lodestar/logger": "1.23.0-dev.1fa3f37ab7",
|
|
129
|
+
"@lodestar/params": "1.23.0-dev.1fa3f37ab7",
|
|
130
|
+
"@lodestar/reqresp": "1.23.0-dev.1fa3f37ab7",
|
|
131
|
+
"@lodestar/state-transition": "1.23.0-dev.1fa3f37ab7",
|
|
132
|
+
"@lodestar/types": "1.23.0-dev.1fa3f37ab7",
|
|
133
|
+
"@lodestar/utils": "1.23.0-dev.1fa3f37ab7",
|
|
134
|
+
"@lodestar/validator": "1.23.0-dev.1fa3f37ab7",
|
|
134
135
|
"@multiformats/multiaddr": "^12.1.3",
|
|
135
136
|
"c-kzg": "^2.1.2",
|
|
136
137
|
"datastore-core": "^9.1.1",
|
|
137
138
|
"datastore-level": "^10.1.1",
|
|
138
139
|
"deepmerge": "^4.3.1",
|
|
139
|
-
"fastify": "^
|
|
140
|
+
"fastify": "^5.0.0",
|
|
140
141
|
"interface-datastore": "^8.2.7",
|
|
141
142
|
"it-all": "^3.0.4",
|
|
142
143
|
"it-pipe": "^3.0.1",
|
|
@@ -167,5 +168,5 @@
|
|
|
167
168
|
"beacon",
|
|
168
169
|
"blockchain"
|
|
169
170
|
],
|
|
170
|
-
"gitHead": "
|
|
171
|
+
"gitHead": "29609489b5b7907a3bac2205f883f30e0a3a6980"
|
|
171
172
|
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { GossipQueue, IndexedGossipQueueOpts } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* An implementation of GossipQueue that tries to run the batch with highest score first.
|
|
4
|
-
* TODO: add unit tests
|
|
5
|
-
* - index items by indexFn using a map
|
|
6
|
-
* - compute avgRecvTimestampMs for each key every time we add new item
|
|
7
|
-
* - on next, pick the key with the highest score (check the score function above)
|
|
8
|
-
*/
|
|
9
|
-
export declare class IndexedGossipQueueAvgTime<T extends {
|
|
10
|
-
indexed?: string;
|
|
11
|
-
}> implements GossipQueue<T> {
|
|
12
|
-
private readonly opts;
|
|
13
|
-
private _length;
|
|
14
|
-
private indexedItems;
|
|
15
|
-
constructor(opts: IndexedGossipQueueOpts<T>);
|
|
16
|
-
get length(): number;
|
|
17
|
-
get keySize(): number;
|
|
18
|
-
clear(): void;
|
|
19
|
-
getDataAgeMs(): number[];
|
|
20
|
-
/**
|
|
21
|
-
* Add item to gossip queue. If queue is full, drop first item of first key.
|
|
22
|
-
* Return number of items dropped
|
|
23
|
-
*/
|
|
24
|
-
add(item: T): number;
|
|
25
|
-
/**
|
|
26
|
-
* Try to get list of items of the same key with highest score
|
|
27
|
-
*/
|
|
28
|
-
next(): T[] | null;
|
|
29
|
-
getAll(): T[];
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=indexedAvgTime.d.ts.map
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
function listScore(list) {
|
|
2
|
-
return list.items.length / Math.max(1000, Date.now() - list.avgRecvTimestampMs);
|
|
3
|
-
}
|
|
4
|
-
/**
|
|
5
|
-
* An implementation of GossipQueue that tries to run the batch with highest score first.
|
|
6
|
-
* TODO: add unit tests
|
|
7
|
-
* - index items by indexFn using a map
|
|
8
|
-
* - compute avgRecvTimestampMs for each key every time we add new item
|
|
9
|
-
* - on next, pick the key with the highest score (check the score function above)
|
|
10
|
-
*/
|
|
11
|
-
export class IndexedGossipQueueAvgTime {
|
|
12
|
-
constructor(opts) {
|
|
13
|
-
this.opts = opts;
|
|
14
|
-
this._length = 0;
|
|
15
|
-
this.indexedItems = new Map();
|
|
16
|
-
}
|
|
17
|
-
get length() {
|
|
18
|
-
return this._length;
|
|
19
|
-
}
|
|
20
|
-
get keySize() {
|
|
21
|
-
return this.indexedItems.size;
|
|
22
|
-
}
|
|
23
|
-
clear() {
|
|
24
|
-
this.indexedItems = new Map();
|
|
25
|
-
this._length = 0;
|
|
26
|
-
}
|
|
27
|
-
// not implemented for this gossip queue
|
|
28
|
-
getDataAgeMs() {
|
|
29
|
-
return [];
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Add item to gossip queue. If queue is full, drop first item of first key.
|
|
33
|
-
* Return number of items dropped
|
|
34
|
-
*/
|
|
35
|
-
add(item) {
|
|
36
|
-
const key = this.opts.indexFn(item);
|
|
37
|
-
if (key == null) {
|
|
38
|
-
// this comes from getAttDataBase64FromAttestationSerialized() return type
|
|
39
|
-
// should not happen
|
|
40
|
-
return 0;
|
|
41
|
-
}
|
|
42
|
-
item.indexed = key;
|
|
43
|
-
let list = this.indexedItems.get(key);
|
|
44
|
-
if (list == null) {
|
|
45
|
-
list = {
|
|
46
|
-
items: [],
|
|
47
|
-
avgRecvTimestampMs: Date.now(),
|
|
48
|
-
};
|
|
49
|
-
this.indexedItems.set(key, list);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
list.avgRecvTimestampMs = (list.avgRecvTimestampMs * list.items.length + Date.now()) / (list.items.length + 1);
|
|
53
|
-
list.items.push(item);
|
|
54
|
-
}
|
|
55
|
-
this._length++;
|
|
56
|
-
if (this._length <= this.opts.maxLength) {
|
|
57
|
-
return 0;
|
|
58
|
-
}
|
|
59
|
-
// overload, need to drop more items
|
|
60
|
-
const firstKey = this.indexedItems.keys().next().value;
|
|
61
|
-
// there should be at least 1 key
|
|
62
|
-
if (firstKey == null) {
|
|
63
|
-
return 0;
|
|
64
|
-
}
|
|
65
|
-
const firstList = this.indexedItems.get(firstKey);
|
|
66
|
-
// should not happen
|
|
67
|
-
if (firstList == null) {
|
|
68
|
-
return 0;
|
|
69
|
-
}
|
|
70
|
-
const deletedItem = firstList.items.shift();
|
|
71
|
-
if (deletedItem != null) {
|
|
72
|
-
this._length--;
|
|
73
|
-
if (firstList.items.length === 0) {
|
|
74
|
-
this.indexedItems.delete(firstKey);
|
|
75
|
-
}
|
|
76
|
-
return 1;
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
return 0;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Try to get list of items of the same key with highest score
|
|
84
|
-
*/
|
|
85
|
-
next() {
|
|
86
|
-
let maxScore = 0;
|
|
87
|
-
let maxScoreKey;
|
|
88
|
-
for (const [key, list] of this.indexedItems) {
|
|
89
|
-
const score = listScore(list);
|
|
90
|
-
if (score > maxScore) {
|
|
91
|
-
maxScore = score;
|
|
92
|
-
maxScoreKey = key;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (maxScoreKey == null) {
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
const items = this.indexedItems.get(maxScoreKey)?.items;
|
|
99
|
-
if (items == null) {
|
|
100
|
-
// should not happen
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
this.indexedItems.delete(maxScoreKey);
|
|
104
|
-
this._length = Math.max(0, this._length - items.length);
|
|
105
|
-
return items;
|
|
106
|
-
}
|
|
107
|
-
getAll() {
|
|
108
|
-
const items = [];
|
|
109
|
-
for (const list of this.indexedItems.values()) {
|
|
110
|
-
items.push(...list.items);
|
|
111
|
-
}
|
|
112
|
-
return items;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
//# sourceMappingURL=indexedAvgTime.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"indexedAvgTime.js","sourceRoot":"","sources":["../../../../src/network/processor/gossipQueues/indexedAvgTime.ts"],"names":[],"mappings":"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"}
|