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;
90 .salted_initialization_hash = salted_initialization_hash,
91 .partial_address = partial_address,
92 .public_keys_hash = public_keys_hash,
93 .preaddress = preaddress,
94 .preaddress_public_key = preaddress_public_key,
95 .address_point = address_point } },
99 check_relation<address_derivation_relation>(trace);
102TEST(AddressDerivationConstrainingTest, WithInteractions)
104 EventEmitter<EccAddEvent> ecadd_event_emitter;
105 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
106 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
110 EventEmitter<AddressDerivationEvent> address_derivation_event_emitter;
112 StrictMock<MockExecutionIdManager> mock_exec_id_manager;
113 EXPECT_CALL(mock_exec_id_manager, get_execution_id)
114 .WillRepeatedly(Return(0));
115 StrictMock<MockGreaterThan>
mock_gt;
119 PureToRadix to_radix_simulator;
120 Ecc ecc_simulator(mock_exec_id_manager,
124 scalar_mul_event_emitter,
125 ecc_add_memory_event_emitter);
127 AddressDerivation address_derivation(poseidon2_simulator, ecc_simulator, address_derivation_event_emitter);
129 TestTraceContainer
trace({
130 { { C::precomputed_first_row, 1 } },
133 AddressDerivationTraceBuilder
builder;
135 EccTraceBuilder ecc_builder;
141 builder.
process(address_derivation_event_emitter.dump_events(), trace);
143 ecc_builder.process_add(ecadd_event_emitter.dump_events(), trace);
144 ecc_builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
146 check_all_interactions<AddressDerivationTraceBuilder>(trace);
147 check_relation<address_derivation_relation>(trace);
150TEST(AddressDerivationConstrainingTest, NegativeWithInteractions)
152 EventEmitter<EccAddEvent> ecadd_event_emitter;
153 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
154 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
158 EventEmitter<AddressDerivationEvent> address_derivation_event_emitter;
160 StrictMock<MockExecutionIdManager> mock_exec_id_manager;
161 EXPECT_CALL(mock_exec_id_manager, get_execution_id)
162 .WillRepeatedly(Return(0));
163 StrictMock<MockGreaterThan>
mock_gt;
167 PureToRadix to_radix_simulator;
168 Ecc ecc_simulator(mock_exec_id_manager,
172 scalar_mul_event_emitter,
173 ecc_add_memory_event_emitter);
175 AddressDerivation address_derivation(poseidon2_simulator, ecc_simulator, address_derivation_event_emitter);
177 TestTraceContainer
trace({
178 { { C::precomputed_first_row, 1 } },
181 AddressDerivationTraceBuilder
builder;
183 EccTraceBuilder ecc_builder;
189 builder.
process(address_derivation_event_emitter.dump_events(), trace);
191 ecc_builder.process_add(ecadd_event_emitter.dump_events(), trace);
192 ecc_builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
194 check_all_interactions<AddressDerivationTraceBuilder>(trace);
195 check_relation<address_derivation_relation>(trace);
198 trace.
set(C::address_derivation_address, 0, 1);
200 (check_interaction<AddressDerivationTraceBuilder, lookup_address_derivation_address_ecadd_settings>(trace)),
201 "Failed.*ADDRESS_ECADD. Could not find tuple in destination.");
206 trace.
set(C::address_derivation_preaddress, 0, 1);
209 (check_interaction<AddressDerivationTraceBuilder, lookup_address_derivation_preaddress_poseidon2_settings>(
211 "Failed.*PREADDRESS_POSEIDON2. Could not find tuple in destination.");
213 (check_interaction<AddressDerivationTraceBuilder, lookup_address_derivation_preaddress_scalar_mul_settings>(
215 "Failed.*PREADDRESS_SCALAR_MUL. Could not find tuple in destination.");
218TEST(AddressDerivationConstrainingTest, NegativeIVKNotOnCurve)
220 TestTraceContainer
trace;
221 AddressDerivationTraceBuilder
builder;
243 .salted_initialization_hash = salted_initialization_hash,
244 .partial_address = partial_address,
245 .public_keys_hash = public_keys_hash,
246 .preaddress = preaddress,
247 .preaddress_public_key = preaddress_public_key,
248 .address_point = address_point } },
252 check_relation<address_derivation_relation>(trace, address_derivation_relation::SR_IVK_ON_CURVE_CHECK),
253 "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__PARTIAL_ADDRESS
#define DOM_SEP__CONTRACT_ADDRESS_V1
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()
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
AvmFlavorSettings::G1::Fq Fq
grumpkin::g1::affine_element AffinePoint