1- use crate::messages::delivery::OnchainDeliveryMode ;
21use crate::protocol::point::EmbeddedCurvePoint ;
32use crate::protocol::traits:: {Deserialize , Serialize };
43
54use crate:: {
65 context::PrivateContext ,
76 ephemeral::EphemeralArray ,
8- messages::processing::provided_secret::ProvidedSecret ,
7+ messages ::{ delivery::OnchainDeliveryMode , processing::provided_secret::ProvidedSecret } ,
98 oracle ::{call_utility_function:: call_utility_function , shared_secret:: get_shared_secrets },
109 protocol ::{
1110 abis::function_selector::FunctionSelector , address::AztecAddress , hash:: sha256_to_field , traits::ToField ,
@@ -16,11 +15,10 @@ use crate::{
1615/// Page size for handshake discovery pagination.
1716pub global MAX_HANDSHAKES_PER_PAGE : u32 = 32 ;
1817
19- /// A handshake discovered during sync: the sender's ephemeral public key and the delivery mode .
18+ /// A handshake discovered during sync: the sender's ephemeral public key.
2019#[derive(Deserialize, Eq, Serialize)]
2120pub struct DiscoveredHandshake {
2221 pub eph_pk : EmbeddedCurvePoint ,
23- pub mode : OnchainDeliveryMode ,
2422}
2523
2624/// A paginated response of discovered handshakes.
@@ -35,21 +33,19 @@ pub(crate) global PROVIDED_SECRETS_ARRAY_BASE_SLOT: Field =
3533
3634global HANDSHAKE_EPH_PKS_SLOT : Field = sha256_to_field ("AZTEC_NR::HANDSHAKE_EPH_PKS_SLOT" .as_bytes ());
3735
38- global HANDSHAKE_MODES_SLOT : Field = sha256_to_field ("AZTEC_NR::HANDSHAKE_MODES_SLOT" .as_bytes ());
39-
4036// The helper cannot import the handshake registry interface because the registry contract depends on aztec-nr. These
4137// selector constants pin the registry ABI surface this library calls. The registry's test suite compares them against
4238// its macro-generated `HandshakeRegistry::at(...).method(...).selector` values so signature drift fails in tests.
4339pub global GET_APP_SILOED_SECRET_SELECTOR : FunctionSelector =
44- comptime { FunctionSelector ::from_signature ("get_app_siloed_secret((Field),(Field),(u8) )" ) };
40+ comptime { FunctionSelector ::from_signature ("get_app_siloed_secret((Field),(Field))" ) };
4541pub global NON_INTERACTIVE_HANDSHAKE_SELECTOR : FunctionSelector =
46- comptime { FunctionSelector ::from_signature ("non_interactive_handshake((Field),(Field),(u8) )" ) };
42+ comptime { FunctionSelector ::from_signature ("non_interactive_handshake((Field),(Field))" ) };
4743pub global GET_HANDSHAKES_SELECTOR : FunctionSelector =
4844 comptime { FunctionSelector ::from_signature ("get_handshakes((Field),u32)" ) };
4945
5046/// Resolves the app-siloed handshake secret, bootstrapping when none exists.
5147///
52- /// Resolves the secret for `(sender, recipient, mode )`, creating it via the registry's `non_interactive_handshake`
48+ /// Resolves the secret for `(sender, recipient)`, creating it via the registry's `non_interactive_handshake`
5349/// when no handshake exists yet.
5450///
5551/// Returns `(secret, bootstrapped)`, where `bootstrapped` is true when this call created the handshake.
@@ -65,10 +61,7 @@ pub(crate) fn get_or_create_app_siloed_handshake_secret(
6561 registry : AztecAddress ,
6662 sender : AztecAddress ,
6763 recipient : AztecAddress ,
68- mode : OnchainDeliveryMode ,
6964) -> (Field , bool ) {
70- let mode_field = mode .to_field ();
71-
7265 // Safety: the response only selects which path runs. On `None` we bootstrap via `non_interactive_handshake`,
7366 // whose constrained return value is the secret, so a forged empty response cannot fabricate one; it can only
7467 // trigger an unnecessary re-handshake that replaces the registry note. The caller must constrain the returned
@@ -77,7 +70,7 @@ pub(crate) fn get_or_create_app_siloed_handshake_secret(
7770 let returns = call_utility_function (
7871 registry ,
7972 GET_APP_SILOED_SECRET_SELECTOR ,
80- [sender .to_field (), recipient .to_field (), mode_field ],
73+ [sender .to_field (), recipient .to_field ()],
8174 );
8275 Deserialize ::deserialize (returns )
8376 };
@@ -92,7 +85,7 @@ pub(crate) fn get_or_create_app_siloed_handshake_secret(
9285 .call_private_function (
9386 registry ,
9487 NON_INTERACTIVE_HANDSHAKE_SELECTOR ,
95- [sender .to_field (), recipient .to_field (), mode_field ],
88+ [sender .to_field (), recipient .to_field ()],
9689 )
9790 .get_preimage ();
9891
@@ -110,17 +103,14 @@ pub(crate) unconstrained fn get_handshake_secrets(
110103 let provided_secrets = EphemeralArray ::<ProvidedSecret >::empty_at (PROVIDED_SECRETS_ARRAY_BASE_SLOT );
111104
112105 let eph_pks : EphemeralArray <EmbeddedCurvePoint > = EphemeralArray ::empty_at (HANDSHAKE_EPH_PKS_SLOT );
113- let modes : EphemeralArray <OnchainDeliveryMode > = EphemeralArray ::empty_at (HANDSHAKE_MODES_SLOT );
114106
115107 let mut page_offset : u32 = 0 ;
116108 let mut has_more = true ;
117109 while has_more {
118110 let page = fetch_handshake_page (scope , page_offset );
119111
120112 for j in 0 ..page .items .len () {
121- let handshake = page .items .get (j );
122- eph_pks .push (handshake .eph_pk );
123- modes .push (handshake .mode );
113+ eph_pks .push (page .items .get (j ).eph_pk );
124114 }
125115
126116 page_offset += page .items .len ();
@@ -130,7 +120,10 @@ pub(crate) unconstrained fn get_handshake_secrets(
130120 if eph_pks .len () > 0 {
131121 let secrets = get_shared_secrets (scope , eph_pks , contract_address );
132122 for j in 0 ..secrets .len () {
133- provided_secrets .push (ProvidedSecret { secret : secrets .get (j ), mode : modes .get (j ) });
123+ let secret = secrets .get (j );
124+ // Handshakes are mode-agnostic; emit one entry per on-chain tag domain for PXE to scan.
125+ provided_secrets .push (ProvidedSecret { secret , mode : OnchainDeliveryMode ::onchain_unconstrained () });
126+ provided_secrets .push (ProvidedSecret { secret , mode : OnchainDeliveryMode ::onchain_constrained () });
134127 }
135128 }
136129
@@ -154,27 +147,24 @@ mod test {
154147 DiscoveredHandshake , get_handshake_secrets , HandshakePage , MAX_HANDSHAKES_PER_PAGE ,
155148 };
156149 use crate::messages::delivery::OnchainDeliveryMode ;
157- use crate::protocol:: {address::AztecAddress , traits::Serialize };
150+ use crate::protocol:: {address::AztecAddress , traits ::{ FromField , Serialize } };
158151 use crate::test::helpers::test_environment::TestEnvironment ;
159152 use crate::utils::point::point_from_x_coord ;
160153 use std::test::OracleMock ;
161154
162- global UNCONSTRAINED : OnchainDeliveryMode = OnchainDeliveryMode ::onchain_unconstrained ();
163- global CONSTRAINED : OnchainDeliveryMode = OnchainDeliveryMode ::onchain_constrained ();
164-
165155 #[test]
166156 unconstrained fn get_handshake_secrets_returns_secrets_from_single_page () {
167- let mut env = TestEnvironment ::new ();
168- let scope = env . create_light_account ( );
157+ let env = TestEnvironment ::new ();
158+ let scope = AztecAddress :: from_field ( 1 );
169159 let contract_address = AztecAddress { inner : 0xdeadbeef };
170160
171161 env .utility_context_at (contract_address , |_ | {
172162 let pk_a = point_from_x_coord (1 ).unwrap ();
173163 let pk_b = point_from_x_coord (2 ).unwrap ();
174164
175165 let mut items : BoundedVec <DiscoveredHandshake , MAX_HANDSHAKES_PER_PAGE > = BoundedVec ::new ();
176- items .push (DiscoveredHandshake { eph_pk : pk_a , mode : UNCONSTRAINED });
177- items .push (DiscoveredHandshake { eph_pk : pk_b , mode : CONSTRAINED });
166+ items .push (DiscoveredHandshake { eph_pk : pk_a });
167+ items .push (DiscoveredHandshake { eph_pk : pk_b });
178168 let page = HandshakePage { items , total_count : 2 };
179169 let _ = OracleMock ::mock ("aztec_utl_callUtilityFunction" ).returns (page .serialize ());
180170
@@ -184,18 +174,22 @@ mod test {
184174
185175 let secrets = get_handshake_secrets (contract_address , scope );
186176
187- assert_eq (secrets .len (), 2 );
177+ assert_eq (secrets .len (), 4 );
188178 assert_eq (secrets .get (0 ).secret , secret_a );
189- assert_eq (secrets .get (0 ).mode , UNCONSTRAINED );
190- assert_eq (secrets .get (1 ).secret , secret_b );
191- assert_eq (secrets .get (1 ).mode , CONSTRAINED );
179+ assert (secrets .get (0 ).mode == OnchainDeliveryMode ::onchain_unconstrained ());
180+ assert_eq (secrets .get (1 ).secret , secret_a );
181+ assert (secrets .get (1 ).mode == OnchainDeliveryMode ::onchain_constrained ());
182+ assert_eq (secrets .get (2 ).secret , secret_b );
183+ assert (secrets .get (2 ).mode == OnchainDeliveryMode ::onchain_unconstrained ());
184+ assert_eq (secrets .get (3 ).secret , secret_b );
185+ assert (secrets .get (3 ).mode == OnchainDeliveryMode ::onchain_constrained ());
192186 });
193187 }
194188
195189 #[test]
196190 unconstrained fn get_handshake_secrets_fetches_multiple_pages () {
197- let mut env = TestEnvironment ::new ();
198- let scope = env . create_light_account ( );
191+ let env = TestEnvironment ::new ();
192+ let scope = AztecAddress :: from_field ( 1 );
199193 let contract_address = AztecAddress { inner : 0xdeadbeef };
200194
201195 env .utility_context_at (contract_address , |_ | {
@@ -204,12 +198,12 @@ mod test {
204198 let pk_c = point_from_x_coord (8 ).unwrap ();
205199
206200 let mut page_1_items : BoundedVec <DiscoveredHandshake , MAX_HANDSHAKES_PER_PAGE > = BoundedVec ::new ();
207- page_1_items .push (DiscoveredHandshake { eph_pk : pk_a , mode : UNCONSTRAINED });
208- page_1_items .push (DiscoveredHandshake { eph_pk : pk_b , mode : CONSTRAINED });
201+ page_1_items .push (DiscoveredHandshake { eph_pk : pk_a });
202+ page_1_items .push (DiscoveredHandshake { eph_pk : pk_b });
209203 let page_1 = HandshakePage { items : page_1_items , total_count : 3 };
210204
211205 let mut page_2_items : BoundedVec <DiscoveredHandshake , MAX_HANDSHAKES_PER_PAGE > = BoundedVec ::new ();
212- page_2_items .push (DiscoveredHandshake { eph_pk : pk_c , mode : UNCONSTRAINED });
206+ page_2_items .push (DiscoveredHandshake { eph_pk : pk_c });
213207 let page_2 = HandshakePage { items : page_2_items , total_count : 3 };
214208
215209 let _ = OracleMock ::mock ("aztec_utl_callUtilityFunction" ).returns (page_1 .serialize ()).times (1 );
@@ -218,13 +212,19 @@ mod test {
218212 mock_get_shared_secrets ([111 , 222 , 333 ]);
219213
220214 let secrets = get_handshake_secrets (contract_address , scope );
221- assert_eq (secrets .len (), 3 );
215+ assert_eq (secrets .len (), 6 );
222216 assert_eq (secrets .get (0 ).secret , 111 );
223- assert_eq (secrets .get (0 ).mode , UNCONSTRAINED );
224- assert_eq (secrets .get (1 ).secret , 222 );
225- assert_eq (secrets .get (1 ).mode , CONSTRAINED );
226- assert_eq (secrets .get (2 ).secret , 333 );
227- assert_eq (secrets .get (2 ).mode , UNCONSTRAINED );
217+ assert (secrets .get (0 ).mode == OnchainDeliveryMode ::onchain_unconstrained ());
218+ assert_eq (secrets .get (1 ).secret , 111 );
219+ assert (secrets .get (1 ).mode == OnchainDeliveryMode ::onchain_constrained ());
220+ assert_eq (secrets .get (2 ).secret , 222 );
221+ assert (secrets .get (2 ).mode == OnchainDeliveryMode ::onchain_unconstrained ());
222+ assert_eq (secrets .get (3 ).secret , 222 );
223+ assert (secrets .get (3 ).mode == OnchainDeliveryMode ::onchain_constrained ());
224+ assert_eq (secrets .get (4 ).secret , 333 );
225+ assert (secrets .get (4 ).mode == OnchainDeliveryMode ::onchain_unconstrained ());
226+ assert_eq (secrets .get (5 ).secret , 333 );
227+ assert (secrets .get (5 ).mode == OnchainDeliveryMode ::onchain_constrained ());
228228 });
229229 }
230230
0 commit comments