Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
keccakf1600_fixture.test.cpp
Go to the documentation of this file.
2
18
19#include <cstdint>
20#include <gmock/gmock.h>
21
22namespace bb::avm2::testing {
23
39
41 const std::function<void(MemorySimulator&, size_t)>& memory_init_fn,
42 const std::vector<MemoryAddress>& dst_addresses,
43 const std::vector<MemoryAddress>& src_addresses,
44 bool expect_error,
45 uint16_t space_id)
46{
47 KeccakF1600TraceBuilder keccak_builder;
48 BitwiseTraceBuilder bitwise_builder;
50 GreaterThanTraceBuilder greater_than_builder;
52 MemoryTraceBuilder memory_builder;
53
57 EventEmitter<simulation::MemoryEvent> memory_event_emitter;
62 FieldGreaterThanSimulator field_gt_simulator(range_check_simulator, field_gt_event_emitter);
63 GreaterThanSimulator greater_than_simulator(field_gt_simulator, range_check_simulator, greater_than_event_emitter);
64 BitwiseSimulator bitwise_simulator(bitwise_event_emitter);
65 KeccakSimulator keccak_simulator(
66 execution_id_manager, keccak_event_emitter, bitwise_simulator, range_check_simulator, greater_than_simulator);
67 MemorySimulator memory_simulator(space_id, range_check_simulator, execution_id_manager, memory_event_emitter);
68
69 for (size_t i = 0; i < src_addresses.size(); i++) {
70 memory_init_fn(memory_simulator, i);
71 if (expect_error) {
72 ASSERT_THROW(keccak_simulator.permutation(memory_simulator, dst_addresses.at(i), src_addresses.at(i)),
74 } else {
75 keccak_simulator.permutation(memory_simulator, dst_addresses.at(i), src_addresses.at(i));
76 }
77 }
78
79 const auto keccak_events = keccak_event_emitter.dump_events();
80
81 keccak_builder.process_permutation(keccak_events, trace);
82 keccak_builder.process_memory_slices(keccak_events, trace);
83 bitwise_builder.process(bitwise_event_emitter.dump_events(), trace);
85 greater_than_builder.process(greater_than_event_emitter.dump_events(), trace);
86 memory_builder.process(memory_event_emitter.dump_events(), trace);
89 3 * AVM_KECCAKF1600_STATE_SIZE * static_cast<uint32_t>(src_addresses.size()));
90}
91
93 const std::vector<MemoryAddress>& dst_addresses,
94 const std::vector<MemoryAddress>& src_addresses,
95 uint16_t space_id)
96{
98 trace,
99 [&](MemorySimulator& memory_simulator, size_t i) {
100 // Write in memory first to fill source values in memory.
101 // Arbitrary values: 100 * i + j * 2^32 + k
102 for (size_t j = 0; j < 5; j++) {
103 for (size_t k = 0; k < 5; k++) {
104 memory_simulator.set(src_addresses[i] + static_cast<MemoryAddress>((5 * j) + k),
105 MemoryValue::from<uint64_t>((static_cast<uint64_t>(j) << 32) + k + (100 * i)));
106 }
107 }
108 },
109 dst_addresses,
110 src_addresses,
111 false,
112 space_id);
113}
114
116 MemoryAddress dst_address,
117 MemoryAddress src_address,
118 size_t error_offset,
119 MemoryTag error_tag,
120 uint16_t space_id)
121{
123 trace,
124 [&](MemorySimulator& memory_simulator, size_t) {
125 // Write in memory first to fill source values in memory.
126 // Arbitrary values: 100 + j * 2^32 + k
127 for (size_t j = 0; j < 5; j++) {
128 for (size_t k = 0; k < 5; k++) {
129 const size_t idx = (5 * j) + k;
130 if (idx == error_offset) {
131 memory_simulator.set(
132 src_address + static_cast<MemoryAddress>(idx),
133 MemoryValue::from_tag_truncating(error_tag, (static_cast<uint64_t>(j) << 32) + k + 100));
134 } else {
135 memory_simulator.set(src_address + static_cast<MemoryAddress>(idx),
136 MemoryValue::from<uint64_t>((static_cast<uint64_t>(j) << 32) + k + 100));
137 }
138 }
139 }
140 },
141 { dst_address },
142 { src_address },
143 true,
144 space_id);
145}
146
147// Helper function to generate a keccak trace with a slice error.
149 MemoryAddress dst_address,
150 MemoryAddress src_address,
151 uint16_t space_id)
152{
153 // Precondition for this trace to make sense is that the src or dst slice is out of bounds.
154 ASSERT_TRUE(src_address > AVM_HIGHEST_MEM_ADDRESS - AVM_KECCAKF1600_STATE_SIZE + 1 ||
156
158 trace,
159 [&]([[maybe_unused]] MemorySimulator& memory_simulator, size_t) {},
160 { dst_address },
161 { src_address },
162 true,
163 space_id);
164}
165
166} // namespace bb::avm2::testing
#define AVM_KECCAKF1600_STATE_SIZE
#define AVM_HIGHEST_MEM_ADDRESS
static TaggedValue from_tag_truncating(ValueTag tag, FF value)
void permutation(MemoryInterface &memory, MemoryAddress dst_addr, MemoryAddress src_addr) override
Permutation Keccak-f[1600] consisting in AVM_KECCAKF1600_NUM_ROUNDS (24) rounds and a state of 25 64-...
void set(MemoryAddress index, MemoryValue value) override
Definition memory.cpp:12
void process(const simulation::EventEmitterInterface< simulation::BitwiseEvent >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::GreaterThanEvent >::Container &events, TraceContainer &trace)
Definition gt_trace.cpp:11
void process_memory_slices(const simulation::EventEmitterInterface< simulation::KeccakF1600Event >::Container &events, TraceContainer &trace)
void process_permutation(const simulation::EventEmitterInterface< simulation::KeccakF1600Event >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::MemoryEvent >::Container &events, TraceContainer &trace)
void process_keccak_round_constants(TraceContainer &trace)
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
void process(const simulation::EventEmitterInterface< simulation::RangeCheckEvent >::Container &events, TraceContainer &trace)
RangeCheckTraceBuilder range_check_builder
Definition alu.test.cpp:120
PrecomputedTraceBuilder precomputed_builder
Definition alu.test.cpp:119
ExecutionIdManager execution_id_manager
EventEmitter< RangeCheckEvent > range_check_event_emitter
TestTraceContainer trace
void generate_keccak_trace(TestTraceContainer &trace, const std::vector< MemoryAddress > &dst_addresses, const std::vector< MemoryAddress > &src_addresses, uint16_t space_id)
void generate_keccak_trace_with_slice_error(TestTraceContainer &trace, MemoryAddress dst_address, MemoryAddress src_address, uint16_t space_id)
void generate_keccak_trace_impl(TestTraceContainer &trace, const std::function< void(MemorySimulator &, size_t)> &memory_init_fn, const std::vector< MemoryAddress > &dst_addresses, const std::vector< MemoryAddress > &src_addresses, bool expect_error, uint16_t space_id)
void generate_keccak_trace_with_tag_error(TestTraceContainer &trace, MemoryAddress dst_address, MemoryAddress src_address, size_t error_offset, MemoryTag error_tag, uint16_t space_id)
uint32_t MemoryAddress
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
NoopEventEmitter< GreaterThanEvent > greater_than_event_emitter
NoopEventEmitter< FieldGreaterThanEvent > field_gt_event_emitter
NoopEventEmitter< BitwiseEvent > bitwise_event_emitter
NoopEventEmitter< KeccakF1600Event > keccak_event_emitter