@aztec/prover-node 0.0.0-test.0
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/README.md +1 -0
- package/dest/config.d.ts +28 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +71 -0
- package/dest/factory.d.ts +25 -0
- package/dest/factory.d.ts.map +1 -0
- package/dest/factory.js +60 -0
- package/dest/http.d.ts +8 -0
- package/dest/http.d.ts.map +1 -0
- package/dest/http.js +9 -0
- package/dest/index.d.ts +6 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +5 -0
- package/dest/job/epoch-proving-job.d.ts +54 -0
- package/dest/job/epoch-proving-job.d.ts.map +1 -0
- package/dest/job/epoch-proving-job.js +255 -0
- package/dest/metrics.d.ts +26 -0
- package/dest/metrics.d.ts.map +1 -0
- package/dest/metrics.js +129 -0
- package/dest/monitors/epoch-monitor.d.ts +40 -0
- package/dest/monitors/epoch-monitor.d.ts.map +1 -0
- package/dest/monitors/epoch-monitor.js +104 -0
- package/dest/monitors/index.d.ts +2 -0
- package/dest/monitors/index.d.ts.map +1 -0
- package/dest/monitors/index.js +1 -0
- package/dest/prover-coordination/config.d.ts +7 -0
- package/dest/prover-coordination/config.d.ts.map +1 -0
- package/dest/prover-coordination/config.js +11 -0
- package/dest/prover-coordination/factory.d.ts +22 -0
- package/dest/prover-coordination/factory.d.ts.map +1 -0
- package/dest/prover-coordination/factory.js +42 -0
- package/dest/prover-coordination/index.d.ts +3 -0
- package/dest/prover-coordination/index.d.ts.map +1 -0
- package/dest/prover-coordination/index.js +2 -0
- package/dest/prover-node-publisher.d.ts +61 -0
- package/dest/prover-node-publisher.d.ts.map +1 -0
- package/dest/prover-node-publisher.js +192 -0
- package/dest/prover-node.d.ts +102 -0
- package/dest/prover-node.d.ts.map +1 -0
- package/dest/prover-node.js +258 -0
- package/dest/test/index.d.ts +10 -0
- package/dest/test/index.d.ts.map +1 -0
- package/dest/test/index.js +5 -0
- package/package.json +98 -0
- package/src/config.ts +115 -0
- package/src/factory.ts +99 -0
- package/src/http.ts +13 -0
- package/src/index.ts +5 -0
- package/src/job/epoch-proving-job.ts +255 -0
- package/src/metrics.ts +164 -0
- package/src/monitors/epoch-monitor.ts +106 -0
- package/src/monitors/index.ts +1 -0
- package/src/prover-coordination/config.ts +17 -0
- package/src/prover-coordination/factory.ts +72 -0
- package/src/prover-coordination/index.ts +2 -0
- package/src/prover-node-publisher.ts +286 -0
- package/src/prover-node.ts +335 -0
- package/src/test/index.ts +11 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Prover Node
|
package/dest/config.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type ArchiverConfig } from '@aztec/archiver/config';
|
|
2
|
+
import type { ACVMConfig, BBConfig } from '@aztec/bb-prover/config';
|
|
3
|
+
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
4
|
+
import { type DataStoreConfig } from '@aztec/kv-store/config';
|
|
5
|
+
import { type P2PConfig } from '@aztec/p2p/config';
|
|
6
|
+
import { type ProverAgentConfig, type ProverBrokerConfig } from '@aztec/prover-client/broker';
|
|
7
|
+
import { type ProverClientConfig } from '@aztec/prover-client/config';
|
|
8
|
+
import { type PublisherConfig, type TxSenderConfig } from '@aztec/sequencer-client/config';
|
|
9
|
+
import { type WorldStateConfig } from '@aztec/world-state/config';
|
|
10
|
+
import { type ProverCoordinationConfig } from './prover-coordination/config.js';
|
|
11
|
+
export type ProverNodeConfig = ArchiverConfig & ProverClientConfig & P2PConfig & WorldStateConfig & PublisherConfig & TxSenderConfig & DataStoreConfig & ProverCoordinationConfig & SpecificProverNodeConfig & {
|
|
12
|
+
/** Whether to populate the genesis state with initial fee juice for the test accounts */
|
|
13
|
+
testAccounts: boolean;
|
|
14
|
+
};
|
|
15
|
+
type SpecificProverNodeConfig = {
|
|
16
|
+
proverNodeMaxPendingJobs: number;
|
|
17
|
+
proverNodePollingIntervalMs: number;
|
|
18
|
+
proverNodeMaxParallelBlocksPerEpoch: number;
|
|
19
|
+
txGatheringTimeoutMs: number;
|
|
20
|
+
txGatheringIntervalMs: number;
|
|
21
|
+
txGatheringMaxParallelRequests: number;
|
|
22
|
+
};
|
|
23
|
+
export declare const proverNodeConfigMappings: ConfigMappingsType<ProverNodeConfig>;
|
|
24
|
+
export declare function getProverNodeConfigFromEnv(): ProverNodeConfig;
|
|
25
|
+
export declare function getProverNodeBrokerConfigFromEnv(): ProverBrokerConfig;
|
|
26
|
+
export declare function getProverNodeAgentConfigFromEnv(): ProverAgentConfig & BBConfig & ACVMConfig;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,wBAAwB,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAGxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,kBAAkB,EAAgD,MAAM,6BAA6B,CAAC;AACpH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EAGpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,2BAA2B,CAAC;AAE5F,OAAO,EAAE,KAAK,wBAAwB,EAAoC,MAAM,iCAAiC,CAAC;AAElH,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAC3C,kBAAkB,GAClB,SAAS,GACT,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,eAAe,GACf,wBAAwB,GACxB,wBAAwB,GAAG;IACzB,yFAAyF;IACzF,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEJ,KAAK,wBAAwB,GAAG;IAC9B,wBAAwB,EAAE,MAAM,CAAC;IACjC,2BAA2B,EAAE,MAAM,CAAC;IACpC,mCAAmC,EAAE,MAAM,CAAC;IAC5C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,8BAA8B,EAAE,MAAM,CAAC;CACxC,CAAC;AAmCF,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAezE,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D;AAED,wBAAgB,gCAAgC,IAAI,kBAAkB,CAIrE;AAED,wBAAgB,+BAA+B,IAAI,iBAAiB,GAAG,QAAQ,GAAG,UAAU,CAK3F"}
|
package/dest/config.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { archiverConfigMappings } from '@aztec/archiver/config';
|
|
2
|
+
import { booleanConfigHelper, getConfigFromMappings, numberConfigHelper } from '@aztec/foundation/config';
|
|
3
|
+
import { dataConfigMappings } from '@aztec/kv-store/config';
|
|
4
|
+
import { p2pConfigMappings } from '@aztec/p2p/config';
|
|
5
|
+
import { proverAgentConfigMappings, proverBrokerConfigMappings } from '@aztec/prover-client/broker';
|
|
6
|
+
import { bbConfigMappings, proverClientConfigMappings } from '@aztec/prover-client/config';
|
|
7
|
+
import { getPublisherConfigMappings, getTxSenderConfigMappings } from '@aztec/sequencer-client/config';
|
|
8
|
+
import { worldStateConfigMappings } from '@aztec/world-state/config';
|
|
9
|
+
import { proverCoordinationConfigMappings } from './prover-coordination/config.js';
|
|
10
|
+
const specificProverNodeConfigMappings = {
|
|
11
|
+
proverNodeMaxPendingJobs: {
|
|
12
|
+
env: 'PROVER_NODE_MAX_PENDING_JOBS',
|
|
13
|
+
description: 'The maximum number of pending jobs for the prover node',
|
|
14
|
+
...numberConfigHelper(10)
|
|
15
|
+
},
|
|
16
|
+
proverNodePollingIntervalMs: {
|
|
17
|
+
env: 'PROVER_NODE_POLLING_INTERVAL_MS',
|
|
18
|
+
description: 'The interval in milliseconds to poll for new jobs',
|
|
19
|
+
...numberConfigHelper(1000)
|
|
20
|
+
},
|
|
21
|
+
proverNodeMaxParallelBlocksPerEpoch: {
|
|
22
|
+
env: 'PROVER_NODE_MAX_PARALLEL_BLOCKS_PER_EPOCH',
|
|
23
|
+
description: 'The Maximum number of blocks to process in parallel while proving an epoch',
|
|
24
|
+
...numberConfigHelper(32)
|
|
25
|
+
},
|
|
26
|
+
txGatheringTimeoutMs: {
|
|
27
|
+
env: 'PROVER_NODE_TX_GATHERING_TIMEOUT_MS',
|
|
28
|
+
description: 'The maximum amount of time to wait for tx data to be available',
|
|
29
|
+
...numberConfigHelper(60_000)
|
|
30
|
+
},
|
|
31
|
+
txGatheringIntervalMs: {
|
|
32
|
+
env: 'PROVER_NODE_TX_GATHERING_INTERVAL_MS',
|
|
33
|
+
description: 'How often to check that tx data is available',
|
|
34
|
+
...numberConfigHelper(1_000)
|
|
35
|
+
},
|
|
36
|
+
txGatheringMaxParallelRequests: {
|
|
37
|
+
env: 'PROVER_NODE_TX_GATHERING_MAX_PARALLEL_REQUESTS',
|
|
38
|
+
description: 'How many txs to load up a time',
|
|
39
|
+
...numberConfigHelper(100)
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
export const proverNodeConfigMappings = {
|
|
43
|
+
...dataConfigMappings,
|
|
44
|
+
...archiverConfigMappings,
|
|
45
|
+
...proverClientConfigMappings,
|
|
46
|
+
...p2pConfigMappings,
|
|
47
|
+
...worldStateConfigMappings,
|
|
48
|
+
...getPublisherConfigMappings('PROVER'),
|
|
49
|
+
...getTxSenderConfigMappings('PROVER'),
|
|
50
|
+
...proverCoordinationConfigMappings,
|
|
51
|
+
...specificProverNodeConfigMappings,
|
|
52
|
+
testAccounts: {
|
|
53
|
+
env: 'TEST_ACCOUNTS',
|
|
54
|
+
description: 'Whether to populate the genesis state with initial fee juice for the test accounts.',
|
|
55
|
+
...booleanConfigHelper(false)
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
export function getProverNodeConfigFromEnv() {
|
|
59
|
+
return getConfigFromMappings(proverNodeConfigMappings);
|
|
60
|
+
}
|
|
61
|
+
export function getProverNodeBrokerConfigFromEnv() {
|
|
62
|
+
return {
|
|
63
|
+
...getConfigFromMappings(proverBrokerConfigMappings)
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function getProverNodeAgentConfigFromEnv() {
|
|
67
|
+
return {
|
|
68
|
+
...getConfigFromMappings(proverAgentConfigMappings),
|
|
69
|
+
...getConfigFromMappings(bbConfigMappings)
|
|
70
|
+
};
|
|
71
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Archiver } from '@aztec/archiver';
|
|
2
|
+
import { type BlobSinkClientInterface } from '@aztec/blob-sink/client';
|
|
3
|
+
import { L1TxUtils } from '@aztec/ethereum';
|
|
4
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
5
|
+
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
6
|
+
import type { ProverCoordination, ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
|
|
7
|
+
import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
8
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
9
|
+
import type { ProverNodeConfig } from './config.js';
|
|
10
|
+
import { ProverNodePublisher } from './prover-node-publisher.js';
|
|
11
|
+
import { ProverNode } from './prover-node.js';
|
|
12
|
+
/** Creates a new prover node given a config. */
|
|
13
|
+
export declare function createProverNode(config: ProverNodeConfig & DataStoreConfig, deps?: {
|
|
14
|
+
telemetry?: TelemetryClient;
|
|
15
|
+
log?: Logger;
|
|
16
|
+
aztecNodeTxProvider?: ProverCoordination;
|
|
17
|
+
archiver?: Archiver;
|
|
18
|
+
publisher?: ProverNodePublisher;
|
|
19
|
+
blobSinkClient?: BlobSinkClientInterface;
|
|
20
|
+
broker?: ProvingJobBroker;
|
|
21
|
+
l1TxUtils?: L1TxUtils;
|
|
22
|
+
}, options?: {
|
|
23
|
+
prefilledPublicData?: PublicDataTreeLeaf[];
|
|
24
|
+
}): Promise<ProverNode>;
|
|
25
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,KAAK,uBAAuB,EAAwB,MAAM,yBAAyB,CAAC;AAE7F,OAAO,EAAE,SAAS,EAAwD,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAGnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AAEtE,gDAAgD;AAChD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,GAAG,eAAe,EAC1C,IAAI,GAAE;IACJ,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,cAAc,CAAC,EAAE,uBAAuB,CAAC;IACzC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;CAClB,EACN,OAAO,GAAE;IACP,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACvC,uBAgEP"}
|
package/dest/factory.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createArchiver } from '@aztec/archiver';
|
|
2
|
+
import { createBlobSinkClient } from '@aztec/blob-sink/client';
|
|
3
|
+
import { EpochCache } from '@aztec/epoch-cache';
|
|
4
|
+
import { L1TxUtils, RollupContract, createEthereumChain, createL1Clients } from '@aztec/ethereum';
|
|
5
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
6
|
+
import { createProverClient } from '@aztec/prover-client';
|
|
7
|
+
import { createAndStartProvingBroker } from '@aztec/prover-client/broker';
|
|
8
|
+
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
9
|
+
import { createWorldStateSynchronizer } from '@aztec/world-state';
|
|
10
|
+
import { EpochMonitor } from './monitors/epoch-monitor.js';
|
|
11
|
+
import { createProverCoordination } from './prover-coordination/factory.js';
|
|
12
|
+
import { ProverNodePublisher } from './prover-node-publisher.js';
|
|
13
|
+
import { ProverNode } from './prover-node.js';
|
|
14
|
+
/** Creates a new prover node given a config. */ export async function createProverNode(config, deps = {}, options = {}) {
|
|
15
|
+
const telemetry = deps.telemetry ?? getTelemetryClient();
|
|
16
|
+
const blobSinkClient = deps.blobSinkClient ?? createBlobSinkClient(config);
|
|
17
|
+
const log = deps.log ?? createLogger('prover-node');
|
|
18
|
+
const archiver = deps.archiver ?? await createArchiver(config, blobSinkClient, {
|
|
19
|
+
blockUntilSync: true
|
|
20
|
+
}, telemetry);
|
|
21
|
+
log.verbose(`Created archiver and synced to block ${await archiver.getBlockNumber()}`);
|
|
22
|
+
const worldStateConfig = {
|
|
23
|
+
...config,
|
|
24
|
+
worldStateProvenBlocksOnly: false
|
|
25
|
+
};
|
|
26
|
+
const worldStateSynchronizer = await createWorldStateSynchronizer(worldStateConfig, archiver, options.prefilledPublicData, telemetry);
|
|
27
|
+
await worldStateSynchronizer.start();
|
|
28
|
+
const broker = deps.broker ?? await createAndStartProvingBroker(config, telemetry);
|
|
29
|
+
const prover = await createProverClient(config, worldStateSynchronizer, broker, telemetry);
|
|
30
|
+
const { l1RpcUrls: rpcUrls, l1ChainId: chainId, publisherPrivateKey } = config;
|
|
31
|
+
const chain = createEthereumChain(rpcUrls, chainId);
|
|
32
|
+
const { publicClient, walletClient } = createL1Clients(rpcUrls, publisherPrivateKey, chain.chainInfo);
|
|
33
|
+
const rollupContract = new RollupContract(publicClient, config.l1Contracts.rollupAddress.toString());
|
|
34
|
+
const l1TxUtils = deps.l1TxUtils ?? new L1TxUtils(publicClient, walletClient, log, config);
|
|
35
|
+
const publisher = deps.publisher ?? new ProverNodePublisher(config, {
|
|
36
|
+
telemetry,
|
|
37
|
+
rollupContract,
|
|
38
|
+
l1TxUtils
|
|
39
|
+
});
|
|
40
|
+
const epochCache = await EpochCache.create(config.l1Contracts.rollupAddress, config);
|
|
41
|
+
// If config.p2pEnabled is true, createProverCoordination will create a p2p client where txs are requested
|
|
42
|
+
// If config.p2pEnabled is false, createProverCoordination request information from the AztecNode
|
|
43
|
+
const proverCoordination = await createProverCoordination(config, {
|
|
44
|
+
aztecNodeTxProvider: deps.aztecNodeTxProvider,
|
|
45
|
+
worldStateSynchronizer,
|
|
46
|
+
archiver,
|
|
47
|
+
epochCache,
|
|
48
|
+
telemetry
|
|
49
|
+
});
|
|
50
|
+
const proverNodeConfig = {
|
|
51
|
+
maxPendingJobs: config.proverNodeMaxPendingJobs,
|
|
52
|
+
pollingIntervalMs: config.proverNodePollingIntervalMs,
|
|
53
|
+
maxParallelBlocksPerEpoch: config.proverNodeMaxParallelBlocksPerEpoch,
|
|
54
|
+
txGatheringMaxParallelRequests: config.txGatheringMaxParallelRequests,
|
|
55
|
+
txGatheringIntervalMs: config.txGatheringIntervalMs,
|
|
56
|
+
txGatheringTimeoutMs: config.txGatheringTimeoutMs
|
|
57
|
+
};
|
|
58
|
+
const epochMonitor = await EpochMonitor.create(archiver, proverNodeConfig, telemetry);
|
|
59
|
+
return new ProverNode(prover, publisher, archiver, archiver, archiver, worldStateSynchronizer, proverCoordination, epochMonitor, proverNodeConfig, telemetry);
|
|
60
|
+
}
|
package/dest/http.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProverNode } from './prover-node.js';
|
|
2
|
+
/**
|
|
3
|
+
* Wrap a ProverNode instance with a JSON RPC HTTP server.
|
|
4
|
+
* @param node - The ProverNode
|
|
5
|
+
* @returns An JSON-RPC HTTP server
|
|
6
|
+
*/
|
|
7
|
+
export declare function createProverNodeRpcServer(node: ProverNode): import("@aztec/foundation/json-rpc/server").SafeJsonRpcServer;
|
|
8
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,UAAU,iEAEzD"}
|
package/dest/http.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ProverNodeApiSchema } from '@aztec/stdlib/interfaces/server';
|
|
2
|
+
import { createTracedJsonRpcServer } from '@aztec/telemetry-client';
|
|
3
|
+
/**
|
|
4
|
+
* Wrap a ProverNode instance with a JSON RPC HTTP server.
|
|
5
|
+
* @param node - The ProverNode
|
|
6
|
+
* @returns An JSON-RPC HTTP server
|
|
7
|
+
*/ export function createProverNodeRpcServer(node) {
|
|
8
|
+
return createTracedJsonRpcServer(node, ProverNodeApiSchema);
|
|
9
|
+
}
|
package/dest/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC"}
|
package/dest/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { PublicProcessorFactory } from '@aztec/simulator/server';
|
|
2
|
+
import type { L2Block, L2BlockSource } from '@aztec/stdlib/block';
|
|
3
|
+
import { type EpochProver, type EpochProvingJobState, type ForkMerkleTreeOperations } from '@aztec/stdlib/interfaces/server';
|
|
4
|
+
import type { L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
5
|
+
import type { Tx } from '@aztec/stdlib/tx';
|
|
6
|
+
import { type Traceable, type Tracer } from '@aztec/telemetry-client';
|
|
7
|
+
import type { ProverNodeMetrics } from '../metrics.js';
|
|
8
|
+
import type { ProverNodePublisher } from '../prover-node-publisher.js';
|
|
9
|
+
/**
|
|
10
|
+
* Job that grabs a range of blocks from the unfinalised chain from L1, gets their txs given their hashes,
|
|
11
|
+
* re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
|
|
12
|
+
* world state as part of public call execution via the public processor.
|
|
13
|
+
*/
|
|
14
|
+
export declare class EpochProvingJob implements Traceable {
|
|
15
|
+
private dbProvider;
|
|
16
|
+
private epochNumber;
|
|
17
|
+
private blocks;
|
|
18
|
+
private txs;
|
|
19
|
+
private prover;
|
|
20
|
+
private publicProcessorFactory;
|
|
21
|
+
private publisher;
|
|
22
|
+
private l2BlockSource;
|
|
23
|
+
private l1ToL2MessageSource;
|
|
24
|
+
private metrics;
|
|
25
|
+
private deadline;
|
|
26
|
+
private config;
|
|
27
|
+
private cleanUp;
|
|
28
|
+
private state;
|
|
29
|
+
private log;
|
|
30
|
+
private uuid;
|
|
31
|
+
private runPromise;
|
|
32
|
+
private deadlineTimeoutHandler;
|
|
33
|
+
readonly tracer: Tracer;
|
|
34
|
+
constructor(dbProvider: ForkMerkleTreeOperations, epochNumber: bigint, blocks: L2Block[], txs: Tx[], prover: EpochProver, publicProcessorFactory: PublicProcessorFactory, publisher: ProverNodePublisher, l2BlockSource: L2BlockSource, l1ToL2MessageSource: L1ToL2MessageSource, metrics: ProverNodeMetrics, deadline: Date | undefined, config?: {
|
|
35
|
+
parallelBlockLimit: number;
|
|
36
|
+
}, cleanUp?: (job: EpochProvingJob) => Promise<void>);
|
|
37
|
+
getId(): string;
|
|
38
|
+
getState(): EpochProvingJobState;
|
|
39
|
+
getEpochNumber(): bigint;
|
|
40
|
+
/**
|
|
41
|
+
* Proves the given epoch and submits the proof to L1.
|
|
42
|
+
*/
|
|
43
|
+
run(): Promise<void>;
|
|
44
|
+
private progressState;
|
|
45
|
+
private checkState;
|
|
46
|
+
stop(state?: EpochProvingJobState): Promise<void>;
|
|
47
|
+
private scheduleDeadlineStop;
|
|
48
|
+
private getBlockHeader;
|
|
49
|
+
private getTxs;
|
|
50
|
+
private getL1ToL2Messages;
|
|
51
|
+
private processTxs;
|
|
52
|
+
}
|
|
53
|
+
export { type EpochProvingJobState };
|
|
54
|
+
//# sourceMappingURL=epoch-proving-job.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epoch-proving-job.d.ts","sourceRoot":"","sources":["../../src/job/epoch-proving-job.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAmB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EAEzB,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAe,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,MAAM,EAAa,MAAM,yBAAyB,CAAC;AAI7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAW7C,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IAtBjB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,GAAG,CAAiD;IAC5D,OAAO,CAAC,IAAI,CAAS;IAErB,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,sBAAsB,CAA6B;IAE3D,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAGrB,UAAU,EAAE,wBAAwB,EACpC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,EAAE,EACjB,GAAG,EAAE,EAAE,EAAE,EACT,MAAM,EAAE,WAAW,EACnB,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,mBAAmB,EAC9B,aAAa,EAAE,aAAa,EAC5B,mBAAmB,EAAE,mBAAmB,EACxC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,IAAI,GAAG,SAAS,EAC1B,MAAM,GAAE;QAAE,kBAAkB,EAAE,MAAM,CAAA;KAA+B,EACnE,OAAO,GAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAA2B;IAM7E,KAAK,IAAI,MAAM;IAIf,QAAQ,IAAI,oBAAoB;IAIhC,cAAc,IAAI,MAAM;IAI/B;;OAEG;IAIU,GAAG;IAgGhB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,UAAU;IAML,IAAI,CAAC,KAAK,GAAE,oBAAgC;IASzD,OAAO,CAAC,oBAAoB;YAqBd,cAAc;YAOd,MAAM;IAQpB,OAAO,CAAC,iBAAiB;YAIX,UAAU;CAgBzB;AASD,OAAO,EAAE,KAAK,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
import { asyncPool } from '@aztec/foundation/async-pool';
|
|
8
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
9
|
+
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
10
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
11
|
+
import { EpochProvingJobTerminalState } from '@aztec/stdlib/interfaces/server';
|
|
12
|
+
import { Attributes, trackSpan } from '@aztec/telemetry-client';
|
|
13
|
+
import * as crypto from 'node:crypto';
|
|
14
|
+
/**
|
|
15
|
+
* Job that grabs a range of blocks from the unfinalised chain from L1, gets their txs given their hashes,
|
|
16
|
+
* re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
|
|
17
|
+
* world state as part of public call execution via the public processor.
|
|
18
|
+
*/ export class EpochProvingJob {
|
|
19
|
+
dbProvider;
|
|
20
|
+
epochNumber;
|
|
21
|
+
blocks;
|
|
22
|
+
txs;
|
|
23
|
+
prover;
|
|
24
|
+
publicProcessorFactory;
|
|
25
|
+
publisher;
|
|
26
|
+
l2BlockSource;
|
|
27
|
+
l1ToL2MessageSource;
|
|
28
|
+
metrics;
|
|
29
|
+
deadline;
|
|
30
|
+
config;
|
|
31
|
+
cleanUp;
|
|
32
|
+
state;
|
|
33
|
+
log;
|
|
34
|
+
uuid;
|
|
35
|
+
runPromise;
|
|
36
|
+
deadlineTimeoutHandler;
|
|
37
|
+
tracer;
|
|
38
|
+
constructor(dbProvider, epochNumber, blocks, txs, prover, publicProcessorFactory, publisher, l2BlockSource, l1ToL2MessageSource, metrics, deadline, config = {
|
|
39
|
+
parallelBlockLimit: 32
|
|
40
|
+
}, cleanUp = ()=>Promise.resolve()){
|
|
41
|
+
this.dbProvider = dbProvider;
|
|
42
|
+
this.epochNumber = epochNumber;
|
|
43
|
+
this.blocks = blocks;
|
|
44
|
+
this.txs = txs;
|
|
45
|
+
this.prover = prover;
|
|
46
|
+
this.publicProcessorFactory = publicProcessorFactory;
|
|
47
|
+
this.publisher = publisher;
|
|
48
|
+
this.l2BlockSource = l2BlockSource;
|
|
49
|
+
this.l1ToL2MessageSource = l1ToL2MessageSource;
|
|
50
|
+
this.metrics = metrics;
|
|
51
|
+
this.deadline = deadline;
|
|
52
|
+
this.config = config;
|
|
53
|
+
this.cleanUp = cleanUp;
|
|
54
|
+
this.state = 'initialized';
|
|
55
|
+
this.log = createLogger('prover-node:epoch-proving-job');
|
|
56
|
+
this.uuid = crypto.randomUUID();
|
|
57
|
+
this.tracer = metrics.client.getTracer('EpochProvingJob');
|
|
58
|
+
}
|
|
59
|
+
getId() {
|
|
60
|
+
return this.uuid;
|
|
61
|
+
}
|
|
62
|
+
getState() {
|
|
63
|
+
return this.state;
|
|
64
|
+
}
|
|
65
|
+
getEpochNumber() {
|
|
66
|
+
return this.epochNumber;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Proves the given epoch and submits the proof to L1.
|
|
70
|
+
*/ async run() {
|
|
71
|
+
this.scheduleDeadlineStop();
|
|
72
|
+
const epochNumber = Number(this.epochNumber);
|
|
73
|
+
const epochSizeBlocks = this.blocks.length;
|
|
74
|
+
const epochSizeTxs = this.blocks.reduce((total, current)=>total + current.body.txEffects.length, 0);
|
|
75
|
+
const [fromBlock, toBlock] = [
|
|
76
|
+
this.blocks[0].number,
|
|
77
|
+
this.blocks.at(-1).number
|
|
78
|
+
];
|
|
79
|
+
this.log.info(`Starting epoch ${epochNumber} proving job with blocks ${fromBlock} to ${toBlock}`, {
|
|
80
|
+
fromBlock,
|
|
81
|
+
toBlock,
|
|
82
|
+
epochSizeBlocks,
|
|
83
|
+
epochNumber,
|
|
84
|
+
uuid: this.uuid
|
|
85
|
+
});
|
|
86
|
+
this.progressState('processing');
|
|
87
|
+
const timer = new Timer();
|
|
88
|
+
const { promise, resolve } = promiseWithResolvers();
|
|
89
|
+
this.runPromise = promise;
|
|
90
|
+
try {
|
|
91
|
+
this.prover.startNewEpoch(epochNumber, fromBlock, epochSizeBlocks);
|
|
92
|
+
await this.prover.startTubeCircuits(this.txs);
|
|
93
|
+
await asyncPool(this.config.parallelBlockLimit, this.blocks, async (block)=>{
|
|
94
|
+
this.checkState();
|
|
95
|
+
const globalVariables = block.header.globalVariables;
|
|
96
|
+
const txs = await this.getTxs(block);
|
|
97
|
+
const l1ToL2Messages = await this.getL1ToL2Messages(block);
|
|
98
|
+
const previousHeader = await this.getBlockHeader(block.number - 1);
|
|
99
|
+
this.log.verbose(`Starting processing block ${block.number}`, {
|
|
100
|
+
number: block.number,
|
|
101
|
+
blockHash: (await block.hash()).toString(),
|
|
102
|
+
lastArchive: block.header.lastArchive.root,
|
|
103
|
+
noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
|
|
104
|
+
nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
|
|
105
|
+
publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
|
|
106
|
+
previousHeader: previousHeader.hash(),
|
|
107
|
+
uuid: this.uuid,
|
|
108
|
+
...globalVariables
|
|
109
|
+
});
|
|
110
|
+
// Start block proving
|
|
111
|
+
await this.prover.startNewBlock(globalVariables, l1ToL2Messages, previousHeader);
|
|
112
|
+
// Process public fns
|
|
113
|
+
const db = await this.dbProvider.fork(block.number - 1);
|
|
114
|
+
const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, true);
|
|
115
|
+
const processed = await this.processTxs(publicProcessor, txs);
|
|
116
|
+
await this.prover.addTxs(processed);
|
|
117
|
+
await db.close();
|
|
118
|
+
this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
|
|
119
|
+
blockNumber: block.number,
|
|
120
|
+
blockHash: (await block.hash()).toString(),
|
|
121
|
+
uuid: this.uuid
|
|
122
|
+
});
|
|
123
|
+
// Mark block as completed to pad it
|
|
124
|
+
await this.prover.setBlockCompleted(block.number, block.header);
|
|
125
|
+
});
|
|
126
|
+
const executionTime = timer.ms();
|
|
127
|
+
this.progressState('awaiting-prover');
|
|
128
|
+
const { publicInputs, proof } = await this.prover.finaliseEpoch();
|
|
129
|
+
this.log.info(`Finalised proof for epoch ${epochNumber}`, {
|
|
130
|
+
epochNumber,
|
|
131
|
+
uuid: this.uuid,
|
|
132
|
+
duration: timer.ms()
|
|
133
|
+
});
|
|
134
|
+
this.progressState('publishing-proof');
|
|
135
|
+
const success = await this.publisher.submitEpochProof({
|
|
136
|
+
fromBlock,
|
|
137
|
+
toBlock,
|
|
138
|
+
epochNumber,
|
|
139
|
+
publicInputs,
|
|
140
|
+
proof
|
|
141
|
+
});
|
|
142
|
+
if (!success) {
|
|
143
|
+
throw new Error('Failed to submit epoch proof to L1');
|
|
144
|
+
}
|
|
145
|
+
this.log.info(`Submitted proof for epoch ${epochNumber} (blocks ${fromBlock} to ${toBlock})`, {
|
|
146
|
+
epochNumber,
|
|
147
|
+
uuid: this.uuid
|
|
148
|
+
});
|
|
149
|
+
this.state = 'completed';
|
|
150
|
+
this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
|
|
151
|
+
} catch (err) {
|
|
152
|
+
if (err && err.name === 'HaltExecutionError') {
|
|
153
|
+
this.log.warn(`Halted execution of epoch ${epochNumber} prover job`, {
|
|
154
|
+
uuid: this.uuid,
|
|
155
|
+
epochNumber
|
|
156
|
+
});
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
this.log.error(`Error running epoch ${epochNumber} prover job`, err, {
|
|
160
|
+
uuid: this.uuid,
|
|
161
|
+
epochNumber
|
|
162
|
+
});
|
|
163
|
+
this.state = 'failed';
|
|
164
|
+
} finally{
|
|
165
|
+
clearTimeout(this.deadlineTimeoutHandler);
|
|
166
|
+
await this.cleanUp(this);
|
|
167
|
+
await this.prover.stop();
|
|
168
|
+
resolve();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
progressState(state) {
|
|
172
|
+
this.checkState();
|
|
173
|
+
this.state = state;
|
|
174
|
+
}
|
|
175
|
+
checkState() {
|
|
176
|
+
if (this.state === 'timed-out' || this.state === 'stopped' || this.state === 'failed') {
|
|
177
|
+
throw new HaltExecutionError(this.state);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async stop(state = 'stopped') {
|
|
181
|
+
this.state = state;
|
|
182
|
+
this.prover.cancel();
|
|
183
|
+
// TODO(palla/prover): Stop the publisher as well
|
|
184
|
+
if (this.runPromise) {
|
|
185
|
+
await this.runPromise;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
scheduleDeadlineStop() {
|
|
189
|
+
const deadline = this.deadline;
|
|
190
|
+
if (deadline) {
|
|
191
|
+
const timeout = deadline.getTime() - Date.now();
|
|
192
|
+
if (timeout <= 0) {
|
|
193
|
+
throw new Error('Cannot start job with deadline in the past');
|
|
194
|
+
}
|
|
195
|
+
this.deadlineTimeoutHandler = setTimeout(()=>{
|
|
196
|
+
if (EpochProvingJobTerminalState.includes(this.state)) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
this.log.warn('Stopping job due to deadline hit', {
|
|
200
|
+
uuid: this.uuid,
|
|
201
|
+
epochNumber: this.epochNumber
|
|
202
|
+
});
|
|
203
|
+
this.stop('timed-out').catch((err)=>{
|
|
204
|
+
this.log.error('Error stopping job', err, {
|
|
205
|
+
uuid: this.uuid,
|
|
206
|
+
epochNumber: this.epochNumber
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
}, timeout);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/* Returns the header for the given block number, or the genesis block for block zero. */ async getBlockHeader(blockNumber) {
|
|
213
|
+
if (blockNumber === 0) {
|
|
214
|
+
return (await this.dbProvider.fork()).getInitialHeader();
|
|
215
|
+
}
|
|
216
|
+
return this.l2BlockSource.getBlockHeader(blockNumber);
|
|
217
|
+
}
|
|
218
|
+
async getTxs(block) {
|
|
219
|
+
const txHashes = block.body.txEffects.map((tx)=>tx.txHash.toBigInt());
|
|
220
|
+
const txsAndHashes = await Promise.all(this.txs.map(async (tx)=>({
|
|
221
|
+
tx,
|
|
222
|
+
hash: await tx.getTxHash()
|
|
223
|
+
})));
|
|
224
|
+
return txsAndHashes.filter((txAndHash)=>txHashes.includes(txAndHash.hash.toBigInt())).map((txAndHash)=>txAndHash.tx);
|
|
225
|
+
}
|
|
226
|
+
getL1ToL2Messages(block) {
|
|
227
|
+
return this.l1ToL2MessageSource.getL1ToL2Messages(BigInt(block.number));
|
|
228
|
+
}
|
|
229
|
+
async processTxs(publicProcessor, txs) {
|
|
230
|
+
const { deadline } = this;
|
|
231
|
+
const [processedTxs, failedTxs] = await publicProcessor.process(txs, {
|
|
232
|
+
deadline
|
|
233
|
+
});
|
|
234
|
+
if (failedTxs.length) {
|
|
235
|
+
throw new Error(`Txs failed processing: ${failedTxs.map(({ tx, error })=>`${tx.getTxHash()} (${error})`).join(', ')}`);
|
|
236
|
+
}
|
|
237
|
+
if (processedTxs.length !== txs.length) {
|
|
238
|
+
throw new Error(`Failed to process all txs: processed ${processedTxs.length} out of ${txs.length}`);
|
|
239
|
+
}
|
|
240
|
+
return processedTxs;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
_ts_decorate([
|
|
244
|
+
trackSpan('EpochProvingJob.run', function() {
|
|
245
|
+
return {
|
|
246
|
+
[Attributes.EPOCH_NUMBER]: Number(this.epochNumber)
|
|
247
|
+
};
|
|
248
|
+
})
|
|
249
|
+
], EpochProvingJob.prototype, "run", null);
|
|
250
|
+
class HaltExecutionError extends Error {
|
|
251
|
+
constructor(state){
|
|
252
|
+
super(`Halted execution due to state ${state}`);
|
|
253
|
+
this.name = 'HaltExecutionError';
|
|
254
|
+
}
|
|
255
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { L1PublishProofStats } from '@aztec/stdlib/stats';
|
|
2
|
+
import { type Gauge, type Histogram, type TelemetryClient, type UpDownCounter } from '@aztec/telemetry-client';
|
|
3
|
+
export declare class ProverNodeMetrics {
|
|
4
|
+
readonly client: TelemetryClient;
|
|
5
|
+
private logger;
|
|
6
|
+
proverEpochExecutionDuration: Histogram;
|
|
7
|
+
provingJobDuration: Histogram;
|
|
8
|
+
provingJobBlocks: Gauge;
|
|
9
|
+
provingJobTransactions: Gauge;
|
|
10
|
+
gasPrice: Histogram;
|
|
11
|
+
txCount: UpDownCounter;
|
|
12
|
+
txDuration: Histogram;
|
|
13
|
+
txGas: Histogram;
|
|
14
|
+
txCalldataSize: Histogram;
|
|
15
|
+
txCalldataGas: Histogram;
|
|
16
|
+
txBlobDataGasUsed: Histogram;
|
|
17
|
+
txBlobDataGasCost: Histogram;
|
|
18
|
+
private senderBalance;
|
|
19
|
+
constructor(client: TelemetryClient, name?: string, logger?: import("@aztec/foundation/log").Logger);
|
|
20
|
+
recordFailedTx(): void;
|
|
21
|
+
recordSubmitProof(durationMs: number, stats: L1PublishProofStats): void;
|
|
22
|
+
recordProvingJob(executionTimeMs: number, totalTimeMs: number, numBlocks: number, numTxs: number): void;
|
|
23
|
+
recordSenderBalance(wei: bigint, senderAddress: string): void;
|
|
24
|
+
private recordTx;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,SAAS,EAEd,KAAK,eAAe,EACpB,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,iBAAiB;aAkBV,MAAM,EAAE,eAAe;IAEvC,OAAO,CAAC,MAAM;IAnBhB,4BAA4B,EAAE,SAAS,CAAC;IACxC,kBAAkB,EAAE,SAAS,CAAC;IAC9B,gBAAgB,EAAE,KAAK,CAAC;IACxB,sBAAsB,EAAE,KAAK,CAAC;IAE9B,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,SAAS,CAAC;IACzB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,EAAE,SAAS,CAAC;IAE7B,OAAO,CAAC,aAAa,CAAQ;gBAGX,MAAM,EAAE,eAAe,EACvC,IAAI,SAAe,EACX,MAAM,yCAAgD;IA2EhE,cAAc;IAOd,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;IAIzD,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAOhG,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAO7D,OAAO,CAAC,QAAQ;CA6BjB"}
|