-
-
Notifications
You must be signed in to change notification settings - Fork 358
/
Copy pathproof.ts
82 lines (78 loc) · 3.3 KB
/
proof.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* eslint-disable @typescript-eslint/naming-convention */
import {CompactMultiProof, ProofType} from "@chainsafe/persistent-merkle-tree";
import {ByteListType, ContainerType, fromHexString} from "@chainsafe/ssz";
import {toHex} from "@lodestar/utils";
import {ChainForkConfig} from "@lodestar/config";
import {ssz} from "@lodestar/types";
import {Endpoint, RouteDefinitions, Schema} from "../../utils/index.js";
import {ArrayOf} from "../../utils/codecs.js";
import {VersionCodec, VersionMeta} from "../../utils/metadata.js";
export const CompactMultiProofType = new ContainerType({
leaves: ArrayOf(ssz.Root, 10000),
descriptor: new ByteListType(2048),
});
// See /packages/api/src/routes/index.ts for reasoning and instructions to add new routes
export type Endpoints = {
/**
* Returns a multiproof of `descriptor` at the requested `stateId`.
* The requested `stateId` may not be available. Regular nodes only keep recent states in memory.
*/
getStateProof: Endpoint<
"GET",
{stateId: string; descriptor: Uint8Array},
{params: {state_id: string}; query: {format: string}},
CompactMultiProof,
VersionMeta
>;
/**
* Returns a multiproof of `descriptor` at the requested `blockId`.
* The requested `blockId` may not be available. Regular nodes only keep recent states in memory.
*/
getBlockProof: Endpoint<
"GET",
{blockId: string; descriptor: Uint8Array},
{params: {block_id: string}; query: {format: string}},
CompactMultiProof,
VersionMeta
>;
};
export function getDefinitions(_config: ChainForkConfig): RouteDefinitions<Endpoints> {
return {
getStateProof: {
url: "/eth/v0/beacon/proof/state/{state_id}",
method: "GET",
req: {
writeReq: ({stateId, descriptor}) => ({params: {state_id: stateId}, query: {format: toHex(descriptor)}}),
parseReq: ({params, query}) => ({stateId: params.state_id, descriptor: fromHexString(query.format)}),
schema: {params: {state_id: Schema.StringRequired}, query: {format: Schema.StringRequired}},
},
resp: {
data: {
toJson: (data) => CompactMultiProofType.toJson(data),
fromJson: (data) => ({...CompactMultiProofType.fromJson(data), type: ProofType.compactMulti}),
serialize: (data) => CompactMultiProofType.serialize(data),
deserialize: (data) => ({...CompactMultiProofType.deserialize(data), type: ProofType.compactMulti}),
},
meta: VersionCodec,
},
},
getBlockProof: {
url: "/eth/v0/beacon/proof/block/{block_id}",
method: "GET",
req: {
writeReq: ({blockId, descriptor}) => ({params: {block_id: blockId}, query: {format: toHex(descriptor)}}),
parseReq: ({params, query}) => ({blockId: params.block_id, descriptor: fromHexString(query.format)}),
schema: {params: {block_id: Schema.StringRequired}, query: {format: Schema.StringRequired}},
},
resp: {
data: {
toJson: (data) => CompactMultiProofType.toJson(data),
fromJson: (data) => ({...CompactMultiProofType.fromJson(data), type: ProofType.compactMulti}),
serialize: (data) => CompactMultiProofType.serialize(data),
deserialize: (data) => ({...CompactMultiProofType.deserialize(data), type: ProofType.compactMulti}),
},
meta: VersionCodec,
},
},
};
}