Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Private Kernel Recursion #6278

Merged
merged 34 commits into from
May 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
6a94284
WIP
PhilWindle May 5, 2024
bda5590
Merge branch 'master' into pw/private-kernel-recursion
PhilWindle May 5, 2024
e602f87
Fixes
PhilWindle May 6, 2024
e9c49ad
Merge branch 'master' into pw/private-kernel-recursion
PhilWindle May 6, 2024
19825fd
WIP
PhilWindle May 7, 2024
86f1f52
Enable client proof tests
PhilWindle May 7, 2024
4518427
Fixes
PhilWindle May 7, 2024
e304c7b
WIP
PhilWindle May 7, 2024
a832905
Merge branch 'master' into pw/enable-private-kernel-proving-test
PhilWindle May 7, 2024
1d4d0b8
WIP
PhilWindle May 7, 2024
5b652a4
WIP
PhilWindle May 7, 2024
6013888
Merge branch 'pw/enable-private-kernel-proving-test' into pw/private-…
PhilWindle May 7, 2024
66b0079
WIP
PhilWindle May 7, 2024
2c21260
Merge branch 'master' into pw/enable-private-kernel-proving-test
PhilWindle May 7, 2024
af5a94f
Update ci
PhilWindle May 7, 2024
e540f18
Remove test local timeout
PhilWindle May 7, 2024
fa693c0
Formatting
PhilWindle May 8, 2024
6ae4a65
Merge branch 'master' into pw/enable-private-kernel-proving-test
PhilWindle May 8, 2024
e89543f
Formatting
PhilWindle May 8, 2024
3eb0f18
Merge branch 'pw/enable-private-kernel-proving-test' of github.com:Az…
PhilWindle May 8, 2024
fb53887
Merge branch 'pw/enable-private-kernel-proving-test' into pw/private-…
PhilWindle May 8, 2024
9447837
WIP
PhilWindle May 8, 2024
ac4f7be
Merge branch 'master' into pw/private-kernel-recursion
PhilWindle May 8, 2024
200d57e
WIP
PhilWindle May 8, 2024
da251c5
Test fix
PhilWindle May 8, 2024
c32941c
Remove public inputs
PhilWindle May 8, 2024
3eb314d
Merge branch 'master' into pw/complete-kernel-recursion
PhilWindle May 8, 2024
e7c6a35
Merge fix
PhilWindle May 8, 2024
6a2e948
Merge branch 'master' into pw/complete-kernel-recursion
PhilWindle May 8, 2024
ef01c14
Review changes
PhilWindle May 9, 2024
dd0c7df
Merge branch 'master' into pw/complete-kernel-recursion
PhilWindle May 9, 2024
a9cd961
Fix
PhilWindle May 9, 2024
e5e8316
Formatting
PhilWindle May 9, 2024
227ca29
Merge branch 'master' into pw/complete-kernel-recursion
PhilWindle May 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions l1-contracts/src/core/libraries/ConstantsGen.sol
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ library Constants {
uint256 internal constant NULLIFIER_LENGTH = 3;
uint256 internal constant SCOPED_NULLIFIER_LENGTH = NULLIFIER_LENGTH + 1;
uint256 internal constant SIDE_EFFECT_LENGTH = 2;
uint256 internal constant ROLLUP_VALIDATION_REQUESTS_LENGTH = MAX_BLOCK_NUMBER_LENGTH;
uint256 internal constant STATE_REFERENCE_LENGTH =
APPEND_ONLY_TREE_SNAPSHOT_LENGTH + PARTIAL_STATE_REFERENCE_LENGTH;
uint256 internal constant TX_CONTEXT_LENGTH = 2 + GAS_SETTINGS_LENGTH;
Expand Down Expand Up @@ -157,6 +158,34 @@ library Constants {
+ 1;
uint256 internal constant PRIVATE_CALL_STACK_ITEM_LENGTH =
AZTEC_ADDRESS_LENGTH + FUNCTION_DATA_LENGTH + PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH;
uint256 internal constant SCOPED_READ_REQUEST_LEN = READ_REQUEST_LENGTH + 1;
uint256 internal constant PUBLIC_DATA_READ_LENGTH = 2;
uint256 internal constant VALIDATION_REQUESTS_LENGTH = ROLLUP_VALIDATION_REQUESTS_LENGTH
+ (SCOPED_READ_REQUEST_LEN * MAX_NOTE_HASH_READ_REQUESTS_PER_TX)
+ (SCOPED_READ_REQUEST_LEN * MAX_NULLIFIER_READ_REQUESTS_PER_TX)
+ (SCOPED_READ_REQUEST_LEN * MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX)
+ (SCOPED_NULLIFIER_KEY_VALIDATION_REQUEST_LENGTH * MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX)
+ (PUBLIC_DATA_READ_LENGTH * MAX_PUBLIC_DATA_READS_PER_TX);
uint256 internal constant PUBLIC_DATA_UPDATE_REQUEST_LENGTH = 2;
uint256 internal constant COMBINED_ACCUMULATED_DATA_LENGTH = MAX_NEW_NOTE_HASHES_PER_TX
+ MAX_NEW_NULLIFIERS_PER_TX + MAX_NEW_L2_TO_L1_MSGS_PER_TX + 4
+ (MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * PUBLIC_DATA_UPDATE_REQUEST_LENGTH) + GAS_LENGTH;
uint256 internal constant COMBINED_CONSTANT_DATA_LENGTH =
HEADER_LENGTH + TX_CONTEXT_LENGTH + GLOBAL_VARIABLES_LENGTH;
uint256 internal constant CALLER_CONTEXT_LENGTH = 2 * AZTEC_ADDRESS_LENGTH;
uint256 internal constant CALL_REQUEST_LENGTH =
1 + AZTEC_ADDRESS_LENGTH + CALLER_CONTEXT_LENGTH + 2;
uint256 internal constant PRIVATE_ACCUMULATED_DATA_LENGTH = (
SCOPED_NOTE_HASH_LENGTH * MAX_NEW_NOTE_HASHES_PER_TX
) + (SCOPED_NULLIFIER_LENGTH * MAX_NEW_NULLIFIERS_PER_TX)
+ (MAX_NEW_L2_TO_L1_MSGS_PER_TX * SCOPED_L2_TO_L1_MESSAGE_LENGTH)
+ (SIDE_EFFECT_LENGTH * MAX_ENCRYPTED_LOGS_PER_TX)
+ (SIDE_EFFECT_LENGTH * MAX_UNENCRYPTED_LOGS_PER_TX) + 2
+ (CALL_REQUEST_LENGTH * MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX)
+ (CALL_REQUEST_LENGTH * MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX);
uint256 internal constant PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1
+ VALIDATION_REQUESTS_LENGTH + PRIVATE_ACCUMULATED_DATA_LENGTH + COMBINED_CONSTANT_DATA_LENGTH
+ CALL_REQUEST_LENGTH;
uint256 internal constant ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH =
2 + FUNCTION_DATA_LENGTH + CALL_CONTEXT_LENGTH;
uint256 internal constant GET_NOTES_ORACLE_RETURN_LENGTH = 674;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ contract SchnorrAccount {
// Note: If you globally change the entrypoint signature don't forget to update default_entrypoint.ts file
#[aztec(private)]
#[aztec(noinitcheck)]
fn entrypoint(app_payload: pub AppPayload, fee_payload: pub FeePayload) {
fn entrypoint(app_payload: AppPayload, fee_payload: FeePayload) {
let actions = AccountActions::private(
&mut context,
storage.approved_actions.storage_slot,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use dep::private_kernel_lib::PrivateKernelInitCircuitPrivateInputs;
use dep::types::PrivateKernelCircuitPublicInputs;

fn main(input: PrivateKernelInitCircuitPrivateInputs) -> pub PrivateKernelCircuitPublicInputs {
#[recursive]
fn main(input: PrivateKernelInitCircuitPrivateInputs) -> pub PrivateKernelCircuitPublicInputs {
input.native_private_kernel_circuit_initial()
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use dep::private_kernel_lib::PrivateKernelInnerCircuitPrivateInputs;
use dep::types::PrivateKernelCircuitPublicInputs;

fn main(input: PrivateKernelInnerCircuitPrivateInputs) -> pub PrivateKernelCircuitPublicInputs {
#[recursive]
fn main(input: PrivateKernelInnerCircuitPrivateInputs) -> pub PrivateKernelCircuitPublicInputs {
input.native_private_kernel_circuit_inner()
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use dep::reset_kernel_lib::verify_squashed_transient_note_hashes_and_nullifiers;
use dep::types::{
abis::{
kernel_data::PrivateKernelData,
private_kernel_data::PrivateKernelData,
kernel_circuit_public_inputs::{KernelCircuitPublicInputs, PrivateKernelCircuitPublicInputsBuilder, PublicKernelCircuitPublicInputs},
note_hash::ScopedNoteHash, nullifier::ScopedNullifier, side_effect::{SideEffect, Ordered}, gas::Gas
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use crate::{common, private_kernel_circuit_public_inputs_composer::PrivateKernelCircuitPublicInputsComposer};
use dep::types::{
abis::{
private_kernel::private_call_data::PrivateCallData,
private_kernel::private_call_data::{PrivateCallData, verify_private_call},
kernel_circuit_public_inputs::PrivateKernelCircuitPublicInputs
},
constants::MAX_NEW_NOTE_HASHES_PER_CALL, mocked::verify_private_function_proof,
Expand Down Expand Up @@ -68,14 +68,15 @@ impl PrivateKernelInitCircuitPrivateInputs {
pub fn native_private_kernel_circuit_initial(self) -> PrivateKernelCircuitPublicInputs {
let private_call_public_inputs = self.private_call.call_stack_item.public_inputs;

// verify/aggregate the private call proof
verify_private_call(self.private_call);

self.validate_inputs();

common::validate_private_call_data(self.private_call);

self.validate_this_private_call_against_tx_request();

assert(verify_private_function_proof(self.private_call.proof), "Invalid private function proof.");

PrivateKernelCircuitPublicInputsComposer::new_from_tx_request(self.tx_request, private_call_public_inputs).compose(
private_call_public_inputs,
self.hints.note_hash_nullifier_counters,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
use crate::{common, private_kernel_circuit_public_inputs_composer::PrivateKernelCircuitPublicInputsComposer};
use dep::types::{
abis::{
kernel_data::PrivateKernelData, private_kernel::private_call_data::PrivateCallData,
private_kernel_data::{PrivateKernelData, verify_previous_kernel_proof},
private_kernel::private_call_data::{PrivateCallData, verify_private_call},
kernel_circuit_public_inputs::{PrivateKernelCircuitPublicInputs, PrivateKernelCircuitPublicInputsBuilder},
side_effect::SideEffect
},
constants::MAX_NEW_NOTE_HASHES_PER_CALL, mocked::verify_previous_kernel_state,
utils::arrays::array_length
constants::MAX_NEW_NOTE_HASHES_PER_CALL, utils::arrays::array_length
};

struct PrivateKernelInnerHints {
Expand All @@ -30,6 +30,12 @@ impl PrivateKernelInnerCircuitPrivateInputs {
let private_call_public_inputs = self.private_call.call_stack_item.public_inputs;
let previous_kernel_public_inputs = self.previous_kernel.public_inputs;

// verify/aggregate the private call proof
verify_private_call(self.private_call);

// verify/aggregate the previous kernel
verify_previous_kernel_proof(self.previous_kernel);

common::validate_previous_kernel_values(previous_kernel_public_inputs.end);

self.validate_inputs();
Expand All @@ -42,12 +48,6 @@ impl PrivateKernelInnerCircuitPrivateInputs {
let call_request = private_call_stack[private_call_stack_size - 1];
common::validate_call_against_request(self.private_call, call_request);

let (is_previous_state_valid, _updated_aggregation_object) = verify_previous_kernel_state(
previous_kernel_public_inputs.aggregation_object,
self.private_call.proof
);
assert(is_previous_state_valid);

PrivateKernelCircuitPublicInputsComposer::new_from_previous_kernel(self.previous_kernel.public_inputs).compose(
private_call_public_inputs,
self.hints.note_hash_nullifier_counters,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
use crate::kernel_circuit_public_inputs_composer::KernelCircuitPublicInputsComposer;
use dep::reset_kernel_lib::{NoteHashReadRequestHints, NullifierReadRequestHints, PrivateValidationRequestProcessor};
use dep::types::{
abis::{
kernel_data::PrivateKernelData, kernel_circuit_public_inputs::KernelCircuitPublicInputs,
note_hash::ScopedNoteHash, nullifier::ScopedNullifier, side_effect::SideEffect
},
constants::{
MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX, MAX_ENCRYPTED_LOGS_PER_TX, MAX_UNENCRYPTED_LOGS_PER_TX
},
abis::{
private_kernel_data::{PrivateKernelData, verify_previous_kernel_proof}, kernel_circuit_public_inputs::KernelCircuitPublicInputs,
note_hash::ScopedNoteHash, nullifier::ScopedNullifier, side_effect::SideEffect
},
constants::{
MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
MAX_NULLIFIER_KEY_VALIDATION_REQUESTS_PER_TX, MAX_ENCRYPTED_LOGS_PER_TX, MAX_UNENCRYPTED_LOGS_PER_TX
},
grumpkin_private_key::GrumpkinPrivateKey, utils::arrays::array_length
};

Expand Down Expand Up @@ -47,6 +47,9 @@ impl PrivateKernelTailCircuitPrivateInputs {
array_length(previous_public_inputs.end.public_call_stack), 0, "Public call stack must be empty when executing the tail circuit"
);

// verify/aggregate the previous kernel
verify_previous_kernel_proof(self.previous_kernel);

let note_hash_tree_root = previous_public_inputs.constants.historical_header.state.partial.note_hash_tree.root;
let nullifier_tree_root = previous_public_inputs.constants.historical_header.state.partial.nullifier_tree.root;
PrivateValidationRequestProcessor {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::kernel_circuit_public_inputs_composer::KernelCircuitPublicInputsCompo
use dep::reset_kernel_lib::{NoteHashReadRequestHints, NullifierReadRequestHints, PrivateValidationRequestProcessor};
use dep::types::{
abis::{
kernel_data::PrivateKernelData, kernel_circuit_public_inputs::PublicKernelCircuitPublicInputs,
private_kernel_data::{PrivateKernelData, verify_previous_kernel_proof}, kernel_circuit_public_inputs::PublicKernelCircuitPublicInputs,
note_hash::ScopedNoteHash, nullifier::ScopedNullifier, side_effect::SideEffect
},
constants::{
Expand Down Expand Up @@ -47,6 +47,9 @@ impl PrivateKernelTailToPublicCircuitPrivateInputs {
array_length(previous_public_inputs.end.public_call_stack) != 0, "Public call stack must not be empty when exporting public kernel data from the tail circuit"
);

// verify/aggregate the previous kernel
verify_previous_kernel_proof(self.previous_kernel);

let note_hash_tree_root = previous_public_inputs.constants.historical_header.state.partial.note_hash_tree.root;
let nullifier_tree_root = previous_public_inputs.constants.historical_header.state.partial.nullifier_tree.root;
PrivateValidationRequestProcessor {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use dep::private_kernel_lib::PrivateKernelTailToPublicCircuitPrivateInputs;
use dep::types::PublicKernelCircuitPublicInputs;

fn main(input: PrivateKernelTailToPublicCircuitPrivateInputs) -> pub PublicKernelCircuitPublicInputs {
#[recursive]
fn main(input: PrivateKernelTailToPublicCircuitPrivateInputs) -> pub PublicKernelCircuitPublicInputs {
input.execute()
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use dep::private_kernel_lib::PrivateKernelTailCircuitPrivateInputs;
use dep::types::KernelCircuitPublicInputs;

fn main(input: PrivateKernelTailCircuitPrivateInputs) -> pub KernelCircuitPublicInputs {
#[recursive]
fn main(input: PrivateKernelTailCircuitPrivateInputs) -> pub KernelCircuitPublicInputs {
input.native_private_kernel_circuit_tail()
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,6 @@ impl PublicKernelTailCircuitPrivateInputs {
let end = self.propagate_accumulated_data();

KernelCircuitPublicInputs {
aggregation_object: previous_public_inputs.aggregation_object,
rollup_validation_requests: previous_public_inputs.validation_requests.for_rollup,
end,
constants: previous_public_inputs.constants,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ impl BaseRollupInputs {
// TODO(Kev): This aggregate_proof method is duplicated in a lot of places
fn aggregate_proofs(self) -> AggregationObject {
// TODO: for now we simply return the aggregation object from the first proof
self.kernel_data.public_inputs.aggregation_object
AggregationObject {}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ mod max_block_number;
mod private_kernel;
mod kernel_circuit_public_inputs;
mod kernel_data;
mod private_kernel_data;

mod call_request;
mod private_call_stack_item;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ use crate::{
},
constants::{
MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_TX,
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, COMBINED_ACCUMULATED_DATA_LENGTH
},
utils::arrays::array_merge, traits::Empty
utils::arrays::array_merge, traits::{Empty, Serialize}
};

struct CombinedAccumulatedData {
Expand Down Expand Up @@ -82,3 +82,27 @@ impl Empty for CombinedAccumulatedData {
}
}
}

impl Serialize<COMBINED_ACCUMULATED_DATA_LENGTH> for CombinedAccumulatedData {
fn serialize(self) -> [Field; COMBINED_ACCUMULATED_DATA_LENGTH] {
let mut fields: BoundedVec<Field, COMBINED_ACCUMULATED_DATA_LENGTH> = BoundedVec::new();

fields.extend_from_array(self.new_note_hashes);
fields.extend_from_array(self.new_nullifiers);
fields.extend_from_array(self.new_l2_to_l1_msgs);
fields.push(self.encrypted_logs_hash);
fields.push(self.unencrypted_logs_hash);
fields.push(self.encrypted_log_preimages_length);
fields.push(self.unencrypted_log_preimages_length);

for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX {
fields.extend_from_array(self.public_data_update_requests[i].serialize());
}

fields.extend_from_array(self.gas_used.serialize());

assert_eq(fields.len(), COMBINED_ACCUMULATED_DATA_LENGTH);

fields.storage
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ use crate::{
call_request::CallRequest, gas::Gas, note_hash::ScopedNoteHash, nullifier::ScopedNullifier,
side_effect::SideEffect
},
messaging::l2_to_l1_message::ScopedL2ToL1Message
traits::Serialize, messaging::l2_to_l1_message::ScopedL2ToL1Message
};
use crate::constants::{
MAX_NEW_NOTE_HASHES_PER_TX, MAX_NEW_NULLIFIERS_PER_TX, MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX,
MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX, MAX_NEW_L2_TO_L1_MSGS_PER_TX, MAX_ENCRYPTED_LOGS_PER_TX,
MAX_UNENCRYPTED_LOGS_PER_TX
MAX_UNENCRYPTED_LOGS_PER_TX, PRIVATE_ACCUMULATED_DATA_LENGTH
};

struct PrivateAccumulatedData {
Expand All @@ -27,3 +27,44 @@ struct PrivateAccumulatedData {
private_call_stack: [CallRequest; MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX],
public_call_stack: [CallRequest; MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX],
}

impl Serialize<PRIVATE_ACCUMULATED_DATA_LENGTH> for PrivateAccumulatedData {
fn serialize(self) -> [Field; PRIVATE_ACCUMULATED_DATA_LENGTH] {
let mut fields: BoundedVec<Field, PRIVATE_ACCUMULATED_DATA_LENGTH> = BoundedVec::new();

for i in 0..MAX_NEW_NOTE_HASHES_PER_TX {
fields.extend_from_array(self.new_note_hashes[i].serialize());
}

for i in 0..MAX_NEW_NULLIFIERS_PER_TX {
fields.extend_from_array(self.new_nullifiers[i].serialize());
}

for i in 0..MAX_NEW_L2_TO_L1_MSGS_PER_TX {
fields.extend_from_array(self.new_l2_to_l1_msgs[i].serialize());
}

for i in 0..MAX_ENCRYPTED_LOGS_PER_TX {
fields.extend_from_array(self.encrypted_logs_hashes[i].serialize());
}

for i in 0..MAX_UNENCRYPTED_LOGS_PER_TX {
fields.extend_from_array(self.unencrypted_logs_hashes[i].serialize());
}

fields.push(self.encrypted_log_preimages_length);
fields.push(self.unencrypted_log_preimages_length);

for i in 0..MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX {
fields.extend_from_array(self.private_call_stack[i].serialize());
}

for i in 0..MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX {
fields.extend_from_array(self.public_call_stack[i].serialize());
}

assert_eq(fields.len(), PRIVATE_ACCUMULATED_DATA_LENGTH);

fields.storage
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
use crate::address::AztecAddress;
use dep::std::cmp::Eq;
use crate::traits::Empty;
use crate::traits::{Empty, Serialize};
use crate::abis::caller_context::CallerContext;
use crate::constants::CALL_REQUEST_LENGTH;

struct CallRequest {
hash: Field,
Expand Down Expand Up @@ -38,3 +39,19 @@ impl CallRequest {
self.hash == 0
}
}

impl Serialize<CALL_REQUEST_LENGTH> for CallRequest {
fn serialize(self) -> [Field; CALL_REQUEST_LENGTH] {
let mut fields: BoundedVec<Field, CALL_REQUEST_LENGTH> = BoundedVec::new();

fields.push(self.hash);
fields.extend_from_array(self.caller_contract_address.serialize());
fields.extend_from_array(self.caller_context.serialize());
fields.push(self.start_side_effect_counter as Field);
fields.push(self.end_side_effect_counter as Field);

assert_eq(fields.len(), CALL_REQUEST_LENGTH);

fields.storage
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::address::AztecAddress;
use dep::std::cmp::Eq;
use crate::traits::Empty;
use crate::traits::{Empty, Serialize};
use crate::constants::CALLER_CONTEXT_LENGTH;

struct CallerContext {
msg_sender: AztecAddress,
Expand Down Expand Up @@ -28,3 +29,16 @@ impl CallerContext {
self.msg_sender.is_zero() & self.storage_contract_address.is_zero()
}
}

impl Serialize<CALLER_CONTEXT_LENGTH> for CallerContext {
fn serialize(self) -> [Field; CALLER_CONTEXT_LENGTH] {
let mut fields: BoundedVec<Field, CALLER_CONTEXT_LENGTH> = BoundedVec::new();

fields.extend_from_array(self.msg_sender.serialize());
fields.extend_from_array(self.storage_contract_address.serialize());

assert_eq(fields.len(), CALLER_CONTEXT_LENGTH);

fields.storage
}
}
Loading
Loading