@aztec/aztec 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 +57 -0
- package/dest/bin/index.d.ts +3 -0
- package/dest/bin/index.d.ts.map +1 -0
- package/dest/bin/index.js +46 -0
- package/dest/cli/aztec_start_action.d.ts +3 -0
- package/dest/cli/aztec_start_action.d.ts.map +1 -0
- package/dest/cli/aztec_start_action.js +108 -0
- package/dest/cli/aztec_start_options.d.ts +15 -0
- package/dest/cli/aztec_start_options.d.ts.map +1 -0
- package/dest/cli/aztec_start_options.js +348 -0
- package/dest/cli/chain_l2_config.d.ts +19 -0
- package/dest/cli/chain_l2_config.d.ts.map +1 -0
- package/dest/cli/chain_l2_config.js +56 -0
- package/dest/cli/cli.d.ts +9 -0
- package/dest/cli/cli.d.ts.map +1 -0
- package/dest/cli/cli.js +33 -0
- package/dest/cli/cmds/start_archiver.d.ts +9 -0
- package/dest/cli/cmds/start_archiver.d.ts.map +1 -0
- package/dest/cli/cmds/start_archiver.js +42 -0
- package/dest/cli/cmds/start_blob_sink.d.ts +3 -0
- package/dest/cli/cmds/start_blob_sink.d.ts.map +1 -0
- package/dest/cli/cmds/start_blob_sink.js +17 -0
- package/dest/cli/cmds/start_bot.d.ts +11 -0
- package/dest/cli/cmds/start_bot.d.ts.map +1 -0
- package/dest/cli/cmds/start_bot.js +31 -0
- package/dest/cli/cmds/start_faucet.d.ts +4 -0
- package/dest/cli/cmds/start_faucet.d.ts.map +1 -0
- package/dest/cli/cmds/start_faucet.js +20 -0
- package/dest/cli/cmds/start_node.d.ts +7 -0
- package/dest/cli/cmds/start_node.d.ts.map +1 -0
- package/dest/cli/cmds/start_node.js +131 -0
- package/dest/cli/cmds/start_p2p_bootstrap.d.ts +6 -0
- package/dest/cli/cmds/start_p2p_bootstrap.d.ts.map +1 -0
- package/dest/cli/cmds/start_p2p_bootstrap.js +26 -0
- package/dest/cli/cmds/start_prover_agent.d.ts +4 -0
- package/dest/cli/cmds/start_prover_agent.d.ts.map +1 -0
- package/dest/cli/cmds/start_prover_agent.js +41 -0
- package/dest/cli/cmds/start_prover_broker.d.ts +9 -0
- package/dest/cli/cmds/start_prover_broker.d.ts.map +1 -0
- package/dest/cli/cmds/start_prover_broker.js +31 -0
- package/dest/cli/cmds/start_prover_node.d.ts +7 -0
- package/dest/cli/cmds/start_prover_node.d.ts.map +1 -0
- package/dest/cli/cmds/start_prover_node.js +110 -0
- package/dest/cli/cmds/start_pxe.d.ts +16 -0
- package/dest/cli/cmds/start_pxe.d.ts.map +1 -0
- package/dest/cli/cmds/start_pxe.js +95 -0
- package/dest/cli/cmds/start_txe.d.ts +3 -0
- package/dest/cli/cmds/start_txe.d.ts.map +1 -0
- package/dest/cli/cmds/start_txe.js +11 -0
- package/dest/cli/get_l1_config.d.ts +7 -0
- package/dest/cli/get_l1_config.d.ts.map +1 -0
- package/dest/cli/get_l1_config.js +13 -0
- package/dest/cli/index.d.ts +2 -0
- package/dest/cli/index.d.ts.map +1 -0
- package/dest/cli/index.js +1 -0
- package/dest/cli/util.d.ts +46 -0
- package/dest/cli/util.d.ts.map +1 -0
- package/dest/cli/util.js +154 -0
- package/dest/cli/versioning.d.ts +4 -0
- package/dest/cli/versioning.d.ts.map +1 -0
- package/dest/cli/versioning.js +9 -0
- package/dest/examples/token.d.ts +2 -0
- package/dest/examples/token.d.ts.map +1 -0
- package/dest/examples/token.js +46 -0
- package/dest/examples/util.d.ts +20 -0
- package/dest/examples/util.d.ts.map +1 -0
- package/dest/examples/util.js +31 -0
- package/dest/index.d.ts +2 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +1 -0
- package/dest/mnemonic.d.ts +2 -0
- package/dest/mnemonic.d.ts.map +1 -0
- package/dest/mnemonic.js +1 -0
- package/dest/sandbox/banana_fpc.d.ts +11 -0
- package/dest/sandbox/banana_fpc.d.ts.map +1 -0
- package/dest/sandbox/banana_fpc.js +79 -0
- package/dest/sandbox/index.d.ts +5 -0
- package/dest/sandbox/index.d.ts.map +1 -0
- package/dest/sandbox/index.js +4 -0
- package/dest/sandbox/sandbox.d.ts +76 -0
- package/dest/sandbox/sandbox.d.ts.map +1 -0
- package/dest/sandbox/sandbox.js +181 -0
- package/dest/sandbox/sponsored_fee_payment_method.d.ts +23 -0
- package/dest/sandbox/sponsored_fee_payment_method.d.ts.map +1 -0
- package/dest/sandbox/sponsored_fee_payment_method.js +36 -0
- package/dest/sandbox/sponsored_fpc.d.ts +6 -0
- package/dest/sandbox/sponsored_fpc.d.ts.map +1 -0
- package/dest/sandbox/sponsored_fpc.js +26 -0
- package/dest/splash.d.ts +3 -0
- package/dest/splash.d.ts.map +1 -0
- package/dest/splash.js +2 -0
- package/package.json +118 -0
- package/src/bin/index.ts +54 -0
- package/src/cli/aztec_start_action.ts +114 -0
- package/src/cli/aztec_start_options.ts +371 -0
- package/src/cli/chain_l2_config.ts +74 -0
- package/src/cli/cli.ts +48 -0
- package/src/cli/cmds/start_archiver.ts +55 -0
- package/src/cli/cmds/start_blob_sink.ts +31 -0
- package/src/cli/cmds/start_bot.ts +49 -0
- package/src/cli/cmds/start_faucet.ts +34 -0
- package/src/cli/cmds/start_node.ts +151 -0
- package/src/cli/cmds/start_p2p_bootstrap.ts +29 -0
- package/src/cli/cmds/start_prover_agent.ts +68 -0
- package/src/cli/cmds/start_prover_broker.ts +46 -0
- package/src/cli/cmds/start_prover_node.ts +121 -0
- package/src/cli/cmds/start_pxe.ts +129 -0
- package/src/cli/cmds/start_txe.ts +15 -0
- package/src/cli/get_l1_config.ts +18 -0
- package/src/cli/index.ts +1 -0
- package/src/cli/util.ts +216 -0
- package/src/cli/versioning.ts +13 -0
- package/src/examples/token.ts +65 -0
- package/src/examples/util.ts +45 -0
- package/src/index.ts +7 -0
- package/src/mnemonic.ts +1 -0
- package/src/sandbox/banana_fpc.ts +83 -0
- package/src/sandbox/index.ts +5 -0
- package/src/sandbox/sandbox.ts +229 -0
- package/src/sandbox/sponsored_fee_payment_method.ts +46 -0
- package/src/sandbox/sponsored_fpc.ts +38 -0
- package/src/splash.ts +10 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { getInitialTestAccounts } from '@aztec/accounts/testing';
|
|
2
|
+
import { type AztecNodeConfig, aztecNodeConfigMappings, getConfigEnvVars } from '@aztec/aztec-node';
|
|
3
|
+
import { NULL_KEY } from '@aztec/ethereum';
|
|
4
|
+
import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
|
|
5
|
+
import type { LogFn } from '@aztec/foundation/log';
|
|
6
|
+
import { AztecNodeApiSchema, type PXE } from '@aztec/stdlib/interfaces/client';
|
|
7
|
+
import { P2PApiSchema } from '@aztec/stdlib/interfaces/server';
|
|
8
|
+
import {
|
|
9
|
+
type TelemetryClientConfig,
|
|
10
|
+
initTelemetryClient,
|
|
11
|
+
telemetryClientConfigMappings,
|
|
12
|
+
} from '@aztec/telemetry-client';
|
|
13
|
+
import { getGenesisValues } from '@aztec/world-state/testing';
|
|
14
|
+
|
|
15
|
+
import { mnemonicToAccount, privateKeyToAccount } from 'viem/accounts';
|
|
16
|
+
|
|
17
|
+
import { createAztecNode, deployContractsToL1 } from '../../sandbox/index.js';
|
|
18
|
+
import { getL1Config } from '../get_l1_config.js';
|
|
19
|
+
import { extractNamespacedOptions, extractRelevantOptions } from '../util.js';
|
|
20
|
+
|
|
21
|
+
export async function startNode(
|
|
22
|
+
options: any,
|
|
23
|
+
signalHandlers: (() => Promise<void>)[],
|
|
24
|
+
services: NamespacedApiHandlers,
|
|
25
|
+
userLog: LogFn,
|
|
26
|
+
): Promise<{ config: AztecNodeConfig }> {
|
|
27
|
+
// options specifically namespaced with --node.<option>
|
|
28
|
+
const nodeSpecificOptions = extractNamespacedOptions(options, 'node');
|
|
29
|
+
// All options that are relevant to the Aztec Node
|
|
30
|
+
let nodeConfig: AztecNodeConfig = {
|
|
31
|
+
...getConfigEnvVars(),
|
|
32
|
+
...extractRelevantOptions(options, aztecNodeConfigMappings, 'node'),
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
if (options.proverNode) {
|
|
36
|
+
userLog(`Running a Prover Node within a Node is not yet supported`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const initialFundedAccounts = nodeConfig.testAccounts ? await getInitialTestAccounts() : [];
|
|
41
|
+
const { genesisBlockHash, genesisArchiveRoot, prefilledPublicData } = await getGenesisValues(
|
|
42
|
+
initialFundedAccounts.map(a => a.address),
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
// Deploy contracts if needed
|
|
46
|
+
if (nodeSpecificOptions.deployAztecContracts || nodeSpecificOptions.deployAztecContractsSalt) {
|
|
47
|
+
let account;
|
|
48
|
+
if (nodeSpecificOptions.publisherPrivateKey) {
|
|
49
|
+
account = privateKeyToAccount(nodeSpecificOptions.publisherPrivateKey);
|
|
50
|
+
} else if (options.l1Mnemonic) {
|
|
51
|
+
account = mnemonicToAccount(options.l1Mnemonic);
|
|
52
|
+
} else {
|
|
53
|
+
throw new Error('--node.publisherPrivateKey or --l1-mnemonic is required to deploy L1 contracts');
|
|
54
|
+
}
|
|
55
|
+
// REFACTOR: We should not be calling a method from sandbox on the prod start flow
|
|
56
|
+
await deployContractsToL1(nodeConfig, account!, undefined, {
|
|
57
|
+
assumeProvenThroughBlockNumber: nodeSpecificOptions.assumeProvenThroughBlockNumber,
|
|
58
|
+
salt: nodeSpecificOptions.deployAztecContractsSalt,
|
|
59
|
+
genesisBlockHash,
|
|
60
|
+
genesisArchiveRoot,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// If not deploying, validate that any addresses and config provided are correct.
|
|
64
|
+
else {
|
|
65
|
+
if (!nodeConfig.l1Contracts.registryAddress || nodeConfig.l1Contracts.registryAddress.isZero()) {
|
|
66
|
+
throw new Error('L1 registry address is required to start Aztec Node without --deploy-aztec-contracts option');
|
|
67
|
+
}
|
|
68
|
+
const { addresses, config } = await getL1Config(
|
|
69
|
+
nodeConfig.l1Contracts.registryAddress,
|
|
70
|
+
nodeConfig.l1RpcUrls,
|
|
71
|
+
nodeConfig.l1ChainId,
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
// TODO(#12272): will clean this up.
|
|
75
|
+
nodeConfig = {
|
|
76
|
+
...nodeConfig,
|
|
77
|
+
l1Contracts: {
|
|
78
|
+
...addresses,
|
|
79
|
+
slashFactoryAddress: nodeConfig.l1Contracts.slashFactoryAddress,
|
|
80
|
+
},
|
|
81
|
+
...config,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// if no publisher private key, then use l1Mnemonic
|
|
86
|
+
if (!options.archiver) {
|
|
87
|
+
// expect archiver url in node config
|
|
88
|
+
const archiverUrl = nodeConfig.archiverUrl;
|
|
89
|
+
if (!archiverUrl) {
|
|
90
|
+
userLog('Archiver Service URL is required to start Aztec Node without --archiver option');
|
|
91
|
+
throw new Error('Archiver Service URL is required to start Aztec Node without --archiver option');
|
|
92
|
+
}
|
|
93
|
+
nodeConfig.archiverUrl = archiverUrl;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (!options.sequencer) {
|
|
97
|
+
nodeConfig.disableValidator = true;
|
|
98
|
+
} else {
|
|
99
|
+
const sequencerConfig = extractNamespacedOptions(options, 'sequencer');
|
|
100
|
+
let account;
|
|
101
|
+
if (!sequencerConfig.publisherPrivateKey || sequencerConfig.publisherPrivateKey === NULL_KEY) {
|
|
102
|
+
if (!options.l1Mnemonic) {
|
|
103
|
+
userLog(
|
|
104
|
+
'--sequencer.publisherPrivateKey or --l1-mnemonic is required to start Aztec Node with --sequencer option',
|
|
105
|
+
);
|
|
106
|
+
throw new Error('Private key or Mnemonic is required to start Aztec Node with --sequencer option');
|
|
107
|
+
} else {
|
|
108
|
+
account = mnemonicToAccount(options.l1Mnemonic);
|
|
109
|
+
const privKey = account.getHdKey().privateKey;
|
|
110
|
+
nodeConfig.publisherPrivateKey = `0x${Buffer.from(privKey!).toString('hex')}`;
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
nodeConfig.publisherPrivateKey = sequencerConfig.publisherPrivateKey;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (nodeConfig.p2pEnabled) {
|
|
118
|
+
// ensure bootstrapNodes is an array
|
|
119
|
+
if (nodeConfig.bootstrapNodes && typeof nodeConfig.bootstrapNodes === 'string') {
|
|
120
|
+
nodeConfig.bootstrapNodes = (nodeConfig.bootstrapNodes as string).split(',');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const telemetryConfig = extractRelevantOptions<TelemetryClientConfig>(options, telemetryClientConfigMappings, 'tel');
|
|
125
|
+
const telemetry = initTelemetryClient(telemetryConfig);
|
|
126
|
+
|
|
127
|
+
// Create and start Aztec Node
|
|
128
|
+
const node = await createAztecNode(nodeConfig, { telemetry }, { prefilledPublicData });
|
|
129
|
+
|
|
130
|
+
// Add node and p2p to services list
|
|
131
|
+
services.node = [node, AztecNodeApiSchema];
|
|
132
|
+
services.p2p = [node.getP2P(), P2PApiSchema];
|
|
133
|
+
|
|
134
|
+
// Add node stop function to signal handlers
|
|
135
|
+
signalHandlers.push(node.stop.bind(node));
|
|
136
|
+
|
|
137
|
+
// Add a PXE client that connects to this node if requested
|
|
138
|
+
let pxe: PXE | undefined;
|
|
139
|
+
if (options.pxe) {
|
|
140
|
+
const { addPXE } = await import('./start_pxe.js');
|
|
141
|
+
({ pxe } = await addPXE(options, signalHandlers, services, userLog, { node }));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Add a txs bot if requested
|
|
145
|
+
if (options.bot) {
|
|
146
|
+
const { addBot } = await import('./start_bot.js');
|
|
147
|
+
await addBot(options, signalHandlers, services, { pxe, node, telemetry });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return { config: nodeConfig };
|
|
151
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsonStringify } from '@aztec/foundation/json-rpc';
|
|
2
|
+
import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
|
|
3
|
+
import { type LogFn, createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { createStore } from '@aztec/kv-store/lmdb-v2';
|
|
5
|
+
import { type BootnodeConfig, BootstrapNode, bootnodeConfigMappings } from '@aztec/p2p';
|
|
6
|
+
import { emptyChainConfig } from '@aztec/stdlib/config';
|
|
7
|
+
import { P2PBootstrapApiSchema } from '@aztec/stdlib/interfaces/server';
|
|
8
|
+
import { getConfigEnvVars as getTelemetryClientConfig, initTelemetryClient } from '@aztec/telemetry-client';
|
|
9
|
+
|
|
10
|
+
import { extractRelevantOptions } from '../util.js';
|
|
11
|
+
|
|
12
|
+
export async function startP2PBootstrap(
|
|
13
|
+
options: any,
|
|
14
|
+
signalHandlers: (() => Promise<void>)[],
|
|
15
|
+
services: NamespacedApiHandlers,
|
|
16
|
+
userLog: LogFn,
|
|
17
|
+
) {
|
|
18
|
+
// Start a P2P bootstrap node.
|
|
19
|
+
const config = extractRelevantOptions<BootnodeConfig>(options, bootnodeConfigMappings, 'p2p');
|
|
20
|
+
userLog(`Starting P2P bootstrap node with config: ${jsonStringify(config)}`);
|
|
21
|
+
const telemetryClient = initTelemetryClient(getTelemetryClientConfig());
|
|
22
|
+
const store = await createStore('p2p-bootstrap', 1, config, createLogger('p2p:bootstrap:store'));
|
|
23
|
+
const node = new BootstrapNode(store, telemetryClient);
|
|
24
|
+
await node.start(config);
|
|
25
|
+
signalHandlers.push(() => node.stop());
|
|
26
|
+
services.bootstrap = [node, P2PBootstrapApiSchema];
|
|
27
|
+
userLog(`P2P bootstrap node started on ${config.udpListenAddress}`);
|
|
28
|
+
return { config: emptyChainConfig };
|
|
29
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { times } from '@aztec/foundation/collection';
|
|
2
|
+
import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
|
|
3
|
+
import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
|
|
4
|
+
import type { LogFn } from '@aztec/foundation/log';
|
|
5
|
+
import { buildServerCircuitProver } from '@aztec/prover-client';
|
|
6
|
+
import {
|
|
7
|
+
InlineProofStore,
|
|
8
|
+
type ProverAgentConfig,
|
|
9
|
+
ProvingAgent,
|
|
10
|
+
createProvingJobBrokerClient,
|
|
11
|
+
proverAgentConfigMappings,
|
|
12
|
+
} from '@aztec/prover-client/broker';
|
|
13
|
+
import { getProverNodeAgentConfigFromEnv } from '@aztec/prover-node';
|
|
14
|
+
import { initTelemetryClient, makeTracedFetch, telemetryClientConfigMappings } from '@aztec/telemetry-client';
|
|
15
|
+
|
|
16
|
+
import { extractRelevantOptions } from '../util.js';
|
|
17
|
+
import { getVersions } from '../versioning.js';
|
|
18
|
+
|
|
19
|
+
export async function startProverAgent(
|
|
20
|
+
options: any,
|
|
21
|
+
signalHandlers: (() => Promise<void>)[],
|
|
22
|
+
services: NamespacedApiHandlers,
|
|
23
|
+
userLog: LogFn,
|
|
24
|
+
) {
|
|
25
|
+
if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
|
|
26
|
+
userLog(`Starting a prover agent with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const config = {
|
|
31
|
+
...getProverNodeAgentConfigFromEnv(), // get default config from env
|
|
32
|
+
...extractRelevantOptions<ProverAgentConfig>(options, proverAgentConfigMappings, 'proverAgent'), // override with command line options
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
if (config.realProofs && (!config.bbBinaryPath || !config.acvmBinaryPath)) {
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!config.proverBrokerUrl) {
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const fetch = makeTracedFetch([1, 2, 3], false, makeUndiciFetch(new Agent({ connections: 10 })));
|
|
44
|
+
const broker = createProvingJobBrokerClient(config.proverBrokerUrl, getVersions(), fetch);
|
|
45
|
+
|
|
46
|
+
const telemetry = initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
|
|
47
|
+
const prover = await buildServerCircuitProver(config, telemetry);
|
|
48
|
+
const proofStore = new InlineProofStore();
|
|
49
|
+
const agents = times(
|
|
50
|
+
config.proverAgentCount,
|
|
51
|
+
() =>
|
|
52
|
+
new ProvingAgent(
|
|
53
|
+
broker,
|
|
54
|
+
proofStore,
|
|
55
|
+
prover,
|
|
56
|
+
config.proverAgentProofTypes,
|
|
57
|
+
config.proverAgentPollIntervalMs,
|
|
58
|
+
telemetry,
|
|
59
|
+
),
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
await Promise.all(agents.map(agent => agent.start()));
|
|
63
|
+
|
|
64
|
+
signalHandlers.push(async () => {
|
|
65
|
+
await Promise.all(agents.map(agent => agent.stop()));
|
|
66
|
+
await telemetry.stop();
|
|
67
|
+
});
|
|
68
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
|
|
2
|
+
import type { LogFn } from '@aztec/foundation/log';
|
|
3
|
+
import {
|
|
4
|
+
type ProverBrokerConfig,
|
|
5
|
+
ProvingJobBrokerSchema,
|
|
6
|
+
createAndStartProvingBroker,
|
|
7
|
+
proverBrokerConfigMappings,
|
|
8
|
+
} from '@aztec/prover-client/broker';
|
|
9
|
+
import { getProverNodeBrokerConfigFromEnv } from '@aztec/prover-node';
|
|
10
|
+
import type { ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
|
|
11
|
+
import { getConfigEnvVars as getTelemetryClientConfig, initTelemetryClient } from '@aztec/telemetry-client';
|
|
12
|
+
|
|
13
|
+
import { getL1Config } from '../get_l1_config.js';
|
|
14
|
+
import { extractRelevantOptions } from '../util.js';
|
|
15
|
+
|
|
16
|
+
export async function startProverBroker(
|
|
17
|
+
options: any,
|
|
18
|
+
signalHandlers: (() => Promise<void>)[],
|
|
19
|
+
services: NamespacedApiHandlers,
|
|
20
|
+
userLog: LogFn,
|
|
21
|
+
): Promise<{ broker: ProvingJobBroker; config: ProverBrokerConfig }> {
|
|
22
|
+
if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
|
|
23
|
+
userLog(`Starting a prover broker with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const config: ProverBrokerConfig = {
|
|
28
|
+
...getProverNodeBrokerConfigFromEnv(), // get default config from env
|
|
29
|
+
...extractRelevantOptions<ProverBrokerConfig>(options, proverBrokerConfigMappings, 'proverBroker'), // override with command line options
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
if (!config.l1Contracts.registryAddress || config.l1Contracts.registryAddress.isZero()) {
|
|
33
|
+
throw new Error('L1 registry address is required to start Aztec Node without --deploy-aztec-contracts option');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const { addresses } = await getL1Config(config.l1Contracts.registryAddress, config.l1RpcUrls, config.l1ChainId);
|
|
37
|
+
|
|
38
|
+
config.l1Contracts = addresses;
|
|
39
|
+
|
|
40
|
+
const client = initTelemetryClient(getTelemetryClientConfig());
|
|
41
|
+
const broker = await createAndStartProvingBroker(config, client);
|
|
42
|
+
services.proverBroker = [broker, ProvingJobBrokerSchema];
|
|
43
|
+
signalHandlers.push(() => broker.stop());
|
|
44
|
+
|
|
45
|
+
return { broker, config };
|
|
46
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { getInitialTestAccounts } from '@aztec/accounts/testing';
|
|
2
|
+
import { NULL_KEY } from '@aztec/ethereum';
|
|
3
|
+
import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
|
|
4
|
+
import { Agent, makeUndiciFetch } from '@aztec/foundation/json-rpc/undici';
|
|
5
|
+
import type { LogFn } from '@aztec/foundation/log';
|
|
6
|
+
import { ProvingJobConsumerSchema, createProvingJobBrokerClient } from '@aztec/prover-client/broker';
|
|
7
|
+
import {
|
|
8
|
+
type ProverNodeConfig,
|
|
9
|
+
createProverNode,
|
|
10
|
+
getProverNodeConfigFromEnv,
|
|
11
|
+
proverNodeConfigMappings,
|
|
12
|
+
} from '@aztec/prover-node';
|
|
13
|
+
import { createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
|
|
14
|
+
import { P2PApiSchema, ProverNodeApiSchema, type ProvingJobBroker } from '@aztec/stdlib/interfaces/server';
|
|
15
|
+
import { initTelemetryClient, makeTracedFetch, telemetryClientConfigMappings } from '@aztec/telemetry-client';
|
|
16
|
+
import { getGenesisValues } from '@aztec/world-state/testing';
|
|
17
|
+
|
|
18
|
+
import { mnemonicToAccount } from 'viem/accounts';
|
|
19
|
+
|
|
20
|
+
import { getL1Config } from '../get_l1_config.js';
|
|
21
|
+
import { extractRelevantOptions } from '../util.js';
|
|
22
|
+
import { getVersions } from '../versioning.js';
|
|
23
|
+
import { startProverBroker } from './start_prover_broker.js';
|
|
24
|
+
|
|
25
|
+
export async function startProverNode(
|
|
26
|
+
options: any,
|
|
27
|
+
signalHandlers: (() => Promise<void>)[],
|
|
28
|
+
services: NamespacedApiHandlers,
|
|
29
|
+
userLog: LogFn,
|
|
30
|
+
): Promise<{ config: ProverNodeConfig }> {
|
|
31
|
+
if (options.node || options.sequencer || options.pxe || options.p2pBootstrap || options.txe) {
|
|
32
|
+
userLog(`Starting a prover-node with --node, --sequencer, --pxe, --p2p-bootstrap, or --txe is not supported.`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let proverConfig = {
|
|
37
|
+
...getProverNodeConfigFromEnv(), // get default config from env
|
|
38
|
+
...extractRelevantOptions<ProverNodeConfig>(options, proverNodeConfigMappings, 'proverNode'), // override with command line options
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
if (!options.archiver && !proverConfig.archiverUrl) {
|
|
42
|
+
userLog('--archiver.archiverUrl is required to start a Prover Node without --archiver option');
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (!proverConfig.publisherPrivateKey || proverConfig.publisherPrivateKey === NULL_KEY) {
|
|
47
|
+
if (!options.l1Mnemonic) {
|
|
48
|
+
userLog(`--l1-mnemonic is required to start a Prover Node without --node.publisherPrivateKey`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
const hdAccount = mnemonicToAccount(options.l1Mnemonic);
|
|
52
|
+
const privKey = hdAccount.getHdKey().privateKey;
|
|
53
|
+
proverConfig.publisherPrivateKey = `0x${Buffer.from(privKey!).toString('hex')}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// TODO(palla/prover-node) L1 contract addresses should not silently default to zero,
|
|
57
|
+
// they should be undefined if not set and fail loudly.
|
|
58
|
+
// Load l1 contract addresses from aztec node if not set.
|
|
59
|
+
const isRollupAddressSet =
|
|
60
|
+
proverConfig.l1Contracts?.rollupAddress && !proverConfig.l1Contracts.rollupAddress.isZero();
|
|
61
|
+
const nodeUrl = proverConfig.nodeUrl ?? proverConfig.proverCoordinationNodeUrl;
|
|
62
|
+
if (nodeUrl && !isRollupAddressSet) {
|
|
63
|
+
userLog(`Loading L1 contract addresses from aztec node at ${nodeUrl}`);
|
|
64
|
+
proverConfig.l1Contracts = await createAztecNodeClient(nodeUrl).getL1ContractAddresses();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// If we create an archiver here, validate the L1 config
|
|
68
|
+
if (options.archiver) {
|
|
69
|
+
if (!proverConfig.l1Contracts.registryAddress || proverConfig.l1Contracts.registryAddress.isZero()) {
|
|
70
|
+
throw new Error('L1 registry address is required to start a Prover Node with --archiver option');
|
|
71
|
+
}
|
|
72
|
+
const { addresses, config } = await getL1Config(
|
|
73
|
+
proverConfig.l1Contracts.registryAddress,
|
|
74
|
+
proverConfig.l1RpcUrls,
|
|
75
|
+
proverConfig.l1ChainId,
|
|
76
|
+
);
|
|
77
|
+
proverConfig.l1Contracts = addresses;
|
|
78
|
+
proverConfig = { ...proverConfig, ...config };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const telemetry = initTelemetryClient(extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'));
|
|
82
|
+
|
|
83
|
+
let broker: ProvingJobBroker;
|
|
84
|
+
if (proverConfig.proverBrokerUrl) {
|
|
85
|
+
// at 1TPS we'd enqueue ~1k tube proofs and ~1k AVM proofs immediately
|
|
86
|
+
// set a lower connectio limit such that we don't overload the server
|
|
87
|
+
const fetch = makeTracedFetch([1, 2, 3], false, makeUndiciFetch(new Agent({ connections: 100 })));
|
|
88
|
+
broker = createProvingJobBrokerClient(proverConfig.proverBrokerUrl, getVersions(proverConfig), fetch);
|
|
89
|
+
} else if (options.proverBroker) {
|
|
90
|
+
({ broker } = await startProverBroker(options, signalHandlers, services, userLog));
|
|
91
|
+
} else {
|
|
92
|
+
userLog(`--prover-broker-url or --prover-broker is required to start a Prover Node`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (proverConfig.proverAgentCount === 0) {
|
|
97
|
+
userLog(
|
|
98
|
+
`Running prover node without local prover agent. Connect one or more prover agents to this node or pass --proverAgent.proverAgentCount`,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const initialFundedAccounts = proverConfig.testAccounts ? await getInitialTestAccounts() : [];
|
|
103
|
+
const { prefilledPublicData } = await getGenesisValues(initialFundedAccounts.map(a => a.address));
|
|
104
|
+
|
|
105
|
+
const proverNode = await createProverNode(proverConfig, { telemetry, broker }, { prefilledPublicData });
|
|
106
|
+
services.proverNode = [proverNode, ProverNodeApiSchema];
|
|
107
|
+
|
|
108
|
+
const p2p = proverNode.getP2P();
|
|
109
|
+
if (p2p) {
|
|
110
|
+
services.p2p = [proverNode.getP2P(), P2PApiSchema];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (!proverConfig.proverBrokerUrl) {
|
|
114
|
+
services.provingJobSource = [proverNode.getProver().getProvingJobSource(), ProvingJobConsumerSchema];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
signalHandlers.push(proverNode.stop.bind(proverNode));
|
|
118
|
+
|
|
119
|
+
proverNode.start();
|
|
120
|
+
return { config: proverConfig };
|
|
121
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AztecAddress,
|
|
3
|
+
type ContractArtifact,
|
|
4
|
+
type ContractInstanceWithAddress,
|
|
5
|
+
Fr,
|
|
6
|
+
PublicKeys,
|
|
7
|
+
getContractClassFromArtifact,
|
|
8
|
+
} from '@aztec/aztec.js';
|
|
9
|
+
import { getContractArtifact } from '@aztec/cli/cli-utils';
|
|
10
|
+
import type { NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server';
|
|
11
|
+
import type { LogFn } from '@aztec/foundation/log';
|
|
12
|
+
import {
|
|
13
|
+
type CliPXEOptions,
|
|
14
|
+
type PXEService,
|
|
15
|
+
type PXEServiceConfig,
|
|
16
|
+
allPxeConfigMappings,
|
|
17
|
+
createPXEService,
|
|
18
|
+
} from '@aztec/pxe/server';
|
|
19
|
+
import { type AztecNode, PXESchema, createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
|
|
20
|
+
import { L2BasicContractsMap, Network } from '@aztec/stdlib/network';
|
|
21
|
+
import { makeTracedFetch } from '@aztec/telemetry-client';
|
|
22
|
+
|
|
23
|
+
import { extractRelevantOptions } from '../util.js';
|
|
24
|
+
import { getVersions } from '../versioning.js';
|
|
25
|
+
|
|
26
|
+
export type { PXEServiceConfig, CliPXEOptions };
|
|
27
|
+
|
|
28
|
+
const contractAddressesUrl = 'http://static.aztec.network';
|
|
29
|
+
|
|
30
|
+
export async function startPXE(
|
|
31
|
+
options: any,
|
|
32
|
+
signalHandlers: (() => Promise<void>)[],
|
|
33
|
+
services: NamespacedApiHandlers,
|
|
34
|
+
userLog: LogFn,
|
|
35
|
+
): Promise<{ pxe: PXEService; config: PXEServiceConfig & CliPXEOptions }> {
|
|
36
|
+
return await addPXE(options, signalHandlers, services, userLog, {});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function isValidNetwork(value: any): value is Network {
|
|
40
|
+
return Object.values(Network).includes(value);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function fetchBasicContractAddresses(url: string) {
|
|
44
|
+
const response = await fetch(url);
|
|
45
|
+
if (!response.ok) {
|
|
46
|
+
throw new Error(`Failed to fetch basic contract addresses from ${url}`);
|
|
47
|
+
}
|
|
48
|
+
return response.json();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export async function addPXE(
|
|
52
|
+
options: any,
|
|
53
|
+
signalHandlers: (() => Promise<void>)[],
|
|
54
|
+
services: NamespacedApiHandlers,
|
|
55
|
+
userLog: LogFn,
|
|
56
|
+
deps: { node?: AztecNode } = {},
|
|
57
|
+
): Promise<{ pxe: PXEService; config: PXEServiceConfig & CliPXEOptions }> {
|
|
58
|
+
const pxeConfig = extractRelevantOptions<PXEServiceConfig & CliPXEOptions>(options, allPxeConfigMappings, 'pxe');
|
|
59
|
+
|
|
60
|
+
let nodeUrl;
|
|
61
|
+
if (pxeConfig.network) {
|
|
62
|
+
if (isValidNetwork(pxeConfig.network)) {
|
|
63
|
+
if (!pxeConfig.apiKey && !pxeConfig.nodeUrl) {
|
|
64
|
+
userLog(`API Key or Aztec Node URL is required to connect to ${pxeConfig.network}`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
} else if (pxeConfig.apiKey) {
|
|
67
|
+
nodeUrl = `https://api.aztec.network/${pxeConfig.network}/aztec-node-1/${pxeConfig.apiKey}`;
|
|
68
|
+
} else if (pxeConfig.nodeUrl) {
|
|
69
|
+
nodeUrl = pxeConfig.nodeUrl;
|
|
70
|
+
}
|
|
71
|
+
} else {
|
|
72
|
+
userLog(`Network ${pxeConfig.network} is not supported`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
nodeUrl = pxeConfig.nodeUrl;
|
|
77
|
+
}
|
|
78
|
+
if (!nodeUrl && !deps.node && !pxeConfig.network) {
|
|
79
|
+
userLog('Aztec Node URL (nodeUrl | AZTEC_NODE_URL) option is required to start PXE without --node option');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const node = deps.node ?? createAztecNodeClient(nodeUrl!, getVersions(pxeConfig), makeTracedFetch([1, 2, 3], true));
|
|
84
|
+
const pxe = await createPXEService(node, pxeConfig as PXEServiceConfig);
|
|
85
|
+
|
|
86
|
+
// register basic contracts
|
|
87
|
+
if (pxeConfig.network) {
|
|
88
|
+
userLog(`Registering basic contracts for ${pxeConfig.network}`);
|
|
89
|
+
const basicContractsInfo = await fetchBasicContractAddresses(
|
|
90
|
+
`${contractAddressesUrl}/${pxeConfig.network}/basic_contracts.json`,
|
|
91
|
+
);
|
|
92
|
+
const l2Contracts: Record<
|
|
93
|
+
string,
|
|
94
|
+
{ name: string; address: AztecAddress; initHash: Fr; salt: Fr; artifact: ContractArtifact }
|
|
95
|
+
> = {};
|
|
96
|
+
for (const [key, artifactName] of Object.entries(L2BasicContractsMap[pxeConfig.network as Network])) {
|
|
97
|
+
l2Contracts[key] = {
|
|
98
|
+
name: key,
|
|
99
|
+
address: AztecAddress.fromString(basicContractsInfo[key].address),
|
|
100
|
+
initHash: Fr.fromHexString(basicContractsInfo[key].initHash),
|
|
101
|
+
salt: Fr.fromHexString(basicContractsInfo[key].salt),
|
|
102
|
+
artifact: await getContractArtifact(artifactName, userLog),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
await Promise.all(
|
|
107
|
+
Object.values(l2Contracts).map(async ({ name, address, artifact, initHash, salt }) => {
|
|
108
|
+
const contractClass = await getContractClassFromArtifact(artifact!);
|
|
109
|
+
const instance: ContractInstanceWithAddress = {
|
|
110
|
+
version: 1,
|
|
111
|
+
salt,
|
|
112
|
+
initializationHash: initHash,
|
|
113
|
+
address,
|
|
114
|
+
deployer: AztecAddress.ZERO,
|
|
115
|
+
currentContractClassId: contractClass.id,
|
|
116
|
+
originalContractClassId: contractClass.id,
|
|
117
|
+
publicKeys: PublicKeys.default(),
|
|
118
|
+
};
|
|
119
|
+
userLog(`Registering ${name} at ${address.toString()}`);
|
|
120
|
+
await pxe.registerContract({ artifact, instance });
|
|
121
|
+
}),
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Add PXE to services list
|
|
126
|
+
services.pxe = [pxe, PXESchema];
|
|
127
|
+
|
|
128
|
+
return { pxe, config: pxeConfig };
|
|
129
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { startHttpRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
2
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
3
|
+
import { createTXERpcServer } from '@aztec/txe';
|
|
4
|
+
|
|
5
|
+
export async function startTXE(options: any, debugLogger: Logger) {
|
|
6
|
+
debugLogger.info(`Setting up TXE...`);
|
|
7
|
+
|
|
8
|
+
const txeServer = createTXERpcServer(debugLogger);
|
|
9
|
+
const { port } = await startHttpRpcServer(txeServer, {
|
|
10
|
+
port: options.port,
|
|
11
|
+
timeoutMs: 1e3 * 60 * 5,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
debugLogger.info(`TXE listening on port ${port}`);
|
|
15
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type L1ContractAddresses, RegistryContract, getL1ContractsConfig, getPublicClient } from '@aztec/ethereum';
|
|
2
|
+
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
|
|
4
|
+
export async function getL1Config(
|
|
5
|
+
registryAddress: EthAddress,
|
|
6
|
+
l1RpcUrls: string[],
|
|
7
|
+
l1ChainId: number,
|
|
8
|
+
): Promise<{ addresses: L1ContractAddresses; config: Awaited<ReturnType<typeof getL1ContractsConfig>> }> {
|
|
9
|
+
const publicClient = getPublicClient({ l1RpcUrls, l1ChainId });
|
|
10
|
+
const addresses = await RegistryContract.collectAddresses(publicClient, registryAddress, 'canonical');
|
|
11
|
+
|
|
12
|
+
const config = await getL1ContractsConfig(publicClient, addresses);
|
|
13
|
+
|
|
14
|
+
return {
|
|
15
|
+
addresses,
|
|
16
|
+
config,
|
|
17
|
+
};
|
|
18
|
+
}
|
package/src/cli/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './cli.js';
|