Skip to content

Commit 6f8a8f2

Browse files
committed
chore: merge merge-train/fairies-v5 into oracle-structs branch
2 parents ca9d327 + 255eab5 commit 6f8a8f2

24 files changed

Lines changed: 270 additions & 385 deletions

File tree

noir-projects/aztec-nr/aztec/src/messages/delivery/constrained_delivery.nr

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
//! See [`constrain_secret`] for how a send is anchored to the registry,
1010

1111
use crate::context::PrivateContext;
12-
use crate::messages::delivery::OnchainDeliveryMode;
1312
use crate::nullifier::utils::compute_nullifier_existence_request;
1413

1514
use crate::protocol::{
@@ -21,7 +20,7 @@ use crate::protocol::{
2120
// registry's test suite compares this against its macro-generated `HandshakeRegistry::at(...).method(...).selector`
2221
// value so signature drift fails in tests.
2322
pub global VALIDATE_HANDSHAKE_SELECTOR: FunctionSelector =
24-
comptime { FunctionSelector::from_signature("validate_handshake((Field),(Field),(u8),Field)") };
23+
comptime { FunctionSelector::from_signature("validate_handshake((Field),(Field),Field)") };
2524

2625
pub(crate) fn constrain_secret_and_emit_nullifier(
2726
context: &mut PrivateContext,
@@ -60,16 +59,14 @@ fn constrain_secret(
6059
index: u32,
6160
) {
6261
let caller = context.this_address();
63-
let mode = OnchainDeliveryMode::onchain_constrained();
64-
let mode_field = mode.to_field();
6562

6663
if bootstrapped {
6764
assert(index == 0, "freshly bootstrapped secret must start at index 0");
6865
} else if index == 0 {
6966
let _ = context.call_private_function(
7067
registry,
7168
VALIDATE_HANDSHAKE_SELECTOR,
72-
[sender.to_field(), recipient.to_field(), mode_field, secret],
69+
[sender.to_field(), recipient.to_field(), secret],
7370
);
7471
} else {
7572
let prev_nullifier = compute_constrained_msg_nullifier(sender, recipient, secret, index - 1);
@@ -96,7 +93,6 @@ pub(crate) fn compute_constrained_msg_nullifier(
9693
mod test {
9794
use crate::context::PrivateContext;
9895
use crate::hash::hash_args;
99-
use crate::messages::delivery::OnchainDeliveryMode;
10096
use crate::protocol::{address::AztecAddress, hash::compute_siloed_nullifier, traits::{FromField, ToField}};
10197
use crate::test::helpers::test_environment::TestEnvironment;
10298
use super::{compute_constrained_msg_nullifier, constrain_secret_and_emit_nullifier, VALIDATE_HANDSHAKE_SELECTOR};
@@ -175,15 +171,7 @@ mod test {
175171
assert_eq(request.call_context.contract_address, registry);
176172
assert_eq(request.call_context.function_selector, VALIDATE_HANDSHAKE_SELECTOR);
177173
assert(!request.call_context.is_static_call);
178-
assert_eq(
179-
request.args_hash,
180-
hash_args([
181-
sender.to_field(),
182-
recipient.to_field(),
183-
OnchainDeliveryMode::onchain_constrained().to_field(),
184-
secret,
185-
]),
186-
);
174+
assert_eq(request.args_hash, hash_args([sender.to_field(), recipient.to_field(), secret]));
187175
});
188176
}
189177

noir-projects/aztec-nr/aztec/src/messages/delivery/handshake.nr

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
use crate::messages::delivery::OnchainDeliveryMode;
21
use crate::protocol::point::EmbeddedCurvePoint;
32
use crate::protocol::traits::{Deserialize, Serialize};
43

54
use 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.
1716
pub 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)]
2120
pub 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

3634
global 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.
4339
pub 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))") };
4541
pub 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))") };
4743
pub 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

