Skip to content

Commit 4174716

Browse files
feat: add API key support to prover client (#1912)
* feat: add API key support to prover client * feat: implement construct_prover_url utility for dynamic prover URL generation * feat: add prover URL configurations for address-append, append and update operations * feat: add prover URL fields for append and update operations in tests
1 parent 16c27bb commit 4174716

File tree

13 files changed

+122
-16
lines changed

13 files changed

+122
-16
lines changed

forester-utils/src/instructions/address_batch_update.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ pub struct AddressUpdateConfig<R: Rpc> {
2929
pub rpc_pool: Arc<SolanaRpcPool<R>>,
3030
pub merkle_tree_pubkey: Pubkey,
3131
pub prover_url: String,
32+
pub prover_api_key: Option<String>,
3233
pub polling_interval: Duration,
3334
pub max_wait_time: Duration,
3435
pub ixs_per_tx: usize,
@@ -39,6 +40,7 @@ async fn stream_instruction_data<'a, R: Rpc>(
3940
rpc_pool: Arc<SolanaRpcPool<R>>,
4041
merkle_tree_pubkey: Pubkey,
4142
prover_url: String,
43+
prover_api_key: Option<String>,
4244
polling_interval: Duration,
4345
max_wait_time: Duration,
4446
leaves_hash_chains: Vec<[u8; 32]>,
@@ -49,7 +51,7 @@ async fn stream_instruction_data<'a, R: Rpc>(
4951
) -> impl Stream<Item = Result<Vec<InstructionDataAddressAppendInputs>, ForesterUtilsError>> + Send + 'a
5052
{
5153
stream! {
52-
let proof_client = Arc::new(ProofClient::with_config(prover_url, polling_interval, max_wait_time));
54+
let proof_client = Arc::new(ProofClient::with_config(prover_url, polling_interval, max_wait_time, prover_api_key));
5355
let max_zkp_batches_per_call = calculate_max_zkp_batches_per_call(zkp_batch_size);
5456
let total_chunks = leaves_hash_chains.len().div_ceil(max_zkp_batches_per_call);
5557

@@ -324,6 +326,7 @@ pub async fn get_address_update_instruction_stream<'a, R: Rpc>(
324326
config.rpc_pool,
325327
config.merkle_tree_pubkey,
326328
config.prover_url,
329+
config.prover_api_key,
327330
config.polling_interval,
328331
config.max_wait_time,
329332
leaves_hash_chains,

forester-utils/src/instructions/state_batch_append.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ pub async fn get_append_instruction_stream<'a, R: Rpc>(
4848
rpc_pool: Arc<SolanaRpcPool<R>>,
4949
merkle_tree_pubkey: Pubkey,
5050
prover_url: String,
51+
prover_api_key: Option<String>,
5152
polling_interval: Duration,
5253
max_wait_time: Duration,
5354
merkle_tree_data: ParsedMerkleTreeData,
@@ -126,7 +127,7 @@ pub async fn get_append_instruction_stream<'a, R: Rpc>(
126127
}
127128

128129
let mut all_changelogs: Vec<ChangelogEntry<{ DEFAULT_BATCH_STATE_TREE_HEIGHT as usize }>> = Vec::new();
129-
let proof_client = Arc::new(ProofClient::with_config(prover_url.clone(), polling_interval, max_wait_time));
130+
let proof_client = Arc::new(ProofClient::with_config(prover_url.clone(), polling_interval, max_wait_time, prover_api_key.clone()));
130131
let mut futures_ordered = FuturesOrdered::new();
131132
let mut pending_count = 0;
132133

forester-utils/src/instructions/state_batch_nullify.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ pub async fn get_nullify_instruction_stream<'a, R: Rpc>(
4747
rpc_pool: Arc<SolanaRpcPool<R>>,
4848
merkle_tree_pubkey: Pubkey,
4949
prover_url: String,
50+
prover_api_key: Option<String>,
5051
polling_interval: Duration,
5152
max_wait_time: Duration,
5253
merkle_tree_data: ParsedMerkleTreeData,
@@ -125,7 +126,7 @@ pub async fn get_nullify_instruction_stream<'a, R: Rpc>(
125126
}
126127

127128
let mut all_changelogs = Vec::new();
128-
let proof_client = Arc::new(ProofClient::with_config(prover_url.clone(), polling_interval, max_wait_time));
129+
let proof_client = Arc::new(ProofClient::with_config(prover_url.clone(), polling_interval, max_wait_time, prover_api_key.clone()));
129130
let mut futures_ordered = FuturesOrdered::new();
130131
let mut pending_count = 0;
131132

forester/src/cli.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,30 @@ pub struct StartArgs {
3535
#[arg(long, env = "FORESTER_PROVER_URL")]
3636
pub prover_url: Option<String>,
3737

38+
#[arg(
39+
long,
40+
env = "FORESTER_PROVER_APPEND_URL",
41+
help = "Prover URL for append operations. If not specified, uses prover_url"
42+
)]
43+
pub prover_append_url: Option<String>,
44+
45+
#[arg(
46+
long,
47+
env = "FORESTER_PROVER_UPDATE_URL",
48+
help = "Prover URL for update operations. If not specified, uses prover_url"
49+
)]
50+
pub prover_update_url: Option<String>,
51+
52+
#[arg(
53+
long,
54+
env = "FORESTER_PROVER_ADDRESS_APPEND_URL",
55+
help = "Prover URL for address-append operations. If not specified, uses prover_url"
56+
)]
57+
pub prover_address_append_url: Option<String>,
58+
59+
#[arg(long, env = "FORESTER_PROVER_API_KEY")]
60+
pub prover_api_key: Option<String>,
61+
3862
#[arg(long, env = "FORESTER_PAYER")]
3963
pub payer: Option<String>,
4064

