Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
address_derivation.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
24
25namespace bb::avm2::constraining {
26namespace {
27
28using ::testing::Return;
29using ::testing::StrictMock;
30
31using tracegen::AddressDerivationTraceBuilder;
32using tracegen::EccTraceBuilder;
33using tracegen::Poseidon2TraceBuilder;
34using tracegen::TestTraceContainer;
35
36using simulation::AddressDerivation;
37using simulation::AddressDerivationEvent;
39using simulation::Ecc;
40using simulation::EccAddEvent;
41using simulation::EccAddMemoryEvent;
42using simulation::EventEmitter;
43using simulation::FakeToRadix;
45using simulation::MockExecutionIdManager;
46using simulation::MockGreaterThan;
47using simulation::NoopEventEmitter;
48using simulation::Poseidon2;
49using simulation::Poseidon2HashEvent;
50using simulation::Poseidon2PermutationEvent;
51using simulation::Poseidon2PermutationMemoryEvent;
52using simulation::ScalarMulEvent;
53
55using C = Column;
56using address_derivation_relation = bb::avm2::address_derivation<FF>;
57using poseidon2_relation = bb::avm2::poseidon2_hash<FF>;
58using ecadd_relation = bb::avm2::ecc<FF>;
59using scalar_mul_relation = bb::avm2::scalar_mul<FF>;
61
62TEST(AddressDerivationConstrainingTest, EmptyRow)
63{
64 check_relation<address_derivation_relation>(testing::empty_trace());
65}
66
67TEST(AddressDerivationConstrainingTest, Basic)
68{
69 TestTraceContainer trace;
70 AddressDerivationTraceBuilder builder;
71
72 auto instance = testing::random_contract_instance();
73
74 FF salted_initialization_hash = poseidon2::hash(
75 { GENERATOR_INDEX__PARTIAL_ADDRESS, instance.salt, instance.initialisation_hash, instance.deployer_addr });
76
77 FF partial_address =
78 poseidon2::hash({ GENERATOR_INDEX__PARTIAL_ADDRESS, instance.original_class_id, salted_initialization_hash });
79
80 FF public_keys_hash = hash_public_keys(instance.public_keys);
81 FF preaddress = poseidon2::hash({ GENERATOR_INDEX__CONTRACT_ADDRESS_V1, public_keys_hash, partial_address });
82
84 EmbeddedCurvePoint preaddress_public_key = g1 * Fq(preaddress);
85 EmbeddedCurvePoint address_point = preaddress_public_key + instance.public_keys.incoming_viewing_key;
86
87 builder.process({ { .address = address_point.x(),
88 .instance = instance,
89 .salted_initialization_hash = salted_initialization_hash,
90 .partial_address = partial_address,
91 .public_keys_hash = public_keys_hash,
92 .preaddress = preaddress,
93 .preaddress_public_key = preaddress_public_key,
94 .address_point = address_point } },
95 trace);
96
97 EXPECT_EQ(trace.get_num_rows(), 1);
98 check_relation<address_derivation_relation>(trace);
99}
100
101TEST(AddressDerivationConstrainingTest, WithInteractions)
102{
103 EventEmitter<EccAddEvent> ecadd_event_emitter;
104 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
105 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
106 EventEmitter<Poseidon2HashEvent> hash_event_emitter;
107 NoopEventEmitter<Poseidon2PermutationEvent> perm_event_emitter;
108 NoopEventEmitter<Poseidon2PermutationMemoryEvent> perm_mem_event_emitter;
109 EventEmitter<AddressDerivationEvent> address_derivation_event_emitter;
110
111 StrictMock<MockExecutionIdManager> mock_exec_id_manager;
112 EXPECT_CALL(mock_exec_id_manager, get_execution_id)
113 .WillRepeatedly(Return(0)); // Use a fixed execution ID for the test
114 StrictMock<MockGreaterThan> mock_gt;
115 Poseidon2 poseidon2_simulator(
117
118 FakeToRadix to_radix_simulator;
119 Ecc ecc_simulator(mock_exec_id_manager,
120 mock_gt,
121 to_radix_simulator,
122 ecadd_event_emitter,
123 scalar_mul_event_emitter,
124 ecc_add_memory_event_emitter);
125
126 AddressDerivation address_derivation(poseidon2_simulator, ecc_simulator, address_derivation_event_emitter);
127
128 TestTraceContainer trace = TestTraceContainer::from_rows({
129 { .precomputed_first_row = 1 },
130 });
131
132 AddressDerivationTraceBuilder builder;
133 Poseidon2TraceBuilder poseidon2_builder;
134 EccTraceBuilder ecc_builder;
135
136 ContractInstance instance = testing::random_contract_instance();
137 AztecAddress address = compute_contract_address(instance);
138 address_derivation.assert_derivation(address, instance);
139
140 builder.process(address_derivation_event_emitter.dump_events(), trace);
141 poseidon2_builder.process_hash(hash_event_emitter.dump_events(), trace);
142 ecc_builder.process_add(ecadd_event_emitter.dump_events(), trace);
143 ecc_builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
144
145 check_interaction<AddressDerivationTraceBuilder,
157 check_relation<address_derivation_relation>(trace);
158}
159
160} // namespace
161} // namespace bb::avm2::constraining
#define GENERATOR_INDEX__PARTIAL_ADDRESS
#define GENERATOR_INDEX__CONTRACT_ADDRESS_V1
static TestTraceContainer from_rows(const std::vector< AvmFullRow > &rows)
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
Implements a parallelized batch insertion indexed tree Accepts template argument of the type of store...
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
Definition group.hpp:36
AluTraceBuilder builder
Definition alu.test.cpp:123
TestTraceContainer trace
NoopEventEmitter< Poseidon2PermutationEvent > perm_event_emitter
NoopEventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
NiceMock< MockGreaterThan > mock_gt
EventEmitter< Poseidon2HashEvent > hash_event_emitter
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
Definition tx.test.cpp:508
FF hash_public_keys(const PublicKeys &public_keys)
FF compute_contract_address(const ContractInstance &contract_instance)
ContractInstance random_contract_instance()
Definition fixtures.cpp:158
TestTraceContainer empty_trace()
Definition fixtures.cpp:153
lookup_settings< lookup_address_derivation_preaddress_scalar_mul_settings_ > lookup_address_derivation_preaddress_scalar_mul_settings
lookup_settings< lookup_address_derivation_address_ecadd_settings_ > lookup_address_derivation_address_ecadd_settings
lookup_settings< lookup_address_derivation_partial_address_poseidon2_settings_ > lookup_address_derivation_partial_address_poseidon2_settings
lookup_settings< lookup_address_derivation_salted_initialization_hash_poseidon2_1_settings_ > lookup_address_derivation_salted_initialization_hash_poseidon2_1_settings
lookup_settings< lookup_address_derivation_public_keys_hash_poseidon2_4_settings_ > lookup_address_derivation_public_keys_hash_poseidon2_4_settings
lookup_settings< lookup_address_derivation_preaddress_poseidon2_settings_ > lookup_address_derivation_preaddress_poseidon2_settings
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
Definition field.hpp:12
lookup_settings< lookup_address_derivation_public_keys_hash_poseidon2_3_settings_ > lookup_address_derivation_public_keys_hash_poseidon2_3_settings
lookup_settings< lookup_address_derivation_salted_initialization_hash_poseidon2_0_settings_ > lookup_address_derivation_salted_initialization_hash_poseidon2_0_settings
lookup_settings< lookup_address_derivation_public_keys_hash_poseidon2_2_settings_ > lookup_address_derivation_public_keys_hash_poseidon2_2_settings
AvmFlavorSettings::G1::Fq Fq
Definition field.hpp:11
lookup_settings< lookup_address_derivation_public_keys_hash_poseidon2_0_settings_ > lookup_address_derivation_public_keys_hash_poseidon2_0_settings
lookup_settings< lookup_address_derivation_public_keys_hash_poseidon2_1_settings_ > lookup_address_derivation_public_keys_hash_poseidon2_1_settings
typename Flavor::FF FF