Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
instruction.cpp
Go to the documentation of this file.
2
10
15
17{
19 auto index = generate_random_uint32(rng);
23 return AddressRef{
24 .tag = tag, .index = index, .pointer_address = pointer_address, .base_offset = base_offset, .mode = mode
25 };
26}
27
38
40{
42 // forgive me
43 switch (option) {
46 .b_address = generate_address_ref(rng),
47 .result_address = generate_result_address_ref(rng) };
50 .b_address = generate_address_ref(rng),
51 .result_address = generate_result_address_ref(rng) };
54 .b_address = generate_address_ref(rng),
55 .result_address = generate_result_address_ref(rng) };
58 .b_address = generate_address_ref(rng),
59 .result_address = generate_result_address_ref(rng) };
62 .b_address = generate_address_ref(rng),
63 .result_address = generate_result_address_ref(rng) };
66 .b_address = generate_address_ref(rng),
67 .result_address = generate_result_address_ref(rng) };
70 .b_address = generate_address_ref(rng),
71 .result_address = generate_result_address_ref(rng) };
74 .b_address = generate_address_ref(rng),
75 .result_address = generate_result_address_ref(rng) };
78 .b_address = generate_address_ref(rng),
79 .result_address = generate_result_address_ref(rng) };
82 .b_address = generate_address_ref(rng),
83 .result_address = generate_result_address_ref(rng) };
86 .b_address = generate_address_ref(rng),
87 .result_address = generate_result_address_ref(rng) };
88
91 .b_address = generate_address_ref(rng),
92 .result_address = generate_result_address_ref(rng) };
95 .result_address = generate_result_address_ref(rng),
96 .value = generate_random_uint8(rng) };
99 .result_address = generate_result_address_ref(rng),
100 .value = generate_random_uint16(rng) };
103 .result_address = generate_result_address_ref(rng),
104 .value = generate_random_uint32(rng) };
107 .result_address = generate_result_address_ref(rng),
108 .value = generate_random_uint64(rng) };
111 .result_address = generate_result_address_ref(rng),
112 .value_low = generate_random_uint64(rng),
113 .value_high = generate_random_uint64(rng) };
116 .result_address = generate_result_address_ref(rng),
117 .value = generate_random_field(rng) };
120 .b_address = generate_address_ref(rng),
121 .result_address = generate_result_address_ref(rng) };
124 .b_address = generate_address_ref(rng),
125 .result_address = generate_result_address_ref(rng) };
128 .b_address = generate_address_ref(rng),
129 .result_address = generate_result_address_ref(rng) };
132 .b_address = generate_address_ref(rng),
133 .result_address = generate_result_address_ref(rng) };
136 .b_address = generate_address_ref(rng),
137 .result_address = generate_result_address_ref(rng) };
140 .b_address = generate_address_ref(rng),
141 .result_address = generate_result_address_ref(rng) };
144 .b_address = generate_address_ref(rng),
145 .result_address = generate_result_address_ref(rng) };
148 .b_address = generate_address_ref(rng),
149 .result_address = generate_result_address_ref(rng) };
152 .b_address = generate_address_ref(rng),
153 .result_address = generate_result_address_ref(rng) };
156 .b_address = generate_address_ref(rng),
157 .result_address = generate_result_address_ref(rng) };
160 .b_address = generate_address_ref(rng),
161 .result_address = generate_result_address_ref(rng) };
164 .result_address = generate_result_address_ref(rng) };
167 .b_address = generate_address_ref(rng),
168 .result_address = generate_result_address_ref(rng) };
171 .b_address = generate_address_ref(rng),
172 .result_address = generate_result_address_ref(rng) };
175 .result_address = generate_result_address_ref(rng),
179 .result_address = generate_result_address_ref(rng),
183 .result_address = generate_result_address_ref(rng),
184 .slot = generate_random_field(rng) };
187 .slot_address = generate_result_address_ref(rng),
188 .result_address = generate_result_address_ref(rng) };
191 .type = generate_random_uint8(rng) };
196 .contract_address_address = generate_result_address_ref(rng),
197 .result_address = generate_result_address_ref(rng) };
200 .note_hash = generate_random_field(rng) };
203 .notehash_address = generate_result_address_ref(rng),
204 .leaf_index_address = generate_result_address_ref(rng),
205 .result_address = generate_result_address_ref(rng) };
208 .copy_size = generate_random_uint8(rng),
209 .copy_size_address = generate_result_address_ref(rng),
210 .cd_start = generate_random_uint16(rng),
211 .cd_start_address = generate_result_address_ref(rng) };
212 }
213}
214
217{
219 switch (option) {
221 if (default_tag.has_value()) {
222 mutate_or_default_tag(address.tag.value, rng, default_tag.value());
223 } else {
225 }
226 break;
229 break;
232 break;
235 break;
238 break;
239 }
240}
241
260
261template <typename BinaryInstructionType>
277
278template <typename BinaryInstructionType>
294
308
325
342
359
376
396
413
427
444
461
478
495
509
511{
512 // emitnulifier only has one field
513
514 mutate_address_ref(instruction.nullifier_address, rng, MemoryTag::FF);
515}
516
533
566
589
591{
592 std::visit(overloaded_instruction{
593 [&rng](ADD_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
594 [&rng](SUB_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
595 [&rng](MUL_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
596 [&rng](DIV_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
597 [&rng](EQ_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
598 [&rng](LT_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
599 [&rng](LTE_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
600 [&rng](AND_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
601 [&rng](OR_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
602 [&rng](XOR_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
603 [&rng](SHL_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
604 [&rng](SHR_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
605 [&rng](SET_8_Instruction& instr) { mutate_set_8_instruction(instr, rng); },
606 [&rng](SET_16_Instruction& instr) { mutate_set_16_instruction(instr, rng); },
607 [&rng](SET_32_Instruction& instr) { mutate_set_32_instruction(instr, rng); },
608 [&rng](SET_64_Instruction& instr) { mutate_set_64_instruction(instr, rng); },
609 [&rng](SET_128_Instruction& instr) { mutate_set_128_instruction(instr, rng); },
610 [&rng](SET_FF_Instruction& instr) { mutate_set_ff_instruction(instr, rng); },
611 [&rng](FDIV_8_Instruction& instr) { mutate_binary_instruction_8(instr, rng); },
612 [&rng](NOT_8_Instruction& instr) { mutate_not_8_instruction(instr, rng); },
613 [&rng](ADD_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
614 [&rng](SUB_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
615 [&rng](MUL_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
616 [&rng](DIV_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
617 [&rng](FDIV_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
618 [&rng](EQ_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
619 [&rng](LT_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
620 [&rng](LTE_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
621 [&rng](AND_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
622 [&rng](OR_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
623 [&rng](XOR_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
624 [&rng](NOT_16_Instruction& instr) { mutate_not_16_instruction(instr, rng); },
625 [&rng](SHL_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
626 [&rng](SHR_16_Instruction& instr) { mutate_binary_instruction_16(instr, rng); },
627 [&rng](CAST_8_Instruction& instr) { mutate_cast_8_instruction(instr, rng); },
628 [&rng](CAST_16_Instruction& instr) { mutate_cast_16_instruction(instr, rng); },
629 [&rng](SSTORE_Instruction& instr) { mutate_sstore_instruction(instr, rng); },
630 [&rng](SLOAD_Instruction& instr) { mutate_sload_instruction(instr, rng); },
631 [&rng](GETENVVAR_Instruction& instr) { mutate_getenvvar_instruction(instr, rng); },
632 [&rng](EMITNULLIFIER_Instruction& instr) { mutate_emit_nullifier_instruction(instr, rng); },
634 [&rng](EMITNOTEHASH_Instruction& instr) { mutate_emit_note_hash_instruction(instr, rng); },
636 [&rng](CALLDATACOPY_Instruction& instr) { mutate_calldatacopy_instruction(instr, rng); },
637 [](auto&) { throw std::runtime_error("Unknown instruction"); } },
639}
::FuzzInstruction FuzzInstruction
FF generate_random_field(std::mt19937_64 &rng)
Definition field.cpp:23
void mutate_field(bb::avm2::FF &value, std::mt19937_64 &rng, const FieldMutationConfig &config)
Definition field.cpp:54
T select(std::mt19937_64 &rng) const
Set32MutationOptions
constexpr Set128MutationConfig BASIC_SET_128_MUTATION_CONFIGURATION
constexpr AddressRefMutationConfig BASIC_ADDRESS_REF_MUTATION_CONFIGURATION
Set64MutationOptions
constexpr SLoadMutationConfig BASIC_SLOAD_MUTATION_CONFIGURATION
constexpr GetEnvVarMutationConfig BASIC_GETENVVAR_MUTATION_CONFIGURATION
constexpr Set16MutationConfig BASIC_SET_16_MUTATION_CONFIGURATION
constexpr NoteHashExistsMutationConfig BASIC_NOTEHASHEXISTS_MUTATION_CONFIGURATION
NoteHashExistsMutationOptions
constexpr Set64MutationConfig BASIC_SET_64_MUTATION_CONFIGURATION
EmitNoteHashMutationOptions
SetFFMutationOptions
constexpr MemoryTagGenerationConfig BASIC_MEMORY_TAG_GENERATION_CONFIGURATION
constexpr Uint64MutationConfig BASIC_UINT64_T_MUTATION_CONFIGURATION
Set8MutationOptions
Set16MutationOptions
constexpr CalldataCopyMutationConfig BASIC_CALLDATACOPY_MUTATION_CONFIGURATION
InstructionGenerationOptions
constexpr Uint32MutationConfig BASIC_UINT32_T_MUTATION_CONFIGURATION
constexpr UnaryInstruction8MutationConfig BASIC_UNARY_INSTRUCTION_8_MUTATION_CONFIGURATION
SStoreMutationOptions
constexpr SetFFMutationConfig BASIC_SET_FF_MUTATION_CONFIGURATION
constexpr Set32MutationConfig BASIC_SET_32_MUTATION_CONFIGURATION
constexpr FieldMutationConfig BASIC_FIELD_MUTATION_CONFIGURATION
UnaryInstruction8MutationOptions
constexpr BinaryInstruction8MutationConfig BASIC_BINARY_INSTRUCTION_8_MUTATION_CONFIGURATION
constexpr Uint16MutationConfig BASIC_UINT16_T_MUTATION_CONFIGURATION
constexpr SStoreMutationConfig BASIC_SSTORE_MUTATION_CONFIGURATION
CalldataCopyMutationOptions
constexpr NullifierExistsMutationConfig BASIC_NULLIFIER_EXISTS_MUTATION_CONFIGURATION
ResultAddressRefMutationOptions
Set128MutationOptions
constexpr EmitNoteHashMutationConfig BASIC_EMITNOTEHASH_MUTATION_CONFIGURATION
constexpr MemoryTagMutationConfig BASIC_MEMORY_TAG_MUTATION_CONFIGURATION
SLoadMutationOptions
constexpr ResultAddressRefMutationConfig BASIC_RESULT_ADDRESS_REF_MUTATION_CONFIGURATION
constexpr Uint8MutationConfig BASIC_UINT8_T_MUTATION_CONFIGURATION
constexpr InstructionGenerationConfig BASIC_INSTRUCTION_GENERATION_CONFIGURATION
GetEnvVarMutationOptions
AddressRefMutationOptions
BinaryInstruction8MutationOptions
constexpr Set8MutationConfig BASIC_SET_8_MUTATION_CONFIGURATION
NullifierExistsMutationOptions
AddressingMode
Instruction instruction
void mutate_set_128_instruction(SET_128_Instruction &instruction, std::mt19937_64 &rng)
void mutate_cast_16_instruction(CAST_16_Instruction &instruction, std::mt19937_64 &rng)
void mutate_not_8_instruction(NOT_8_Instruction &instruction, std::mt19937_64 &rng)
void mutate_binary_instruction_16(BinaryInstructionType &instruction, std::mt19937_64 &rng)
void mutate_not_16_instruction(NOT_16_Instruction &instruction, std::mt19937_64 &rng)
void mutate_note_hash_exists_instruction(NOTEHASHEXISTS_Instruction &instruction, std::mt19937_64 &rng)
void mutate_sload_instruction(SLOAD_Instruction &instruction, std::mt19937_64 &rng)
AddressingMode generate_addressing_mode(std::mt19937_64 &rng)
void mutate_instruction(FuzzInstruction &instruction, std::mt19937_64 &rng)
void mutate_binary_instruction_8(BinaryInstructionType &instruction, std::mt19937_64 &rng)
void mutate_cast_8_instruction(CAST_8_Instruction &instruction, std::mt19937_64 &rng)
void mutate_set_32_instruction(SET_32_Instruction &instruction, std::mt19937_64 &rng)
void mutate_calldatacopy_instruction(CALLDATACOPY_Instruction &instruction, std::mt19937_64 &rng)
void mutate_set_16_instruction(SET_16_Instruction &instruction, std::mt19937_64 &rng)
void mutate_emit_note_hash_instruction(EMITNOTEHASH_Instruction &instruction, std::mt19937_64 &rng)
void mutate_address_ref(AddressRef &address, std::mt19937_64 &rng, std::optional< MemoryTag > default_tag)
Most of the tags will be equal to the default tag.
AddressRef generate_address_ref(std::mt19937_64 &rng)
FuzzInstruction generate_instruction(std::mt19937_64 &rng)
void mutate_emit_nullifier_instruction(EMITNULLIFIER_Instruction &instruction, std::mt19937_64 &rng)
void mutate_result_address_ref(ResultAddressRef &address, std::mt19937_64 &rng)
void mutate_nullifier_exists_instruction(NULLIFIEREXISTS_Instruction &instruction, std::mt19937_64 &rng)
void mutate_set_64_instruction(SET_64_Instruction &instruction, std::mt19937_64 &rng)
void mutate_set_ff_instruction(SET_FF_Instruction &instruction, std::mt19937_64 &rng)
void mutate_set_8_instruction(SET_8_Instruction &instruction, std::mt19937_64 &rng)
void mutate_sstore_instruction(SSTORE_Instruction &instruction, std::mt19937_64 &rng)
ResultAddressRef generate_result_address_ref(std::mt19937_64 &rng)
void mutate_getenvvar_instruction(GETENVVAR_Instruction &instruction, std::mt19937_64 &rng)
MemoryTag generate_memory_tag(std::mt19937_64 &rng, const MemoryTagGenerationConfig &config)
Definition memory_tag.cpp:8
void mutate_or_default_tag(MemoryTag &value, std::mt19937_64 &rng, MemoryTag default_tag, double probability=0.1)
Mutate the memory tag or set to the chosen tag with a given probability.
void mutate_memory_tag(MemoryTag &value, std::mt19937_64 &rng, const MemoryTagMutationConfig &config)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
mem[result_offset] = mem[a_address] + mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] + mem[b_address]
mem[result_offset] = mem[a_address] & mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] & mem[b_address]
MemoryTagWrapper tag
CALLDATACOPY: M[dstOffset:dstOffset+M[copySizeOffset]] = calldata[M[cdStartOffset]:M[cdStartOffset]+M...
ResultAddressRef dst_address
CAST_16: cast mem[src_offset_index] to target_tag and store at dst_offset.
CAST_8: cast mem[src_offset_index] to target_tag and store at dst_offset.
mem[result_offset] = mem[a_address] / mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] / mem[b_address]
EMITNOTEHASH: M[note_hash_offset] = note_hash; emit note hash to the note hash tree.
ResultAddressRef note_hash_address
EMITNULIFIER: inserts new nullifier to the nullifier tree.
mem[result_offset] = mem[a_address] == mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] == mem[b_address]
AddressRef a_address
GETENVVAR: M[result_offset] = getenvvar(type)
ResultAddressRef result_address
mem[result_offset] = mem[a_address] < mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] < mem[b_address]
AddressRef a_address
mem[result_offset] = mem[a_address] <= mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] <= mem[b_address]
mem[result_offset] = mem[a_address] * mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] * mem[b_address]
NOTEHASHEXISTS: M[result_offset] = NOTEHASHEXISTS(M[notehash_offset], M[leaf_index_offset]) len = len...
NULLIFIEREXISTS: checks if nullifier exists in the nullifier tree Gets contract's address by GETENVVA...
mem[result_offset] = mem[a_address] | mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] | mem[b_address]
AddressRef a_address
SET_128 instruction.
MemoryTagWrapper value_tag
SET_16 instruction.
MemoryTagWrapper value_tag
SET_32 instruction.
MemoryTagWrapper value_tag
SET_64 instruction.
MemoryTagWrapper value_tag
SET_8 instruction.
MemoryTagWrapper value_tag
SET_FF instruction.
MemoryTagWrapper value_tag
mem[result_offset] = mem[a_address] << mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] << mem[b_address]
mem[result_offset] = mem[a_address] >> mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] >> mem[b_address]
SLOAD: M[slot_offset] = slot; M[result_offset] = S[M[slotOffset]].
SSTORE: M[slot_offset_index] = slot; S[M[slotOffset]] = M[srcOffset].
mem[result_offset] = mem[a_address] - mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] - mem[b_address]
mem[result_offset] = mem[a_address] ^ mem[b_address] (16-bit)
mem[result_offset] = mem[a_address] ^ mem[b_address]
void mutate_uint16_t(uint16_t &value, std::mt19937_64 &rng, const Uint16MutationConfig &config)
Definition uint16_t.cpp:4
void mutate_uint32_t(uint32_t &value, std::mt19937_64 &rng, const Uint32MutationConfig &config)
Definition uint32_t.cpp:4
void mutate_uint64_t(uint64_t &value, std::mt19937_64 &rng, const Uint64MutationConfig &config)
Definition uint64_t.cpp:4
void mutate_uint8_t(uint8_t &value, std::mt19937_64 &rng, const Uint8MutationConfig &config)
Definition uint8_t.cpp:4
uint64_t generate_random_uint64(std::mt19937_64 &rng)
uint32_t generate_random_uint32(std::mt19937_64 &rng)
uint16_t generate_random_uint16(std::mt19937_64 &rng)
uint8_t generate_random_uint8(std::mt19937_64 &rng)