noir-projects/aztec-nr/aztec/src/messages/delivery/mod.nr

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@ fn resolve_tag_secret_derivation(
187187
// TODO(F-699): Resolve wallet-default by first reusing an existing handshake for `(sender, recipient, mode)`
188188
// without consulting wallet policy. If none exists, consult the wallet delivery privacy preference before
189189
// choosing address-secret delivery or creating a non-interactive handshake.
190+
//
191+
// Once the privacy preference is oracle-driven, add integration coverage that reuses one mode-agnostic
192+
// handshake secret for both constrained and unconstrained onchain delivery tags. Today unconstrained
193+
// handshake-derived delivery is rejected, so PXE unit tests cover provided-secret expansion across both tag
194+
// domains.
190195
if mode == DeliveryMode::onchain_constrained() {
191196
TagSecretDerivation::non_interactive_handshake()
192197
} else {

noir-projects/aztec-nr/aztec/src/messages/delivery/tag.nr

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ fn derive_handshake_log_tag(
5959
STANDARD_HANDSHAKE_REGISTRY_ADDRESS,
6060
sender,
6161
recipient,
62-
mode,
6362
);
6463

6564
// Safety: the returned index is untrusted and is constrained before the tag is emitted.

noir-projects/aztec-nr/aztec/src/messages/processing/provided_secret.nr

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
use crate::messages::delivery::OnchainDeliveryMode;
2-
use crate::protocol::traits::{Deserialize, Serialize};
1+
use crate::{messages::delivery::OnchainDeliveryMode, protocol::traits::{Deserialize, Serialize}};
32

43
/// A tagging secret the app supplies explicitly to `get_pending_tagged_logs`.
54
///

noir-projects/aztec-nr/aztec/src/oracle/mod.nr

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@ use crate::macros::oracle_testing::{generate_oracle_tests, generate_oracle_tests
1919
// TODO: implement once we support more complex types
2020
quote { emit_public_log_opcode },
2121
quote { returndata_copy_opcode },
22-
// TODO: requires fix on registry
23-
quote { call_opcode },
24-
quote { call_static_opcode },
25-
quote { success_copy_opcode },
2622
],
2723
)]
2824
pub mod avm;

noir-projects/aztec-nr/aztec/src/standard_addresses.nr

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
use protocol_types::{address::AztecAddress, traits::FromField};
33

44
pub global STANDARD_AUTH_REGISTRY_ADDRESS: AztecAddress = AztecAddress::from_field(
5-
0x2df3bf0052304b37c59cfdb79eeeab7f05f8b1e197293e456dc9c7716e6fc654,
5+
0x04fc897b6deff5e3c18900a6a1c8ad601772027a500b8f329083810b7bffaf26,
66
);
77

88
pub global STANDARD_MULTI_CALL_ENTRYPOINT_ADDRESS: AztecAddress = AztecAddress::from_field(
9-
0x099e0fdbd90bed29103c75ae755dc43dc06e53c845dd25cf81ec05570a68c2fb,
9+
0x1aaa6153c0d5780188c64dd4d2c28372d42e5bcee5210c4184a312db0fe709d0,
1010
);
1111

1212
pub global STANDARD_PUBLIC_CHECKS_ADDRESS: AztecAddress = AztecAddress::from_field(
13-
0x2da605de400a83f4c1750fdd1dba3a4b2977884a95549efd06f7a62ef6ae69c3,
13+
0x1da099c6dff135d8e519a4e973f27c0e25cf0897d7cf968c7d38329f46df1056,
1414
);
1515

1616
pub global STANDARD_HANDSHAKE_REGISTRY_ADDRESS: AztecAddress = AztecAddress::from_field(
17-
0x19fca351f28a726da8bd3c66c10f22314bbe6359a61440efbbc0721e019167ef,
17+
0x215f91f8907b8d6406a9b209b88b3d8d01c764c81d3704af257a2de6f0cd908d,
1818
);

noir-projects/noir-contracts/contracts/protocol/aztec_sublib/src/standard_addresses.nr

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
use protocol_types::{address::AztecAddress, traits::FromField};
33

44
pub global STANDARD_AUTH_REGISTRY_ADDRESS: AztecAddress = AztecAddress::from_field(
5-
0x2df3bf0052304b37c59cfdb79eeeab7f05f8b1e197293e456dc9c7716e6fc654,
5+
0x04fc897b6deff5e3c18900a6a1c8ad601772027a500b8f329083810b7bffaf26,
66
);
77

88
pub global STANDARD_MULTI_CALL_ENTRYPOINT_ADDRESS: AztecAddress = AztecAddress::from_field(
9-
0x099e0fdbd90bed29103c75ae755dc43dc06e53c845dd25cf81ec05570a68c2fb,
9+
0x1aaa6153c0d5780188c64dd4d2c28372d42e5bcee5210c4184a312db0fe709d0,
1010
);
1111

1212
pub global STANDARD_PUBLIC_CHECKS_ADDRESS: AztecAddress = AztecAddress::from_field(
13-
0x2da605de400a83f4c1750fdd1dba3a4b2977884a95549efd06f7a62ef6ae69c3,
13+
0x1da099c6dff135d8e519a4e973f27c0e25cf0897d7cf968c7d38329f46df1056,
1414
);
1515

1616
pub global STANDARD_HANDSHAKE_REGISTRY_ADDRESS: AztecAddress = AztecAddress::from_field(
17-
0x19fca351f28a726da8bd3c66c10f22314bbe6359a61440efbbc0721e019167ef,
17+
0x215f91f8907b8d6406a9b209b88b3d8d01c764c81d3704af257a2de6f0cd908d,
1818
);

0 commit comments

Comments
 (0)