forester/src/config.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ pub struct ExternalServicesConfig {
3535
pub ws_rpc_url: Option<String>,
3636
pub indexer_url: Option<String>,
3737
pub prover_url: Option<String>,
38+
pub prover_append_url: Option<String>,
39+
pub prover_update_url: Option<String>,
40+
pub prover_address_append_url: Option<String>,
41+
pub prover_api_key: Option<String>,
3842
pub photon_api_key: Option<String>,
3943
pub pushgateway_url: Option<String>,
4044
pub pagerduty_routing_key: Option<String>,
@@ -210,6 +214,19 @@ impl ForesterConfig {
210214
ws_rpc_url: args.ws_rpc_url.clone(),
211215
indexer_url: args.indexer_url.clone(),
212216
prover_url: args.prover_url.clone(),
217+
prover_append_url: args
218+
.prover_append_url
219+
.clone()
220+
.or_else(|| args.prover_url.clone()),
221+
prover_update_url: args
222+
.prover_update_url
223+
.clone()
224+
.or_else(|| args.prover_url.clone()),
225+
prover_address_append_url: args
226+
.prover_address_append_url
227+
.clone()
228+
.or_else(|| args.prover_url.clone()),
229+
prover_api_key: args.prover_api_key.clone(),
213230
photon_api_key: args.photon_api_key.clone(),
214231
pushgateway_url: args.push_gateway_url.clone(),
215232
pagerduty_routing_key: args.pagerduty_routing_key.clone(),
@@ -280,6 +297,10 @@ impl ForesterConfig {
280297
ws_rpc_url: None,
281298
indexer_url: None,
282299
prover_url: None,
300+
prover_append_url: None,
301+
prover_update_url: None,
302+
prover_address_append_url: None,
303+
prover_api_key: None,
283304
photon_api_key: None,
284305
pushgateway_url: args.push_gateway_url.clone(),
285306
pagerduty_routing_key: args.pagerduty_routing_key.clone(),

forester/src/epoch_manager.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,7 @@ impl<R: Rpc> EpochManager<R> {
11851185
}
11861186

11871187
async fn process_v2(&self, epoch_info: &Epoch, tree_accounts: &TreeAccounts) -> Result<usize> {
1188+
let default_prover_url = "http://127.0.0.1:3001".to_string();
11881189
let batch_context = BatchContext {
11891190
rpc_pool: self.rpc_pool.clone(),
11901191
authority: self.config.payer_keypair.insecure_clone(),
@@ -1193,12 +1194,25 @@ impl<R: Rpc> EpochManager<R> {
11931194
merkle_tree: tree_accounts.merkle_tree,
11941195
output_queue: tree_accounts.queue,
11951196
ixs_per_tx: self.config.transaction_config.batch_ixs_per_tx,
1196-
prover_url: self
1197+
prover_append_url: self
11971198
.config
11981199
.external_services
1199-
.prover_url
1200+
.prover_append_url
12001201
.clone()
1201-
.unwrap_or_else(|| "http://127.0.0.1:3001".to_string()),
1202+
.unwrap_or_else(|| default_prover_url.clone()),
1203+
prover_update_url: self
1204+
.config
1205+
.external_services
1206+
.prover_update_url
1207+
.clone()
1208+
.unwrap_or_else(|| default_prover_url.clone()),
1209+
prover_address_append_url: self
1210+
.config
1211+
.external_services
1212+
.prover_address_append_url
1213+
.clone()
1214+
.unwrap_or_else(|| default_prover_url.clone()),
1215+
prover_api_key: self.config.external_services.prover_api_key.clone(),
12021216
prover_polling_interval: Duration::from_secs(1),
12031217
prover_max_wait_time: Duration::from_secs(120),
12041218
ops_cache: self.ops_cache.clone(),

forester/src/processor/v2/address.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ where
2727
let config = AddressUpdateConfig {
2828
rpc_pool: ctx.rpc_pool.clone(),
2929
merkle_tree_pubkey: ctx.merkle_tree,
30-
prover_url: ctx.prover_url.clone(),
30+
prover_url: ctx.prover_address_append_url.clone(),
31+
prover_api_key: ctx.prover_api_key.clone(),
3132
polling_interval: ctx.prover_polling_interval,
3233
max_wait_time: ctx.prover_max_wait_time,
3334
ixs_per_tx: ctx.ixs_per_tx,

forester/src/processor/v2/common.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ pub struct BatchContext<R: Rpc> {
4040
pub merkle_tree: Pubkey,
4141
pub output_queue: Pubkey,
4242
pub ixs_per_tx: usize,
43-
pub prover_url: String,
43+
pub prover_append_url: String,
44+
pub prover_update_url: String,
45+
pub prover_address_append_url: String,
46+
pub prover_api_key: Option<String>,
4447
pub prover_polling_interval: Duration,
4548
pub prover_max_wait_time: Duration,
4649
pub ops_cache: Arc<Mutex<ProcessedHashCache>>,

forester/src/processor/v2/state.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ where
3232
let (stream, size) = get_nullify_instruction_stream(
3333
ctx.rpc_pool.clone(),
3434
ctx.merkle_tree,
35-
ctx.prover_url.clone(),
35+
ctx.prover_update_url.clone(),
36+
ctx.prover_api_key.clone(),
3637
ctx.prover_polling_interval,
3738
ctx.prover_max_wait_time,
3839
merkle_tree_data,
@@ -58,7 +59,8 @@ where
5859
let (stream, size) = get_append_instruction_stream(
5960
ctx.rpc_pool.clone(),
6061
ctx.merkle_tree,
61-
ctx.prover_url.clone(),
62+
ctx.prover_append_url.clone(),
63+
ctx.prover_api_key.clone(),
6264
ctx.prover_polling_interval,
6365
ctx.prover_max_wait_time,
6466
merkle_tree_data,

forester/tests/e2e_test.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,20 @@ fn get_prover_url() -> String {
114114
}
115115
}
116116

117-
fn get_api_key() -> Option<String> {
117+
fn get_photon_api_key() -> Option<String> {
118118
match TestMode::from_env() {
119119
TestMode::Local => None,
120120
TestMode::Devnet => Some(get_env_var("PHOTON_API_KEY")),
121121
}
122122
}
123123

124+
fn get_prover_api_key() -> Option<String> {
125+
match TestMode::from_env() {
126+
TestMode::Local => None,
127+
TestMode::Devnet => Some(get_env_var("PROVER_API_KEY")),
128+
}
129+
}
130+
124131
fn get_forester_keypair() -> Keypair {
125132
match TestMode::from_env() {
126133
TestMode::Local => Keypair::new(),
@@ -189,7 +196,11 @@ async fn e2e_test() {
189196
ws_rpc_url: Some(get_ws_rpc_url()),
190197
indexer_url: Some(get_indexer_url()),
191198
prover_url: Some(get_prover_url()),
192-
photon_api_key: get_api_key(),
199+
prover_append_url: None,
200+
prover_update_url: None,
201+
prover_address_append_url: None,
202+
prover_api_key: get_prover_api_key(),
203+
photon_api_key: get_photon_api_key(),
193204
pushgateway_url: None,
194205
pagerduty_routing_key: None,
195206
rpc_rate_limit: None,
@@ -453,7 +464,7 @@ async fn setup_rpc_connection(forester: &Keypair) -> LightClient {
453464
let mut rpc = LightClient::new(if TestMode::from_env() == TestMode::Local {
454465
LightClientConfig::local()
455466
} else {
456-
LightClientConfig::new(get_rpc_url(), Some(get_indexer_url()), get_api_key())
467+
LightClientConfig::new(get_rpc_url(), Some(get_indexer_url()), get_photon_api_key())
457468
})
458469
.await
459470
.unwrap();

0 commit comments

Comments
 (0)