Skip to content

Commit 3082c9c

Browse files
apollo_gateway: create GCS client and write proof to GCS (#11497)
1 parent 30456f7 commit 3082c9c

File tree

12 files changed

+74
-14
lines changed

12 files changed

+74
-14
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/apollo_deployments/resources/app_configs/gateway_config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"gateway_config.contract_class_manager_config.native_compiler_config.max_memory_usage": 16106127360,
1818
"gateway_config.contract_class_manager_config.native_compiler_config.max_memory_usage.#is_none": false,
1919
"gateway_config.contract_class_manager_config.native_compiler_config.optimization_level": 2,
20-
"gateway_config.proof_archive_writer_config.bucket_name": "proof-archive",
20+
"gateway_config.proof_archive_writer_config.bucket_name": "",
2121
"gateway_config.stateful_tx_validator_config.max_allowed_nonce_gap": 200,
2222
"gateway_config.stateful_tx_validator_config.max_nonce_for_validation_skip": "0x1",
2323
"gateway_config.stateful_tx_validator_config.min_gas_price_percentage": 100,

crates/apollo_deployments/resources/app_configs/replacer_gateway_config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"gateway_config.contract_class_manager_config.native_compiler_config.max_memory_usage": 16106127360,
1818
"gateway_config.contract_class_manager_config.native_compiler_config.max_memory_usage.#is_none": false,
1919
"gateway_config.contract_class_manager_config.native_compiler_config.optimization_level": 2,
20-
"gateway_config.proof_archive_writer_config.bucket_name": "proof-archive",
20+
"gateway_config.proof_archive_writer_config.bucket_name": "$$$_GATEWAY_CONFIG-PROOF_ARCHIVE_WRITER_CONFIG-BUCKET_NAME_$$$",
2121
"gateway_config.stateful_tx_validator_config.max_allowed_nonce_gap": "$$$_GATEWAY_CONFIG-STATEFUL_TX_VALIDATOR_CONFIG-MAX_ALLOWED_NONCE_GAP_$$$",
2222
"gateway_config.stateful_tx_validator_config.max_nonce_for_validation_skip": "0x1",
2323
"gateway_config.stateful_tx_validator_config.min_gas_price_percentage": 100,

crates/apollo_deployments/src/service.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ pub static KEYS_TO_BE_REPLACED: phf::Set<&'static str> = phf_set! {
7575
"gateway_config.authorized_declarer_accounts.#is_none",
7676
"gateway_config.authorized_declarer_accounts",
7777
"gateway_config.contract_class_manager_config.native_compiler_config.max_cpu_time",
78+
"gateway_config.proof_archive_writer_config.bucket_name",
7879
"gateway_config.stateful_tx_validator_config.max_allowed_nonce_gap",
7980
"gateway_config.stateless_tx_validator_config.min_gas_price",
8081
"http_server_config.static_config.port",

crates/apollo_gateway/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ blockifier.workspace = true
3838
blockifier_test_utils = { workspace = true, optional = true }
3939
cairo-lang-starknet-classes.workspace = true
4040
clap.workspace = true
41+
google-cloud-storage.workspace = true
4142
mempool_test_utils.workspace = true
4243
mockall.workspace = true
4344
num-rational.workspace = true

crates/apollo_gateway/src/gateway.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ use crate::errors::{
4343
GatewayResult,
4444
};
4545
use crate::metrics::{register_metrics, GatewayMetricHandle, GATEWAY_ADD_TX_LATENCY};
46-
use crate::proof_archive_writer::{GcsProofArchiveWriter, ProofArchiveWriterTrait};
46+
use crate::proof_archive_writer::{
47+
GcsProofArchiveWriter,
48+
NoOpProofArchiveWriter,
49+
ProofArchiveWriterTrait,
50+
};
4751
use crate::state_reader::StateReaderFactory;
4852
use crate::stateful_transaction_validator::{
4953
StatefulTransactionValidatorFactory,
@@ -246,8 +250,15 @@ pub fn create_gateway(
246250
let stateless_tx_validator = Arc::new(StatelessTransactionValidator {
247251
config: config.stateless_tx_validator_config.clone(),
248252
});
249-
let proof_archive_writer =
250-
Arc::new(GcsProofArchiveWriter::new(config.proof_archive_writer_config.clone()));
253+
254+
// Create proof archive writer: use NoOp if bucket name is empty, otherwise use real GCS.
255+
let proof_archive_writer: Arc<dyn ProofArchiveWriterTrait> =
256+
if config.proof_archive_writer_config.bucket_name.is_empty() {
257+
Arc::new(NoOpProofArchiveWriter)
258+
} else {
259+
Arc::new(GcsProofArchiveWriter::new(config.proof_archive_writer_config.clone()))
260+
};
261+
251262
Gateway::new(
252263
config,
253264
state_reader_factory,

crates/apollo_gateway/src/proof_archive_writer.rs

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use apollo_gateway_config::config::ProofArchiveWriterConfig;
22
use async_trait::async_trait;
3+
use google_cloud_storage::client::{Client, ClientConfig};
4+
use google_cloud_storage::http::objects::upload::{Media, UploadObjectRequest, UploadType};
35
#[cfg(any(feature = "testing", test))]
46
use mockall::automock;
57
use starknet_api::transaction::fields::{Proof, ProofFacts};
@@ -22,27 +24,61 @@ pub enum ProofArchiveError {
2224
WriteError(String),
2325
}
2426

25-
#[derive(Clone, Default)]
27+
#[derive(Clone)]
2628
pub struct GcsProofArchiveWriter {
27-
// TODO(Einat): remove #[allow(dead_code)] once implemented.
28-
#[allow(dead_code)]
2929
config: ProofArchiveWriterConfig,
30+
client: Client,
3031
}
3132

3233
impl GcsProofArchiveWriter {
3334
pub fn new(config: ProofArchiveWriterConfig) -> Self {
34-
Self { config }
35+
let client = Client::new(ClientConfig::default());
36+
Self { config, client }
3537
}
3638
}
3739

3840
#[async_trait]
3941
impl ProofArchiveWriterTrait for GcsProofArchiveWriter {
42+
async fn set_proof(
43+
&self,
44+
proof_facts: ProofFacts,
45+
proof: Proof,
46+
) -> Result<(), ProofArchiveError> {
47+
let facts_hash = proof_facts.hash();
48+
let proof_bytes: Vec<u8> = proof.0.iter().flat_map(|&val| val.to_be_bytes()).collect();
49+
let object_name = format!("proofs/{}", facts_hash);
50+
51+
self.client
52+
.upload_object(
53+
&UploadObjectRequest {
54+
bucket: self.config.bucket_name.clone(),
55+
..Default::default()
56+
},
57+
proof_bytes,
58+
&UploadType::Simple(Media::new(object_name)),
59+
)
60+
.await
61+
.map_err(|e| {
62+
ProofArchiveError::WriteError(format!("Failed to upload to GCS: {}", e))
63+
})?;
64+
65+
Ok(())
66+
}
67+
}
68+
69+
/// No-op proof archive writer that does nothing.
70+
/// Used in tests and when proof archiving is disabled.
71+
#[derive(Clone, Default)]
72+
pub struct NoOpProofArchiveWriter;
73+
74+
#[async_trait]
75+
impl ProofArchiveWriterTrait for NoOpProofArchiveWriter {
4076
async fn set_proof(
4177
&self,
4278
_proof_facts: ProofFacts,
4379
_proof: Proof,
4480
) -> Result<(), ProofArchiveError> {
45-
// TODO(Einat): Write proof to GCS.
81+
// No-op: do nothing in test environments.
4682
Ok(())
4783
}
4884
}

crates/apollo_gateway_config/src/config.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,12 +281,21 @@ impl Default for ProofArchiveWriterConfig {
281281
}
282282
}
283283

284+
#[cfg(any(feature = "testing", test))]
285+
impl ProofArchiveWriterConfig {
286+
pub fn create_for_testing() -> Self {
287+
// Use empty bucket name for tests to trigger mock proof writer.
288+
Self { bucket_name: String::new() }
289+
}
290+
}
291+
284292
impl SerializeConfig for ProofArchiveWriterConfig {
285293
fn dump(&self) -> BTreeMap<ParamPath, SerializedParam> {
286294
BTreeMap::from_iter([ser_param(
287295
"bucket_name",
288296
&self.bucket_name,
289-
"The name of the bucket to write proofs to.",
297+
"The name of the bucket to write proofs to. An empty string indicates a test \
298+
environment that does not connect to GCS.",
290299
ParamPrivacyInput::Public,
291300
)])
292301
}

crates/apollo_integration_tests/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ apollo_consensus_manager_config.workspace = true
2929
apollo_consensus_orchestrator.workspace = true
3030
apollo_consensus_orchestrator_config.workspace = true
3131
apollo_deployments.workspace = true
32-
apollo_gateway_config.workspace = true
32+
apollo_gateway_config = { workspace = true, features = ["testing"] }
3333
apollo_http_server = { workspace = true, features = ["testing"] }
3434
apollo_infra = { workspace = true, features = ["testing"] }
3535
apollo_infra_utils = { workspace = true, features = ["testing"] }

crates/apollo_integration_tests/src/utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ pub fn create_gateway_config(
630630
..Default::default()
631631
};
632632
let contract_class_manager_config = ContractClassManagerConfig::default();
633-
let proof_archive_writer_config = ProofArchiveWriterConfig::default();
633+
let proof_archive_writer_config = ProofArchiveWriterConfig::create_for_testing();
634634

635635
GatewayConfig {
636636
stateless_tx_validator_config,

0 commit comments

Comments
 (0)