Skip to content

Commit 07dc072

Browse files
authored
refactor: private call validation (AztecProtocol#6510)
Emitting private call requests from app circuit instead of passing them via private inputs. Added the checks for: static calls, constants. Removed the check for public call request counter ranges.
1 parent 72931bd commit 07dc072

53 files changed

Lines changed: 991 additions & 651 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

barretenberg/cpp/src/barretenberg/vm/avm_trace/aztec_constants.hpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ const size_t NOTE_HASH_LENGTH = 2;
101101
const size_t SCOPED_NOTE_HASH_LENGTH = NOTE_HASH_LENGTH + 2;
102102
const size_t NULLIFIER_LENGTH = 3;
103103
const size_t SCOPED_NULLIFIER_LENGTH = NULLIFIER_LENGTH + 1;
104+
const size_t CALLER_CONTEXT_LENGTH = 2 * AZTEC_ADDRESS_LENGTH + 1;
105+
const size_t PRIVATE_CALL_REQUEST_LENGTH = 3 + CALLER_CONTEXT_LENGTH;
106+
const size_t SCOPED_PRIVATE_CALL_REQUEST_LENGTH = PRIVATE_CALL_REQUEST_LENGTH + AZTEC_ADDRESS_LENGTH;
104107
const size_t SIDE_EFFECT_LENGTH = 2;
105108
const size_t ROLLUP_VALIDATION_REQUESTS_LENGTH = MAX_BLOCK_NUMBER_LENGTH;
106109
const size_t STATE_REFERENCE_LENGTH = APPEND_ONLY_TREE_SNAPSHOT_LENGTH + PARTIAL_STATE_REFERENCE_LENGTH;
@@ -113,7 +116,7 @@ const size_t PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH =
113116
(READ_REQUEST_LENGTH * MAX_NULLIFIER_READ_REQUESTS_PER_CALL) +
114117
(NULLIFIER_KEY_VALIDATION_REQUEST_LENGTH * MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_CALL) +
115118
(NOTE_HASH_LENGTH * MAX_NEW_NOTE_HASHES_PER_CALL) + (NULLIFIER_LENGTH * MAX_NEW_NULLIFIERS_PER_CALL) +
116-
MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL + MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL + 1 +
119+
(PRIVATE_CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL) + MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL + 1 +
117120
(L2_TO_L1_MESSAGE_LENGTH * MAX_NEW_L2_TO_L1_MSGS_PER_CALL) + 2 +
118121
(NOTE_LOG_HASH_LENGTH * MAX_NOTE_ENCRYPTED_LOGS_PER_CALL) + (LOG_HASH_LENGTH * MAX_ENCRYPTED_LOGS_PER_CALL) +
119122
(LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_CALL) + HEADER_LENGTH + TX_CONTEXT_LENGTH;
@@ -143,13 +146,13 @@ const size_t COMBINED_ACCUMULATED_DATA_LENGTH =
143146
MAX_NEW_NOTE_HASHES_PER_TX + MAX_NEW_NULLIFIERS_PER_TX + MAX_NEW_L2_TO_L1_MSGS_PER_TX + 5 +
144147
(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * PUBLIC_DATA_UPDATE_REQUEST_LENGTH) + GAS_LENGTH;
145148
const size_t COMBINED_CONSTANT_DATA_LENGTH = HEADER_LENGTH + TX_CONTEXT_LENGTH + GLOBAL_VARIABLES_LENGTH;
146-
const size_t CALLER_CONTEXT_LENGTH = 2 * AZTEC_ADDRESS_LENGTH;
147149
const size_t CALL_REQUEST_LENGTH = 1 + AZTEC_ADDRESS_LENGTH + CALLER_CONTEXT_LENGTH + 2;
148150
const size_t PRIVATE_ACCUMULATED_DATA_LENGTH =
149151
(SCOPED_NOTE_HASH_LENGTH * MAX_NEW_NOTE_HASHES_PER_TX) + (SCOPED_NULLIFIER_LENGTH * MAX_NEW_NULLIFIERS_PER_TX) +
150152
(MAX_NEW_L2_TO_L1_MSGS_PER_TX * SCOPED_L2_TO_L1_MESSAGE_LENGTH) +
151153
(NOTE_LOG_HASH_LENGTH * MAX_NOTE_ENCRYPTED_LOGS_PER_TX) + (LOG_HASH_LENGTH * MAX_ENCRYPTED_LOGS_PER_TX) +
152-
(LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_TX) + (CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX) +
154+
(LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_TX) +
155+
(SCOPED_PRIVATE_CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX) +
153156
(CALL_REQUEST_LENGTH * MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX);
154157
const size_t PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH =
155158
1 + VALIDATION_REQUESTS_LENGTH + PRIVATE_ACCUMULATED_DATA_LENGTH + COMBINED_CONSTANT_DATA_LENGTH +

l1-contracts/src/core/libraries/ConstantsGen.sol

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ library Constants {
130130
uint256 internal constant SCOPED_NOTE_HASH_LENGTH = NOTE_HASH_LENGTH + 2;
131131
uint256 internal constant NULLIFIER_LENGTH = 3;
132132
uint256 internal constant SCOPED_NULLIFIER_LENGTH = NULLIFIER_LENGTH + 1;
133+
uint256 internal constant CALLER_CONTEXT_LENGTH = 2 * AZTEC_ADDRESS_LENGTH + 1;
134+
uint256 internal constant PRIVATE_CALL_REQUEST_LENGTH = 3 + CALLER_CONTEXT_LENGTH;
135+
uint256 internal constant SCOPED_PRIVATE_CALL_REQUEST_LENGTH =
136+
PRIVATE_CALL_REQUEST_LENGTH + AZTEC_ADDRESS_LENGTH;
133137
uint256 internal constant SIDE_EFFECT_LENGTH = 2;
134138
uint256 internal constant ROLLUP_VALIDATION_REQUESTS_LENGTH = MAX_BLOCK_NUMBER_LENGTH;
135139
uint256 internal constant STATE_REFERENCE_LENGTH =
@@ -143,7 +147,8 @@ library Constants {
143147
+ (READ_REQUEST_LENGTH * MAX_NULLIFIER_READ_REQUESTS_PER_CALL)
144148
+ (NULLIFIER_KEY_VALIDATION_REQUEST_LENGTH * MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_CALL)
145149
+ (NOTE_HASH_LENGTH * MAX_NEW_NOTE_HASHES_PER_CALL)
146-
+ (NULLIFIER_LENGTH * MAX_NEW_NULLIFIERS_PER_CALL) + MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL
150+
+ (NULLIFIER_LENGTH * MAX_NEW_NULLIFIERS_PER_CALL)
151+
+ (PRIVATE_CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL)
147152
+ MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL + 1
148153
+ (L2_TO_L1_MESSAGE_LENGTH * MAX_NEW_L2_TO_L1_MSGS_PER_CALL) + 2
149154
+ (NOTE_LOG_HASH_LENGTH * MAX_NOTE_ENCRYPTED_LOGS_PER_CALL)
@@ -177,7 +182,6 @@ library Constants {
177182
+ (MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * PUBLIC_DATA_UPDATE_REQUEST_LENGTH) + GAS_LENGTH;
178183
uint256 internal constant COMBINED_CONSTANT_DATA_LENGTH =
179184
HEADER_LENGTH + TX_CONTEXT_LENGTH + GLOBAL_VARIABLES_LENGTH;
180-
uint256 internal constant CALLER_CONTEXT_LENGTH = 2 * AZTEC_ADDRESS_LENGTH;
181185
uint256 internal constant CALL_REQUEST_LENGTH =
182186
1 + AZTEC_ADDRESS_LENGTH + CALLER_CONTEXT_LENGTH + 2;
183187
uint256 internal constant PRIVATE_ACCUMULATED_DATA_LENGTH = (
@@ -186,7 +190,7 @@ library Constants {
186190
+ (MAX_NEW_L2_TO_L1_MSGS_PER_TX * SCOPED_L2_TO_L1_MESSAGE_LENGTH)
187191
+ (NOTE_LOG_HASH_LENGTH * MAX_NOTE_ENCRYPTED_LOGS_PER_TX)
188192
+ (LOG_HASH_LENGTH * MAX_ENCRYPTED_LOGS_PER_TX) + (LOG_HASH_LENGTH * MAX_UNENCRYPTED_LOGS_PER_TX)
189-
+ (CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX)
193+
+ (SCOPED_PRIVATE_CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX)
190194
+ (CALL_REQUEST_LENGTH * MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX);
191195
uint256 internal constant PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1
192196
+ VALIDATION_REQUESTS_LENGTH + PRIVATE_ACCUMULATED_DATA_LENGTH + COMBINED_CONSTANT_DATA_LENGTH

noir-projects/aztec-nr/aztec/src/context/private_context.nr

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ use crate::{
1717
use dep::protocol_types::{
1818
hash::sha256_to_field,
1919
abis::{
20-
function_selector::FunctionSelector, max_block_number::MaxBlockNumber,
21-
nullifier_key_validation_request::NullifierKeyValidationRequest,
22-
private_circuit_public_inputs::PrivateCircuitPublicInputs,
20+
caller_context::CallerContext, function_selector::FunctionSelector,
21+
max_block_number::MaxBlockNumber, nullifier_key_validation_request::NullifierKeyValidationRequest,
22+
private_call_request::PrivateCallRequest, private_circuit_public_inputs::PrivateCircuitPublicInputs,
2323
public_call_stack_item::PublicCallStackItem, read_request::ReadRequest, note_hash::NoteHash,
2424
nullifier::Nullifier, log_hash::{LogHash, NoteLogHash}
2525
},
@@ -58,7 +58,7 @@ struct PrivateContext {
5858
new_note_hashes: BoundedVec<NoteHash, MAX_NEW_NOTE_HASHES_PER_CALL>,
5959
new_nullifiers: BoundedVec<Nullifier, MAX_NEW_NULLIFIERS_PER_CALL>,
6060

61-
private_call_stack_hashes : BoundedVec<Field, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,
61+
private_call_requests : BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,
6262
public_call_stack_hashes : BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,
6363
public_teardown_function_hash: Field,
6464
new_l2_to_l1_msgs : BoundedVec<L2ToL1Message, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,
@@ -124,7 +124,7 @@ impl PrivateContext {
124124
new_note_hashes: BoundedVec::new(),
125125
new_nullifiers: BoundedVec::new(),
126126
historical_header: inputs.historical_header,
127-
private_call_stack_hashes: BoundedVec::new(),
127+
private_call_requests: BoundedVec::new(),
128128
public_call_stack_hashes: BoundedVec::new(),
129129
public_teardown_function_hash: 0,
130130
new_l2_to_l1_msgs: BoundedVec::new(),
@@ -165,7 +165,7 @@ impl PrivateContext {
165165
nullifier_key_validation_requests: self.nullifier_key_validation_requests.storage,
166166
new_note_hashes: self.new_note_hashes.storage,
167167
new_nullifiers: self.new_nullifiers.storage,
168-
private_call_stack_hashes: self.private_call_stack_hashes.storage,
168+
private_call_requests: self.private_call_requests.storage,
169169
public_call_stack_hashes: self.public_call_stack_hashes.storage,
170170
public_teardown_function_hash: self.public_teardown_function_hash,
171171
new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,
@@ -409,18 +409,20 @@ impl PrivateContext {
409409
is_delegate_call: bool
410410
) -> PackedReturns {
411411
let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;
412+
let start_side_effect_counter = self.side_effect_counter;
412413
let item = call_private_function_internal(
413414
contract_address,
414415
function_selector,
415416
args_hash,
416-
self.side_effect_counter,
417+
start_side_effect_counter,
417418
is_static_call,
418419
is_delegate_call
419420
);
420421

421-
assert_eq(item.public_inputs.call_context.side_effect_counter, self.side_effect_counter);
422-
assert_eq(item.public_inputs.start_side_effect_counter, self.side_effect_counter);
423-
self.side_effect_counter = item.public_inputs.end_side_effect_counter + 1;
422+
assert_eq(item.public_inputs.call_context.side_effect_counter, start_side_effect_counter);
423+
assert_eq(item.public_inputs.start_side_effect_counter, start_side_effect_counter);
424+
let end_side_effect_counter = item.public_inputs.end_side_effect_counter;
425+
self.side_effect_counter = end_side_effect_counter + 1;
424426

425427
// TODO (fees) figure out why this crashes the prover and enable it
426428
// we need this in order to pay fees inside child call contexts
@@ -458,7 +460,15 @@ impl PrivateContext {
458460
);
459461
}
460462

461-
self.private_call_stack_hashes.push(item.hash());
463+
let mut caller_context = CallerContext::empty();
464+
caller_context.is_static_call = self.inputs.call_context.is_static_call;
465+
if is_delegate_call {
466+
caller_context.msg_sender = self.inputs.call_context.msg_sender;
467+
caller_context.storage_contract_address = self.inputs.call_context.storage_contract_address;
468+
}
469+
self.private_call_requests.push(
470+
PrivateCallRequest { hash: item.hash(), caller_context, start_side_effect_counter, end_side_effect_counter }
471+
);
462472

463473
PackedReturns::new(item.public_inputs.returns_hash)
464474
}
@@ -652,10 +662,10 @@ impl Empty for PrivateContext {
652662
nullifier_key_validation_requests: BoundedVec::new(),
653663
new_note_hashes: BoundedVec::new(),
654664
new_nullifiers: BoundedVec::new(),
655-
private_call_stack_hashes : BoundedVec::new(),
656-
public_call_stack_hashes : BoundedVec::new(),
665+
private_call_requests: BoundedVec::new(),
666+
public_call_stack_hashes: BoundedVec::new(),
657667
public_teardown_function_hash: 0,
658-
new_l2_to_l1_msgs : BoundedVec::new(),
668+
new_l2_to_l1_msgs: BoundedVec::new(),
659669
historical_header: Header::empty(),
660670
note_encrypted_logs_hashes: BoundedVec::new(),
661671
encrypted_logs_hashes: BoundedVec::new(),

0 commit comments

Comments
 (0)