1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
29using ::testing::Return;
30using ::testing::StrictMock;
32using tracegen::AddressDerivationTraceBuilder;
33using tracegen::EccTraceBuilder;
34using tracegen::Poseidon2TraceBuilder;
35using tracegen::TestTraceContainer;
37using simulation::AddressDerivation;
38using simulation::AddressDerivationEvent;
41using simulation::EccAddEvent;
42using simulation::EccAddMemoryEvent;
43using simulation::EventEmitter;
45using simulation::MockExecutionIdManager;
46using simulation::MockGreaterThan;
47using simulation::NoopEventEmitter;
48using simulation::Poseidon2;
49using simulation::Poseidon2HashEvent;
50using simulation::Poseidon2PermutationEvent;
51using simulation::Poseidon2PermutationMemoryEvent;
52using simulation::PureToRadix;
53using simulation::ScalarMulEvent;
63TEST(AddressDerivationConstrainingTest, EmptyRow)
68TEST(AddressDerivationConstrainingTest, Basic)
70 TestTraceContainer
trace;
71 AddressDerivationTraceBuilder
builder;
93 .salted_initialization_hash = salted_initialization_hash,
94 .partial_address = partial_address,
95 .public_keys_hash = public_keys_hash,
96 .preaddress = preaddress,
97 .preaddress_public_key = preaddress_public_key,
98 .address_point = address_point } },
102 check_relation<address_derivation_relation>(trace);
105TEST(AddressDerivationConstrainingTest, WithInteractions)
107 EventEmitter<EccAddEvent> ecadd_event_emitter;
108 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
109 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
113 EventEmitter<AddressDerivationEvent> address_derivation_event_emitter;
115 StrictMock<MockExecutionIdManager> mock_exec_id_manager;
116 EXPECT_CALL(mock_exec_id_manager, get_execution_id)
117 .WillRepeatedly(Return(0));
118 StrictMock<MockGreaterThan>
mock_gt;
122 PureToRadix to_radix_simulator;
123 Ecc ecc_simulator(mock_exec_id_manager,
127 scalar_mul_event_emitter,
128 ecc_add_memory_event_emitter);
130 AddressDerivation address_derivation(poseidon2_simulator, ecc_simulator, address_derivation_event_emitter);
132 TestTraceContainer
trace({
133 { { C::precomputed_first_row, 1 } },
136 AddressDerivationTraceBuilder
builder;
138 EccTraceBuilder ecc_builder;
144 builder.
process(address_derivation_event_emitter.dump_events(), trace);
146 ecc_builder.process_add(ecadd_event_emitter.dump_events(), trace);
147 ecc_builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
149 check_all_interactions<AddressDerivationTraceBuilder>(trace);
150 check_relation<address_derivation_relation>(trace);
153TEST(AddressDerivationConstrainingTest, NegativeWithInteractions)
155 EventEmitter<EccAddEvent> ecadd_event_emitter;
156 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
157 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
161 EventEmitter<AddressDerivationEvent> address_derivation_event_emitter;
163 StrictMock<MockExecutionIdManager> mock_exec_id_manager;
164 EXPECT_CALL(mock_exec_id_manager, get_execution_id)
165 .WillRepeatedly(Return(0));
166 StrictMock<MockGreaterThan>
mock_gt;
170 PureToRadix to_radix_simulator;
171 Ecc ecc_simulator(mock_exec_id_manager,
175 scalar_mul_event_emitter,
176 ecc_add_memory_event_emitter);
178 AddressDerivation address_derivation(poseidon2_simulator, ecc_simulator, address_derivation_event_emitter);
180 TestTraceContainer
trace({
181 { { C::precomputed_first_row, 1 } },
184 AddressDerivationTraceBuilder
builder;
186 EccTraceBuilder ecc_builder;
192 builder.
process(address_derivation_event_emitter.dump_events(), trace);
194 ecc_builder.process_add(ecadd_event_emitter.dump_events(), trace);
195 ecc_builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
197 check_all_interactions<AddressDerivationTraceBuilder>(trace);
198 check_relation<address_derivation_relation>(trace);
201 trace.
set(C::address_derivation_address, 0, 1);
203 (check_interaction<AddressDerivationTraceBuilder, lookup_address_derivation_address_ecadd_settings>(trace)),
204 "Failed.*ADDRESS_ECADD. Could not find tuple in destination.");
209 trace.
set(C::address_derivation_preaddress, 0, 1);
212 (check_interaction<AddressDerivationTraceBuilder, lookup_address_derivation_preaddress_poseidon2_settings>(
214 "Failed.*PREADDRESS_POSEIDON2. Could not find tuple in destination.");
216 (check_interaction<AddressDerivationTraceBuilder, lookup_address_derivation_preaddress_scalar_mul_settings>(
218 "Failed.*PREADDRESS_SCALAR_MUL. Could not find tuple in destination.");
221TEST(AddressDerivationConstrainingTest, NegativeMutateImmutablesHash)
223 EventEmitter<EccAddEvent> ecadd_event_emitter;
224 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
225 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
229 EventEmitter<AddressDerivationEvent> address_derivation_event_emitter;
231 StrictMock<MockExecutionIdManager> mock_exec_id_manager;
232 EXPECT_CALL(mock_exec_id_manager, get_execution_id).WillRepeatedly(Return(0));
233 StrictMock<MockGreaterThan>
mock_gt;
237 PureToRadix to_radix_simulator;
238 Ecc ecc_simulator(mock_exec_id_manager,
242 scalar_mul_event_emitter,
243 ecc_add_memory_event_emitter);
245 AddressDerivation address_derivation(poseidon2_simulator, ecc_simulator, address_derivation_event_emitter);
247 TestTraceContainer
trace({
248 { { C::precomputed_first_row, 1 } },
251 AddressDerivationTraceBuilder
builder;
253 EccTraceBuilder ecc_builder;
259 builder.
process(address_derivation_event_emitter.dump_events(), trace);
261 ecc_builder.process_add(ecadd_event_emitter.dump_events(), trace);
262 ecc_builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
264 check_all_interactions<AddressDerivationTraceBuilder>(trace);
265 check_relation<address_derivation_relation>(trace);
270 trace.
set(C::address_derivation_immutables_hash, 0,
instance.immutables_hash + 1);
272 (check_interaction<AddressDerivationTraceBuilder,
274 "Failed.*SALTED_INITIALIZATION_HASH_POSEIDON2_1. Could not find tuple in destination.");
277TEST(AddressDerivationConstrainingTest, NegativeIVKNotOnCurve)
279 TestTraceContainer
trace;
280 AddressDerivationTraceBuilder
builder;
302 .salted_initialization_hash = salted_initialization_hash,
303 .partial_address = partial_address,
304 .public_keys_hash = public_keys_hash,
305 .preaddress = preaddress,
306 .preaddress_public_key = preaddress_public_key,
307 .address_point = address_point } },
311 check_relation<address_derivation_relation>(trace, address_derivation_relation::SR_IVK_ON_CURVE_CHECK),
312 "IVK_ON_CURVE_CHECK");
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
std::shared_ptr< Napi::ThreadSafeFunction > instance
#define DOM_SEP__SALTED_INITIALIZATION_HASH
#define DOM_SEP__CONTRACT_ADDRESS_V2
#define DOM_SEP__PARTIAL_ADDRESS
StrictMock< MockGreaterThan > mock_gt
EventEmitter< Poseidon2PermutationMemoryEvent > perm_mem_event_emitter
EventEmitter< Poseidon2PermutationEvent > perm_event_emitter
EventEmitter< Poseidon2HashEvent > hash_event_emitter
Poseidon2TraceBuilder poseidon2_builder
static const StandardAffinePoint & one()
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
void process_hash(const simulation::EventEmitterInterface< simulation::Poseidon2HashEvent >::Container &hash_events, TraceContainer &trace)
Processes the hash events for the Poseidon2 hash function. It populates the columns for the poseidon2...
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value)
Native Poseidon2 hash function implementation.
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
FF hash_public_keys(const PublicKeys &public_keys)
FF compute_contract_address(const ContractInstance &contract_instance)
ContractInstance random_contract_instance()
TestTraceContainer empty_trace()
lookup_settings< lookup_address_derivation_salted_initialization_hash_poseidon2_1_settings_ > lookup_address_derivation_salted_initialization_hash_poseidon2_1_settings
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
AvmFlavorSettings::G1::Fq Fq
grumpkin::g1::affine_element AffinePoint