Skip to content

Commit cca3adc

Browse files
apollo_gateway: only set proofs if they have passed tx validation in gateway
1 parent a5e3eb3 commit cca3adc

File tree

5 files changed

+61
-11
lines changed

5 files changed

+61
-11
lines changed

crates/apollo_class_manager_types/src/transaction_converter.rs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,29 @@ impl TransactionConverterTrait for TransactionConverter {
143143
tx: ConsensusTransaction,
144144
) -> TransactionConverterResult<InternalConsensusTransaction> {
145145
match tx {
146-
ConsensusTransaction::RpcTransaction(tx) => self
147-
.convert_rpc_tx_to_internal_rpc_tx(tx)
148-
.await
149-
.map(InternalConsensusTransaction::RpcTransaction),
146+
ConsensusTransaction::RpcTransaction(tx) => {
147+
// Extract proof and proof_facts from v3 invoke tx before conversion.
148+
let proof_data = match &tx {
149+
RpcTransaction::Invoke(RpcInvokeTransaction::V3(invoke_tx)) => {
150+
if !invoke_tx.proof_facts.is_empty() {
151+
Some((invoke_tx.proof_facts.clone(), invoke_tx.proof.clone()))
152+
} else {
153+
None
154+
}
155+
}
156+
_ => None,
157+
};
158+
159+
let internal_tx = self.convert_rpc_tx_to_internal_rpc_tx(tx).await?;
160+
161+
// If we extracted proof data and conversion was successful, set it in the proof
162+
// manager.
163+
if let Some((proof_facts, proof)) = proof_data {
164+
self.proof_manager_client.set_proof(proof_facts, proof).await?;
165+
}
166+
167+
Ok(InternalConsensusTransaction::RpcTransaction(internal_tx))
168+
}
150169
ConsensusTransaction::L1Handler(tx) => self
151170
.convert_consensus_l1_handler_to_internal_l1_handler(tx)
152171
.map(InternalConsensusTransaction::L1Handler),
@@ -335,7 +354,6 @@ impl TransactionConverter {
335354
}
336355

337356
self.verify_proof(proof_facts.clone(), proof.clone())?;
338-
self.proof_manager_client.set_proof(proof_facts.clone(), proof.clone()).await?;
339357
Ok(())
340358
}
341359

crates/apollo_class_manager_types/src/transaction_converter_test.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,13 @@ async fn test_proof_verification_called_for_invoke_v3_with_proof_facts() {
7676
);
7777

7878
let mut mock_proof_manager_client = MockProofManagerClient::new();
79+
// Expect contains_proof to be called and return false (proof does not exist).
80+
// Expect set_proof not to be called when converting rpc tx to internal rpc tx.
7981
mock_proof_manager_client
8082
.expect_contains_proof()
8183
.once()
8284
.with(eq(proof_facts.clone()))
8385
.return_once(|_| Ok(false));
84-
mock_proof_manager_client
85-
.expect_set_proof()
86-
.once()
87-
.with(eq(proof_facts), eq(proof))
88-
.return_once(|_, _| Ok(()));
8986

9087
let mock_class_manager_client = MockClassManagerClient::new();
9188

crates/apollo_gateway/src/gateway.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ pub struct Gateway {
7272
pub mempool_client: SharedMempoolClient,
7373
pub transaction_converter: Arc<dyn TransactionConverterTrait>,
7474
pub proof_archive_writer: Arc<dyn ProofArchiveWriterTrait>,
75+
pub proof_manager_client: SharedProofManagerClient,
7576
}
7677

7778
impl Gateway {
@@ -82,6 +83,7 @@ impl Gateway {
8283
transaction_converter: Arc<dyn TransactionConverterTrait>,
8384
stateless_tx_validator: Arc<dyn StatelessTransactionValidatorTrait>,
8485
proof_archive_writer: Arc<dyn ProofArchiveWriterTrait>,
86+
proof_manager_client: SharedProofManagerClient,
8587
) -> Self {
8688
Self {
8789
config: Arc::new(config.clone()),
@@ -97,6 +99,7 @@ impl Gateway {
9799
mempool_client,
98100
transaction_converter,
99101
proof_archive_writer,
102+
proof_manager_client,
100103
}
101104
}
102105

@@ -169,8 +172,14 @@ impl Gateway {
169172
.inspect_err(|e| metric_counters.record_add_tx_failure(e))?;
170173

171174
if let Some((proof_facts, proof)) = proof_data {
175+
let proof_manager_client = self.proof_manager_client.clone();
176+
if let Err(e) = proof_manager_client.set_proof(proof_facts.clone(), proof.clone()).await
177+
{
178+
warn!("Failed to set proof in proof manager: {}", e);
179+
}
172180
let proof_archive_writer = self.proof_archive_writer.clone();
173181
tokio::spawn(async move {
182+
// Write proof to both archive and proof manager.
174183
if let Err(e) = proof_archive_writer.set_proof(proof_facts, proof).await {
175184
error!("Failed to archive proof to GCS: {}", e);
176185
}
@@ -265,7 +274,7 @@ pub fn create_gateway(
265274
});
266275
let transaction_converter = Arc::new(TransactionConverter::new(
267276
class_manager_client,
268-
proof_manager_client,
277+
proof_manager_client.clone(),
269278
config.chain_info.chain_id.clone(),
270279
));
271280
let stateless_tx_validator = Arc::new(StatelessTransactionValidator {
@@ -287,6 +296,7 @@ pub fn create_gateway(
287296
transaction_converter,
288297
stateless_tx_validator,
289298
proof_archive_writer,
299+
proof_manager_client,
290300
)
291301
}
292302

crates/apollo_gateway/src/gateway_test.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ use apollo_mempool_types::errors::MempoolError;
3636
use apollo_mempool_types::mempool_types::{AccountState, AddTransactionArgs, ValidationArgs};
3737
use apollo_metrics::metrics::HistogramValue;
3838
use apollo_network_types::network_types::BroadcastedMessageMetadata;
39+
use apollo_proof_manager_types::MockProofManagerClient;
3940
use apollo_test_utils::{get_rng, GetTestInstance};
4041
use blockifier::blockifier::config::ContractClassManagerConfig;
4142
use blockifier::context::ChainInfo;
@@ -53,6 +54,7 @@ use starknet_api::executable_transaction::AccountTransaction;
5354
use starknet_api::rpc_transaction::{
5455
InternalRpcTransaction,
5556
RpcDeclareTransaction,
57+
RpcInvokeTransaction,
5658
RpcTransaction,
5759
RpcTransactionLabelValue,
5860
};
@@ -136,13 +138,15 @@ fn mock_dependencies() -> MockDependencies {
136138
let mock_transaction_converter = MockTransactionConverterTrait::new();
137139
let mock_stateless_transaction_validator = mock_stateless_transaction_validator();
138140
let mock_proof_archive_writer = MockProofArchiveWriterTrait::new();
141+
let mock_proof_manager_client = MockProofManagerClient::new();
139142
MockDependencies {
140143
config,
141144
state_reader_factory,
142145
mock_mempool_client,
143146
mock_transaction_converter,
144147
mock_stateless_transaction_validator,
145148
mock_proof_archive_writer,
149+
mock_proof_manager_client,
146150
}
147151
}
148152

@@ -153,6 +157,7 @@ struct MockDependencies {
153157
mock_transaction_converter: MockTransactionConverterTrait,
154158
mock_stateless_transaction_validator: MockStatelessTransactionValidatorTrait,
155159
mock_proof_archive_writer: MockProofArchiveWriterTrait,
160+
mock_proof_manager_client: MockProofManagerClient,
156161
}
157162

158163
impl MockDependencies {
@@ -165,6 +170,7 @@ impl MockDependencies {
165170
Arc::new(self.mock_transaction_converter),
166171
Arc::new(self.mock_stateless_transaction_validator),
167172
Arc::new(self.mock_proof_archive_writer),
173+
Arc::new(self.mock_proof_manager_client),
168174
)
169175
}
170176

@@ -175,6 +181,14 @@ impl MockDependencies {
175181
fn expect_validate_tx(&mut self, args: ValidationArgs, result: MempoolClientResult<()>) {
176182
self.mock_mempool_client.expect_validate_tx().once().with(eq(args)).return_once(|_| result);
177183
}
184+
185+
fn expect_set_proof(&mut self, proof_facts: ProofFacts, proof: Proof) {
186+
self.mock_proof_manager_client
187+
.expect_set_proof()
188+
.once()
189+
.with(eq(proof_facts), eq(proof))
190+
.return_once(|_, _| Ok(()));
191+
}
178192
}
179193

180194
fn account_contract() -> FeatureContract {
@@ -291,6 +305,14 @@ async fn setup_mock_state(
291305
&mut mock_dependencies.state_reader_factory.state_reader.blockifier_state_reader,
292306
);
293307

308+
// If the transaction has proof facts, expect set_proof to be called on the proof manager.
309+
if let RpcTransaction::Invoke(RpcInvokeTransaction::V3(ref invoke_tx)) = input_tx {
310+
if !invoke_tx.proof_facts.is_empty() {
311+
mock_dependencies
312+
.expect_set_proof(invoke_tx.proof_facts.clone(), invoke_tx.proof.clone());
313+
}
314+
}
315+
294316
let mempool_add_tx_args = AddTransactionArgs {
295317
tx: expected_internal_tx.clone(),
296318
account_state: AccountState { address, nonce: *input_tx.nonce() },
@@ -580,6 +602,7 @@ async fn add_tx_returns_error_when_extract_state_nonce_and_run_validations_fails
580602
mempool_client: Arc::new(mock_dependencies.mock_mempool_client),
581603
transaction_converter: Arc::new(mock_dependencies.mock_transaction_converter),
582604
proof_archive_writer: Arc::new(mock_dependencies.mock_proof_archive_writer),
605+
proof_manager_client: Arc::new(mock_dependencies.mock_proof_manager_client),
583606
};
584607

585608
let result = gateway.add_tx(tx_args.get_rpc_tx(), None).await;
@@ -633,6 +656,7 @@ async fn add_tx_returns_error_when_instantiating_validator_fails(
633656
mempool_client: Arc::new(mock_dependencies.mock_mempool_client),
634657
transaction_converter: Arc::new(mock_dependencies.mock_transaction_converter),
635658
proof_archive_writer: Arc::new(mock_dependencies.mock_proof_archive_writer),
659+
proof_manager_client: Arc::new(mock_dependencies.mock_proof_manager_client),
636660
};
637661

638662
let result = gateway.add_tx(tx_args.get_rpc_tx(), None).await;

crates/apollo_gateway/src/test_utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,5 +185,6 @@ pub fn gateway_for_benchmark(gateway_config: GatewayConfig) -> Gateway {
185185
Arc::new(transaction_converter),
186186
stateless_tx_validator,
187187
proof_archive_writer,
188+
proof_manager_client,
188189
)
189190
}

0 commit comments

Comments
 (0)