@lodestar/prover 1.35.0-dev.c88a6ed255 → 1.35.0-dev.c9deb9b59f
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/bin/lodestar-prover.js +3 -0
- package/lib/browser/index.d.ts.map +1 -0
- package/lib/cli/applyPreset.d.ts.map +1 -0
- package/lib/cli/cli.d.ts +3 -3
- package/lib/cli/cli.d.ts.map +1 -0
- package/lib/cli/cli.js +1 -1
- package/lib/cli/cli.js.map +1 -1
- package/lib/cli/cmds/index.d.ts.map +1 -0
- package/lib/cli/cmds/index.js.map +1 -1
- package/lib/cli/cmds/start/handler.d.ts.map +1 -0
- package/lib/cli/cmds/start/index.d.ts.map +1 -0
- package/lib/cli/cmds/start/options.d.ts.map +1 -0
- package/lib/cli/index.d.ts.map +1 -0
- package/lib/cli/index.js.map +1 -1
- package/lib/cli/options.d.ts.map +1 -0
- package/lib/constants.d.ts.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/interfaces.d.ts.map +1 -0
- package/lib/proof_provider/index.d.ts.map +1 -0
- package/lib/proof_provider/ordered_map.d.ts.map +1 -0
- package/lib/proof_provider/ordered_map.js +2 -0
- package/lib/proof_provider/ordered_map.js.map +1 -1
- package/lib/proof_provider/payload_store.d.ts.map +1 -0
- package/lib/proof_provider/payload_store.js +12 -11
- package/lib/proof_provider/payload_store.js.map +1 -1
- package/lib/proof_provider/proof_provider.d.ts.map +1 -0
- package/lib/proof_provider/proof_provider.js +9 -0
- package/lib/proof_provider/proof_provider.js.map +1 -1
- package/lib/provider_types/eip1193_provider_type.d.ts.map +1 -0
- package/lib/provider_types/ethers_provider_type.d.ts.map +1 -0
- package/lib/provider_types/legacy_provider_type.d.ts.map +1 -0
- package/lib/provider_types/web3_js_provider_type.d.ts.map +1 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/utils/assertion.d.ts.map +1 -0
- package/lib/utils/consensus.d.ts.map +1 -0
- package/lib/utils/conversion.d.ts.map +1 -0
- package/lib/utils/errors.d.ts.map +1 -0
- package/lib/utils/evm.d.ts.map +1 -0
- package/lib/utils/execution.d.ts.map +1 -0
- package/lib/utils/file.d.ts.map +1 -0
- package/lib/utils/file.js.map +1 -1
- package/lib/utils/gitData/gitDataPath.d.ts.map +1 -0
- package/lib/utils/gitData/index.d.ts.map +1 -0
- package/lib/utils/gitData/index.js.map +1 -1
- package/lib/utils/gitData/writeGitData.d.ts.map +1 -0
- package/lib/utils/json_rpc.d.ts.map +1 -0
- package/lib/utils/process.d.ts.map +1 -0
- package/lib/utils/req_resp.d.ts.map +1 -0
- package/lib/utils/rpc_provider.d.ts.map +1 -0
- package/lib/utils/rpc_provider.js +3 -1
- package/lib/utils/rpc_provider.js.map +1 -1
- package/lib/utils/validation.d.ts.map +1 -0
- package/lib/utils/validation.js.map +1 -1
- package/lib/utils/verification.d.ts.map +1 -0
- package/lib/utils/version.d.ts.map +1 -0
- package/lib/verified_requests/eth_call.d.ts.map +1 -0
- package/lib/verified_requests/eth_estimateGas.d.ts.map +1 -0
- package/lib/verified_requests/eth_getBalance.d.ts.map +1 -0
- package/lib/verified_requests/eth_getBlockByHash.d.ts.map +1 -0
- package/lib/verified_requests/eth_getBlockByNumber.d.ts.map +1 -0
- package/lib/verified_requests/eth_getCode.d.ts.map +1 -0
- package/lib/verified_requests/eth_getTransactionCount.d.ts.map +1 -0
- package/lib/web3_provider.d.ts.map +1 -0
- package/lib/web3_provider_inspector.d.ts.map +1 -0
- package/lib/web3_provider_inspector.js +2 -1
- package/lib/web3_provider_inspector.js.map +1 -1
- package/lib/web3_proxy.d.ts.map +1 -0
- package/lib/web3_proxy.js +1 -1
- package/lib/web3_proxy.js.map +1 -1
- package/package.json +16 -15
- package/src/browser/index.ts +3 -0
- package/src/cli/applyPreset.ts +83 -0
- package/src/cli/cli.ts +58 -0
- package/src/cli/cmds/index.ts +7 -0
- package/src/cli/cmds/start/handler.ts +27 -0
- package/src/cli/cmds/start/index.ts +18 -0
- package/src/cli/cmds/start/options.ts +85 -0
- package/src/cli/index.ts +30 -0
- package/src/cli/options.ts +73 -0
- package/src/constants.ts +6 -0
- package/src/index.ts +5 -0
- package/src/interfaces.ts +90 -0
- package/src/proof_provider/index.ts +1 -0
- package/src/proof_provider/ordered_map.ts +25 -0
- package/src/proof_provider/payload_store.ts +223 -0
- package/src/proof_provider/proof_provider.ts +210 -0
- package/src/provider_types/eip1193_provider_type.ts +32 -0
- package/src/provider_types/ethers_provider_type.ts +44 -0
- package/src/provider_types/legacy_provider_type.ts +123 -0
- package/src/provider_types/web3_js_provider_type.ts +35 -0
- package/src/types.ts +163 -0
- package/src/utils/assertion.ts +11 -0
- package/src/utils/consensus.ts +122 -0
- package/src/utils/conversion.ts +107 -0
- package/src/utils/errors.ts +4 -0
- package/src/utils/evm.ts +284 -0
- package/src/utils/execution.ts +76 -0
- package/src/utils/file.ts +51 -0
- package/src/utils/gitData/gitDataPath.ts +48 -0
- package/src/utils/gitData/index.ts +70 -0
- package/src/utils/gitData/writeGitData.ts +10 -0
- package/src/utils/json_rpc.ts +170 -0
- package/src/utils/process.ts +111 -0
- package/src/utils/req_resp.ts +34 -0
- package/src/utils/rpc_provider.ts +117 -0
- package/src/utils/validation.ts +161 -0
- package/src/utils/verification.ts +112 -0
- package/src/utils/version.ts +74 -0
- package/src/verified_requests/eth_call.ts +50 -0
- package/src/verified_requests/eth_estimateGas.ts +49 -0
- package/src/verified_requests/eth_getBalance.ts +26 -0
- package/src/verified_requests/eth_getBlockByHash.ts +24 -0
- package/src/verified_requests/eth_getBlockByNumber.ts +25 -0
- package/src/verified_requests/eth_getCode.ts +50 -0
- package/src/verified_requests/eth_getTransactionCount.ts +26 -0
- package/src/web3_provider.ts +58 -0
- package/src/web3_provider_inspector.ts +88 -0
- package/src/web3_proxy.ts +175 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import {Logger} from "@lodestar/logger";
|
|
2
|
+
import {AnyWeb3Provider, Web3ProviderType} from "./interfaces.js";
|
|
3
|
+
import eip1193ProviderType from "./provider_types/eip1193_provider_type.js";
|
|
4
|
+
import ethersProviderType from "./provider_types/ethers_provider_type.js";
|
|
5
|
+
import legacyProviderType from "./provider_types/legacy_provider_type.js";
|
|
6
|
+
import web3jsProviderType from "./provider_types/web3_js_provider_type.js";
|
|
7
|
+
|
|
8
|
+
export class Web3ProviderInspector {
|
|
9
|
+
protected providerTypes: Web3ProviderType<AnyWeb3Provider>[] = [];
|
|
10
|
+
logger: Logger;
|
|
11
|
+
|
|
12
|
+
protected constructor(opts: {logger: Logger}) {
|
|
13
|
+
this.logger = opts.logger;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
static initWithDefault(opts: {logger: Logger}): Web3ProviderInspector {
|
|
17
|
+
const inspector = new Web3ProviderInspector(opts);
|
|
18
|
+
inspector.register(web3jsProviderType, {index: 0});
|
|
19
|
+
inspector.register(ethersProviderType, {index: 1});
|
|
20
|
+
inspector.register(eip1193ProviderType, {index: 2});
|
|
21
|
+
inspector.register(legacyProviderType, {index: 3});
|
|
22
|
+
|
|
23
|
+
return inspector;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
getProviderTypes(): Web3ProviderType<AnyWeb3Provider>[] {
|
|
27
|
+
// Destruct so user can not mutate the output
|
|
28
|
+
return [...this.providerTypes];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
register(providerType: Web3ProviderType<AnyWeb3Provider>, opts?: {index?: number}): void {
|
|
32
|
+
// If user does not provider index, we will register the provider type to last
|
|
33
|
+
let index = opts?.index ?? this.providerTypes.length;
|
|
34
|
+
|
|
35
|
+
// If index is larger, let's add type at the end
|
|
36
|
+
if (index > this.providerTypes.length) {
|
|
37
|
+
index = this.providerTypes.length;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// If a lower index is provided let's add type at the start
|
|
41
|
+
if (index < 0) {
|
|
42
|
+
index = 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (this.providerTypes.map((p) => p.name).includes(providerType.name)) {
|
|
46
|
+
throw new Error(`Provider type '${providerType.name}' is already registered.`);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// If some provider type is already register on that index, we will make space for new
|
|
50
|
+
if (this.providerTypes.at(index)) {
|
|
51
|
+
this.logger.debug(
|
|
52
|
+
`A provider type '${this.providerTypes[index].name}' already existed at index '${index}', now moved down.`
|
|
53
|
+
);
|
|
54
|
+
this.providerTypes.splice(index, 0, providerType);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
this.logger.debug(`Registered provider type "${providerType.name}" at index ${index}`);
|
|
58
|
+
this.providerTypes[index] = providerType;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
unregister(indexOrName: string | number): void {
|
|
62
|
+
if (typeof indexOrName === "number") {
|
|
63
|
+
if (indexOrName > this.providerTypes.length || indexOrName < 0) {
|
|
64
|
+
throw new Error(`Provider type at index '${indexOrName}' is not registered.`);
|
|
65
|
+
}
|
|
66
|
+
this.providerTypes.splice(indexOrName, 1);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const index = this.providerTypes.findIndex((p) => p.name === indexOrName);
|
|
71
|
+
if (index < 0) {
|
|
72
|
+
throw Error(`Provider type '${indexOrName}' is not registered.`);
|
|
73
|
+
}
|
|
74
|
+
this.providerTypes.splice(index, 1);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
detect(provider: AnyWeb3Provider): Web3ProviderType<AnyWeb3Provider> {
|
|
78
|
+
for (const providerType of Object.values(this.providerTypes)) {
|
|
79
|
+
if (providerType.matched(provider)) {
|
|
80
|
+
return providerType;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
throw new Error(
|
|
85
|
+
`Given provider could not be detected of any type. Supported types are ${Object.keys(this.providerTypes).join()}`
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import https from "node:https";
|
|
3
|
+
import url from "node:url";
|
|
4
|
+
import httpProxy from "http-proxy";
|
|
5
|
+
import {LogLevel} from "@lodestar/logger";
|
|
6
|
+
import {getNodeLogger} from "@lodestar/logger/node";
|
|
7
|
+
import {ELRequestHandler, VerifiedExecutionInitOptions} from "./interfaces.js";
|
|
8
|
+
import {ProofProvider} from "./proof_provider/proof_provider.js";
|
|
9
|
+
import {JsonRpcRequestOrBatch, JsonRpcRequestPayload, JsonRpcResponseOrBatch} from "./types.js";
|
|
10
|
+
import {getResponseForRequest, isBatchRequest} from "./utils/json_rpc.js";
|
|
11
|
+
import {processAndVerifyRequest} from "./utils/process.js";
|
|
12
|
+
import {fetchRequestPayload, fetchResponseBody} from "./utils/req_resp.js";
|
|
13
|
+
import {ELRpcProvider} from "./utils/rpc_provider.js";
|
|
14
|
+
|
|
15
|
+
export type VerifiedProxyOptions = Exclude<VerifiedExecutionInitOptions<false>, "mutateProvider" | "providerTypes"> & {
|
|
16
|
+
executionRpcUrl: string;
|
|
17
|
+
requestTimeout: number;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function createHttpHandler({
|
|
21
|
+
info,
|
|
22
|
+
signal,
|
|
23
|
+
}: {
|
|
24
|
+
signal: AbortSignal;
|
|
25
|
+
info: () => {port: number; host: string; timeout: number} | string;
|
|
26
|
+
}): ELRequestHandler {
|
|
27
|
+
return function handler(payload: JsonRpcRequestOrBatch): Promise<JsonRpcResponseOrBatch | undefined> {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const serverInfo = info();
|
|
30
|
+
if (typeof serverInfo === "string") {
|
|
31
|
+
return reject(new Error(serverInfo));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const req = http.request(
|
|
35
|
+
{
|
|
36
|
+
method: "POST",
|
|
37
|
+
path: "/proxy",
|
|
38
|
+
port: serverInfo.port,
|
|
39
|
+
host: serverInfo.host,
|
|
40
|
+
timeout: serverInfo.timeout,
|
|
41
|
+
signal,
|
|
42
|
+
headers: {
|
|
43
|
+
"Content-Type": "application/json",
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
(res) => {
|
|
47
|
+
fetchResponseBody(res)
|
|
48
|
+
.then((response) => {
|
|
49
|
+
resolve(response);
|
|
50
|
+
})
|
|
51
|
+
.catch(reject);
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
req.on("timeout", () => {
|
|
55
|
+
req.destroy();
|
|
56
|
+
reject(new Error("Request timeout"));
|
|
57
|
+
});
|
|
58
|
+
req.write(JSON.stringify(payload));
|
|
59
|
+
req.end();
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function createVerifiedExecutionProxy(opts: VerifiedProxyOptions): {
|
|
65
|
+
server: http.Server;
|
|
66
|
+
proofProvider: ProofProvider;
|
|
67
|
+
} {
|
|
68
|
+
const {executionRpcUrl, requestTimeout} = opts;
|
|
69
|
+
const signal = opts.signal ?? new AbortController().signal;
|
|
70
|
+
const logger = opts.logger ?? getNodeLogger({level: opts.logLevel ?? LogLevel.info, module: "prover"});
|
|
71
|
+
|
|
72
|
+
const proofProvider = ProofProvider.init({
|
|
73
|
+
...opts,
|
|
74
|
+
signal,
|
|
75
|
+
logger,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
logger.info("Creating http proxy", {url: executionRpcUrl});
|
|
79
|
+
const proxy = httpProxy.createProxy({
|
|
80
|
+
target: executionRpcUrl,
|
|
81
|
+
ws: executionRpcUrl.startsWith("ws"),
|
|
82
|
+
agent: executionRpcUrl.startsWith("https") ? https.globalAgent : http.globalAgent,
|
|
83
|
+
xfwd: true,
|
|
84
|
+
ignorePath: true,
|
|
85
|
+
changeOrigin: true,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
let proxyServerListeningAddress: {host: string; port: number} | undefined;
|
|
89
|
+
const rpc = new ELRpcProvider(
|
|
90
|
+
createHttpHandler({
|
|
91
|
+
signal,
|
|
92
|
+
info: () => {
|
|
93
|
+
if (!proxyServerListeningAddress) {
|
|
94
|
+
return "Proxy server not listening";
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
port: proxyServerListeningAddress.port,
|
|
99
|
+
host: proxyServerListeningAddress.host,
|
|
100
|
+
timeout: requestTimeout,
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
104
|
+
logger
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
logger.info("Creating http server");
|
|
108
|
+
const proxyServer = http.createServer(function proxyRequestHandler(req, res) {
|
|
109
|
+
if (req.url === "/proxy") {
|
|
110
|
+
logger.debug("Forwarding request to execution layer");
|
|
111
|
+
proxy.web(req, res);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
let payload: JsonRpcRequestPayload;
|
|
116
|
+
fetchRequestPayload(req)
|
|
117
|
+
.then((data) => {
|
|
118
|
+
payload = data;
|
|
119
|
+
return processAndVerifyRequest({payload, proofProvider, rpc, logger});
|
|
120
|
+
})
|
|
121
|
+
.then((response) => {
|
|
122
|
+
res.write(JSON.stringify(response));
|
|
123
|
+
res.end();
|
|
124
|
+
})
|
|
125
|
+
.catch((err) => {
|
|
126
|
+
logger.error("Error processing request", err);
|
|
127
|
+
const message = (err as Error).message;
|
|
128
|
+
if (isBatchRequest(payload)) {
|
|
129
|
+
res.write(JSON.stringify(payload.map((req) => getResponseForRequest(req, {message}))));
|
|
130
|
+
} else {
|
|
131
|
+
res.write(JSON.stringify(getResponseForRequest(payload, undefined, {message})));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
res.end();
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
proxyServer.on("listening", () => {
|
|
139
|
+
const address = proxyServer.address();
|
|
140
|
+
|
|
141
|
+
if (address === null) {
|
|
142
|
+
throw new Error("Invalid proxy server address");
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (typeof address === "string") {
|
|
146
|
+
const rawUrl = url.parse(address);
|
|
147
|
+
if (!rawUrl.host || !rawUrl.port || !rawUrl.protocol) {
|
|
148
|
+
throw new Error(`Invalid proxy server address: ${address}`);
|
|
149
|
+
}
|
|
150
|
+
proxyServerListeningAddress = {host: rawUrl.host, port: parseInt(rawUrl.port)};
|
|
151
|
+
} else {
|
|
152
|
+
proxyServerListeningAddress = {host: address.address, port: address.port};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
logger.info(
|
|
156
|
+
`Lodestar Prover Proxy listening on ${proxyServerListeningAddress.host}:${proxyServerListeningAddress.port}`
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
rpc.verifyCompatibility().catch((err) => {
|
|
160
|
+
logger.error(err);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
proxyServer.on("upgrade", function proxyRequestUpgrade(req, socket, head) {
|
|
166
|
+
logger.debug("Upgrading the ws connection");
|
|
167
|
+
proxy.ws(req, socket, head);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
signal.addEventListener("abort", () => {
|
|
171
|
+
proxyServer.close();
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
return {server: proxyServer, proofProvider};
|
|
175
|
+
}
|