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
17
18#include <cstdint>
19#include <gmock/gmock.h>
20
21namespace bb::avm2::testing {
22
35
37 const std::function<void(MemorySimulator&, size_t)>& memory_init_fn,
38 const std::vector<MemoryAddress>& dst_addresses,
39 const std::vector<MemoryAddress>& src_addresses,
40 bool expect_error,
41 uint32_t space_id)
42{
43 KeccakF1600TraceBuilder keccak_builder;
44 BitwiseTraceBuilder bitwise_builder;
47 MemoryTraceBuilder memory_builder;
48
52 EventEmitter<simulation::MemoryEvent> memory_event_emitter;
55 BitwiseSimulator bitwise_simulator(bitwise_event_emitter);
56 KeccakSimulator keccak_simulator(
57 execution_id_manager, keccak_event_emitter, bitwise_simulator, range_check_simulator);
58 MemorySimulator memory_simulator(space_id, range_check_simulator, execution_id_manager, memory_event_emitter);
59
60 for (size_t i = 0; i < src_addresses.size(); i++) {
61 memory_init_fn(memory_simulator, i);
62 if (expect_error) {
63 ASSERT_THROW(keccak_simulator.permutation(memory_simulator, dst_addresses.at(i), src_addresses.at(i)),
65 } else {
66 keccak_simulator.permutation(memory_simulator, dst_addresses.at(i), src_addresses.at(i));
67 }
68 }
69
70 const auto keccak_events = keccak_event_emitter.dump_events();
71
72 keccak_builder.process_permutation(keccak_events, trace);
73 keccak_builder.process_memory_slices(keccak_events, trace);
74 bitwise_builder.process(bitwise_event_emitter.dump_events(), trace);
76 memory_builder.process(memory_event_emitter.dump_events(), trace);
79 3 * AVM_KECCAKF1600_STATE_SIZE * static_cast<uint32_t>(src_addresses.size()));
80}
81
83 const std::vector<MemoryAddress>& dst_addresses,
84 const std::vector<MemoryAddress>& src_addresses,
85 uint32_t space_id)
86{
88 trace,
89 [&](MemorySimulator& memory_simulator, size_t i) {
90 // Write in memory first to fill source values in memory.
91 // Arbitrary values: 100 * i + j * 2^32 + k
92 for (size_t j = 0; j < 5; j++) {
93 for (size_t k = 0; k < 5; k++) {
94 memory_simulator.set(src_addresses[i] + static_cast<MemoryAddress>((5 * j) + k),
95 MemoryValue::from<uint64_t>((static_cast<uint64_t>(j) << 32) + k + (100 * i)));
96 }
97 }
98 },
99 dst_addresses,
100 src_addresses,
101 false,
102 space_id);
103}
104
106 MemoryAddress dst_address,
107 MemoryAddress src_address,
108 size_t error_offset,
109 MemoryTag error_tag,
110 uint32_t space_id)
111{
113 trace,
114 [&](MemorySimulator& memory_simulator, size_t) {
115 // Write in memory first to fill source values in memory.
116 // Arbitrary values: 100 + j * 2^32 + k
117 for (size_t j = 0; j < 5; j++) {
118 for (size_t k = 0; k < 5; k++) {
119 const size_t idx = (5 * j) + k;
120 if (idx == error_offset) {
121 memory_simulator.set(
122 src_address + static_cast<MemoryAddress>(idx),
123 MemoryValue::from_tag_truncating(error_tag, (static_cast<uint64_t>(j) << 32) + k + 100));
124 } else {
125 memory_simulator.set(src_address + static_cast<MemoryAddress>(idx),
126 MemoryValue::from<uint64_t>((static_cast<uint64_t>(j) << 32) + k + 100));
127 }
128 }
129 }
130 },
131 { dst_address },
132 { src_address },
133 true,
134 space_id);
135}
136
137// Helper function to generate a keccak trace with a slice error.
139 MemoryAddress dst_address,
140 MemoryAddress src_address,
141 uint32_t space_id)
142{
143 // Precondition for this trace to make sense is that the src or dst slice is out of bounds.
144 ASSERT_TRUE(src_address > AVM_HIGHEST_MEM_ADDRESS - AVM_KECCAKF1600_STATE_SIZE + 1 ||
146
148 trace,
149 [&]([[maybe_unused]] MemorySimulator& memory_simulator, size_t) {},
150 { dst_address },
151 { src_address },
152 true,
153 space_id);
154}
155
156} // 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_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_with_slice_error(TestTraceContainer &trace, MemoryAddress dst_address, MemoryAddress src_address, uint32_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, uint32_t space_id)
void generate_keccak_trace(TestTraceContainer &trace, const std::vector< MemoryAddress > &dst_addresses, const std::vector< MemoryAddress > &src_addresses, uint32_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, uint32_t space_id)
uint32_t MemoryAddress
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
NoopEventEmitter< BitwiseEvent > bitwise_event_emitter
NoopEventEmitter< KeccakF1600Event > keccak_event_emitter