Skip to content

Commit 3134825

Browse files
apollo_gateway: use proof manager
1 parent 26e1b3a commit 3134825

File tree

7 files changed

+131
-11
lines changed

7 files changed

+131
-11
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_class_manager_types/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ tokio.workspace = true
3131
apollo_proof_manager_types = { workspace = true, features = ["testing"] }
3232
assert_matches.workspace = true
3333
blockifier = { workspace = true, features = ["testing"] }
34+
blockifier_test_utils.workspace = true
3435
mempool_test_utils.workspace = true
3536
mockall.workspace = true
3637
rstest.workspace = true

crates/apollo_class_manager_types/src/transaction_converter.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use apollo_proof_manager_types::SharedProofManagerClient;
1+
use apollo_proof_manager_types::{ProofManagerClientError, SharedProofManagerClient};
22
use async_trait::async_trait;
33
#[cfg(any(feature = "testing", test))]
44
use mockall::automock;
@@ -41,6 +41,8 @@ pub enum TransactionConverterError {
4141
#[error("Class of hash: {class_hash} not found")]
4242
ClassNotFound { class_hash: ClassHash },
4343
#[error(transparent)]
44+
ProofManagerClientError(#[from] ProofManagerClientError),
45+
#[error(transparent)]
4446
StarknetApiError(#[from] StarknetApiError),
4547
#[error(transparent)]
4648
ValidateCompiledClassHashError(#[from] ValidateCompiledClassHashError),
@@ -200,7 +202,10 @@ impl TransactionConverterTrait for TransactionConverter {
200202
tx: RpcTransaction,
201203
) -> TransactionConverterResult<InternalRpcTransaction> {
202204
let tx_without_hash = match tx {
203-
RpcTransaction::Invoke(tx) => InternalRpcTransactionWithoutTxHash::Invoke(tx.into()),
205+
RpcTransaction::Invoke(RpcInvokeTransaction::V3(tx)) => {
206+
self._handle_proof_verification(&tx.proof_facts, &tx.proof).await?;
207+
InternalRpcTransactionWithoutTxHash::Invoke(tx.into())
208+
}
204209
RpcTransaction::Declare(RpcDeclareTransaction::V3(tx)) => {
205210
let ClassHashes { class_hash, executable_class_hash_v2 } =
206211
self.class_manager_client.add_class(tx.contract_class).await?;
@@ -310,6 +315,25 @@ impl TransactionConverter {
310315
)?)
311316
}
312317

318+
async fn _handle_proof_verification(
319+
&self,
320+
proof_facts: &ProofFacts,
321+
proof: &Proof,
322+
) -> TransactionConverterResult<()> {
323+
if proof_facts.is_empty() {
324+
return Ok(());
325+
}
326+
327+
let contains_proof = self.proof_manager_client.contains_proof(proof_facts.clone()).await?;
328+
if contains_proof {
329+
return Ok(());
330+
}
331+
332+
self._verify_proof(proof_facts.clone(), proof.clone())?;
333+
self.proof_manager_client.set_proof(proof_facts.clone(), proof.clone()).await?;
334+
Ok(())
335+
}
336+
313337
fn _verify_proof(
314338
&self,
315339
_proof_facts: ProofFacts,

crates/apollo_class_manager_types/src/transaction_converter_test.rs

Lines changed: 99 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,18 @@ use std::sync::Arc;
33
use apollo_proof_manager_types::MockProofManagerClient;
44
use assert_matches::assert_matches;
55
use blockifier::context::ChainInfo;
6-
use mempool_test_utils::starknet_api_test_utils::declare_tx;
6+
use blockifier_test_utils::cairo_versions::{CairoVersion, RunnableCairo1};
7+
use mempool_test_utils::starknet_api_test_utils::{
8+
declare_tx,
9+
invoke_tx,
10+
invoke_tx_client_side_proving,
11+
};
712
use mockall::predicate::eq;
813
use rstest::rstest;
9-
use starknet_api::compiled_class_hash;
1014
use starknet_api::executable_transaction::ValidateCompiledClassHashError;
1115
use starknet_api::rpc_transaction::{RpcDeclareTransaction, RpcTransaction};
16+
use starknet_api::transaction::fields::Proof;
17+
use starknet_api::{compiled_class_hash, felt, proof_facts};
1218

1319
use crate::transaction_converter::{
1420
TransactionConverter,
@@ -56,3 +62,94 @@ async fn test_compiled_class_hash_mismatch() {
5662
);
5763
assert_eq!(err, expected_code);
5864
}
65+
66+
#[rstest]
67+
#[tokio::test]
68+
async fn test_proof_verification_called_for_invoke_v3_with_proof_facts() {
69+
// Create an invoke transaction with proof_facts and proof.
70+
let proof_facts = proof_facts![felt!("0x1"), felt!("0x2"), felt!("0x3")];
71+
let proof = Proof::from(vec![1u32, 2u32, 3u32]);
72+
let invoke_tx = invoke_tx_client_side_proving(
73+
CairoVersion::Cairo1(RunnableCairo1::Casm),
74+
proof_facts.clone(),
75+
proof.clone(),
76+
);
77+
78+
let mut mock_proof_manager_client = MockProofManagerClient::new();
79+
mock_proof_manager_client
80+
.expect_contains_proof()
81+
.once()
82+
.with(eq(proof_facts.clone()))
83+
.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(()));
89+
90+
let mock_class_manager_client = MockClassManagerClient::new();
91+
92+
let transaction_converter = TransactionConverter::new(
93+
Arc::new(mock_class_manager_client),
94+
Arc::new(mock_proof_manager_client),
95+
ChainInfo::create_for_testing().chain_id,
96+
);
97+
98+
// Convert the RPC transaction to an internal RPC transaction.
99+
transaction_converter.convert_rpc_tx_to_internal_rpc_tx(invoke_tx).await.unwrap();
100+
}
101+
102+
#[rstest]
103+
#[tokio::test]
104+
async fn test_proof_verification_skipped_for_invoke_v3_without_proof_facts() {
105+
// Create an invoke transaction without proof_facts.
106+
let invoke_tx = invoke_tx(CairoVersion::Cairo1(RunnableCairo1::Casm));
107+
108+
// Mock proof manager client expects NO calls to contains_proof or set_proof.
109+
let mock_proof_manager_client = MockProofManagerClient::new();
110+
let mock_class_manager_client = MockClassManagerClient::new();
111+
112+
let transaction_converter = TransactionConverter::new(
113+
Arc::new(mock_class_manager_client),
114+
Arc::new(mock_proof_manager_client),
115+
ChainInfo::create_for_testing().chain_id,
116+
);
117+
118+
// Convert the RPC transaction to an internal RPC transaction.
119+
// This should succeed without calling contains_proof or set_proof.
120+
transaction_converter.convert_rpc_tx_to_internal_rpc_tx(invoke_tx).await.unwrap();
121+
}
122+
123+
#[rstest]
124+
#[tokio::test]
125+
async fn test_proof_verification_skipped_when_proof_already_exists() {
126+
// Create an invoke transaction with proof_facts and proof.
127+
let proof_facts = proof_facts![felt!("0x1"), felt!("0x2"), felt!("0x3")];
128+
let proof = Proof::from(vec![1u32, 2u32, 3u32]);
129+
let invoke_tx = invoke_tx_client_side_proving(
130+
CairoVersion::Cairo1(RunnableCairo1::Casm),
131+
proof_facts.clone(),
132+
proof.clone(),
133+
);
134+
135+
let mut mock_proof_manager_client = MockProofManagerClient::new();
136+
// Expect contains_proof to be called and return true (proof already exists).
137+
mock_proof_manager_client
138+
.expect_contains_proof()
139+
.once()
140+
.with(eq(proof_facts))
141+
.return_once(|_| Ok(true));
142+
// Since proof already exists, expect set_proof to NOT be called.
143+
144+
let mock_class_manager_client = MockClassManagerClient::new();
145+
146+
let transaction_converter = TransactionConverter::new(
147+
Arc::new(mock_class_manager_client),
148+
Arc::new(mock_proof_manager_client),
149+
ChainInfo::create_for_testing().chain_id,
150+
);
151+
152+
// Convert the RPC transaction to an internal RPC transaction.
153+
// This should succeed and only call contains_proof, not set_proof.
154+
transaction_converter.convert_rpc_tx_to_internal_rpc_tx(invoke_tx).await.unwrap();
155+
}

crates/apollo_gateway/src/errors.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,9 @@ pub fn transaction_converter_err_to_deprecated_gw_err(
349349
err: TransactionConverterError,
350350
) -> StarknetError {
351351
match err {
352+
TransactionConverterError::ProofManagerClientError(err) => {
353+
StarknetError::internal_with_logging("Proof manager client error", err)
354+
}
352355
TransactionConverterError::ValidateCompiledClassHashError(err) => {
353356
convert_compiled_class_hash_error(err)
354357
}

crates/apollo_gateway/src/stateless_transaction_validator.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ impl StatelessTransactionValidator {
4444

4545
if let RpcTransaction::Invoke(invoke_tx) = tx {
4646
self.validate_client_side_proving_allowed(invoke_tx)?;
47-
self.validate_proof(invoke_tx)?;
4847
}
4948

5049
if let RpcTransaction::Declare(declare_tx) = tx {
@@ -241,11 +240,6 @@ impl StatelessTransactionValidator {
241240
Ok(())
242241
}
243242

244-
fn validate_proof(&self, _: &RpcInvokeTransaction) -> StatelessTransactionValidatorResult<()> {
245-
// TODO(Einat): Implement proof validation.
246-
Ok(())
247-
}
248-
249243
fn validate_declare_tx(
250244
&self,
251245
declare_tx: &RpcDeclareTransaction,

crates/apollo_proof_manager_types/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ pub enum ProofManagerError {
5151
Io(String),
5252
}
5353

54-
#[derive(Clone, Debug, Error)]
54+
#[derive(Clone, Debug, Error, PartialEq)]
5555
pub enum ProofManagerClientError {
5656
#[error(transparent)]
5757
ClientError(#[from] ClientError),

0 commit comments

Comments
 (0)