Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
instruction.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <cstring>
5#include <stdexcept>
6#include <variant>
7
13
15
19
20 MemoryTagWrapper() = default;
24
25 operator MemoryTag() const { return value; }
26
27 void msgpack_pack(auto& packer) const
28 {
29 uint64_t value_to_serialize = static_cast<uint64_t>(this->value);
30 packer.pack_bin(sizeof(value_to_serialize));
31 packer.pack_bin_body((char*)&value_to_serialize, sizeof(value_to_serialize)); // NOLINT
32 }
33
34 void msgpack_unpack(msgpack::object const& o)
35 {
36 // Handle binary data unpacking
37 if (o.type == msgpack::type::BIN) {
38 auto bin = o.via.bin;
39 if (bin.size == sizeof(uint64_t)) {
40 uint64_t value_to_deserialize = 0;
41 std::memcpy(&value_to_deserialize, bin.ptr, sizeof(value_to_deserialize));
42 *this = MemoryTagWrapper(static_cast<MemoryTag>(value_to_deserialize));
43 } else {
44 throw std::runtime_error("Invalid binary data size for MemoryTag");
45 }
46 }
47 }
48};
49
50enum class AddressingMode : uint8_t {
51 Direct = 0,
52 Indirect = 1,
53 Relative = 2,
55};
56
60
65
66 operator AddressingMode() const { return value; }
67
68 void msgpack_pack(auto& packer) const
69 {
70 uint8_t value_to_serialize = static_cast<uint8_t>(this->value);
71 packer.pack_bin(sizeof(value_to_serialize));
72 packer.pack_bin_body((char*)&value_to_serialize, sizeof(value_to_serialize)); // NOLINT
73 }
74
75 void msgpack_unpack(msgpack::object const& o)
76 {
77 // Handle binary data unpacking
78 if (o.type == msgpack::type::BIN) {
79 auto bin = o.via.bin;
80 if (bin.size == sizeof(uint8_t)) {
81 uint8_t value_to_deserialize = 0;
82 std::memcpy(&value_to_deserialize, bin.ptr, sizeof(value_to_deserialize));
83 *this = AddressingModeWrapper(static_cast<AddressingMode>(value_to_deserialize));
84 } else {
85 throw std::runtime_error("Invalid binary data size for AddressingMode");
86 }
87 }
88 }
89};
90
116
128
136
144
152
160
167
175
183
191
199
207
216
222
230
238
246
254
262
270
279
287
295
303
311
319
327
335
342
350
358
366
374
382
390
396
404
412
421
430
438
441 uint16_t slot_index; // index of the slot in memory_manager.storage_addresses
442 ResultAddressRef slot_address; // address where we set slot value
445};
446
450 // msgpack cannot pack enum classes, so we pack that as a uint8_t
451 // 0 -> ADDRESS, 1 -> SENDER, 2 -> TRANSACTIONFEE, 3 -> CHAINID, 4 -> VERSION, 5 -> BLOCKNUMBER, 6 -> TIMESTAMP,
452 // 7 -> BASEFEEPERDAGAS, 8 -> BASEFEEPERL2GAS, 9 -> ISSTATICCALL, 10 -> L2GASLEFT, 11 -> DAGASLEFT
453 uint8_t type;
455};
456
462
472
479
486 // index of the note hash in the memory_manager.emitted_note_hashes
488 // absolute address where the note hash will be stored
490 // absolute address where the leaf index will be stored
492 // absolute address where the result will be stored
495};
496
507
554
555template <class... Ts> struct overloaded_instruction : Ts... {
556 using Ts::operator()...;
557};
558template <class... Ts> overloaded_instruction(Ts...) -> overloaded_instruction<Ts...>;
559
560inline std::ostream& operator<<(std::ostream& os, const MemoryTag& tag)
561{
562 os << std::to_string(tag);
563 return os;
564}
565
566inline std::ostream& operator<<(std::ostream& os, const AddressRef& address)
567{
568 os << "AddressRef " << address.tag << " " << address.index << " " << address.base_offset << " "
569 << static_cast<int>(static_cast<AddressingMode>(address.mode));
570 return os;
571}
572
573inline std::ostream& operator<<(std::ostream& os, const ResultAddressRef& result_address)
574{
575 os << "ResultAddressRef " << result_address.address << " "
576 << static_cast<int>(static_cast<AddressingMode>(result_address.mode));
577 return os;
578}
579
580inline std::ostream& operator<<(std::ostream& os, const FuzzInstruction& instruction)
581{
582 std::visit(
584 [&](ADD_8_Instruction arg) {
585 os << "ADD_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
586 },
587 [&](SET_8_Instruction arg) {
588 os << "SET_8_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
589 },
590 [&](SET_16_Instruction arg) {
591 os << "SET_16_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
592 },
593 [&](SET_32_Instruction arg) {
594 os << "SET_32_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
595 },
596 [&](SET_64_Instruction arg) {
597 os << "SET_64_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
598 },
599 [&](SET_128_Instruction arg) {
600 os << "SET_128_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value_high
601 << " " << arg.value_low;
602 },
603 [&](SET_FF_Instruction arg) {
604 os << "SET_FF_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
605 },
606 [&](SUB_8_Instruction arg) {
607 os << "SUB_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
608 },
609 [&](MUL_8_Instruction arg) {
610 os << "MUL_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
611 },
612 [&](DIV_8_Instruction arg) {
613 os << "DIV_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
614 },
615 [&](FDIV_8_Instruction arg) {
616 os << "FDIV_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
617 },
618 [&](EQ_8_Instruction arg) {
619 os << "EQ_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
620 },
621 [&](LT_8_Instruction arg) {
622 os << "LT_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
623 },
624 [&](LTE_8_Instruction arg) {
625 os << "LTE_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
626 },
627 [&](AND_8_Instruction arg) {
628 os << "AND_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
629 },
630 [&](OR_8_Instruction arg) {
631 os << "OR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
632 },
633 [&](XOR_8_Instruction arg) {
634 os << "XOR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
635 },
636 [&](SHL_8_Instruction arg) {
637 os << "SHL_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
638 },
639 [&](SHR_8_Instruction arg) {
640 os << "SHR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
641 },
642 [&](NOT_8_Instruction arg) { os << "NOT_8_Instruction " << arg.a_address << " " << arg.result_address; },
643 [&](ADD_16_Instruction arg) {
644 os << "ADD_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
645 },
646 [&](SUB_16_Instruction arg) {
647 os << "SUB_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
648 },
649 [&](MUL_16_Instruction arg) {
650 os << "MUL_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
651 },
652 [&](DIV_16_Instruction arg) {
653 os << "DIV_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
654 },
655 [&](FDIV_16_Instruction arg) {
656 os << "FDIV_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
657 },
658 [&](EQ_16_Instruction arg) {
659 os << "EQ_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
660 },
661 [&](LT_16_Instruction arg) {
662 os << "LT_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
663 },
664 [&](LTE_16_Instruction arg) {
665 os << "LTE_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
666 },
667 [&](AND_16_Instruction arg) {
668 os << "AND_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
669 },
670 [&](OR_16_Instruction arg) {
671 os << "OR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
672 },
673 [&](XOR_16_Instruction arg) {
674 os << "XOR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
675 },
676 [&](NOT_16_Instruction arg) { os << "NOT_16_Instruction " << arg.a_address << " " << arg.result_address; },
677 [&](SHL_16_Instruction arg) {
678 os << "SHL_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
679 },
680 [&](SHR_16_Instruction arg) {
681 os << "SHR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
682 },
683 [&](CAST_8_Instruction arg) {
684 os << "CAST_8_Instruction " << arg.src_tag << " " << arg.src_address << " " << arg.result_address << " "
685 << arg.target_tag;
686 },
687 [&](CAST_16_Instruction arg) {
688 os << "CAST_16_Instruction " << arg.src_tag << " " << arg.src_address << " " << arg.result_address
689 << " " << arg.target_tag;
690 },
691 [&](MOV_8_Instruction arg) {
692 os << "MOV_8_Instruction " << arg.value_tag << " " << arg.src_address << " " << arg.result_address;
693 },
694 [&](MOV_16_Instruction arg) {
695 os << "MOV_16_Instruction " << arg.value_tag << " " << arg.src_address << " " << arg.result_address;
696 },
697 [&](SSTORE_Instruction arg) {
698 os << "SSTORE_Instruction " << arg.src_address << " " << arg.result_address << " " << arg.slot;
699 },
700 [&](SLOAD_Instruction arg) { os << "SLOAD_Instruction " << arg.slot_address << " " << arg.result_address; },
701 [&](GETENVVAR_Instruction arg) {
702 os << "GETENVVAR_Instruction " << arg.result_address << " " << static_cast<int>(arg.type);
703 },
704 [&](EMITNULLIFIER_Instruction arg) { os << "EMITNULIFIER_Instruction " << arg.nullifier_address; },
706 os << "NULLIFIEREXISTS_Instruction " << arg.nullifier_address << " " << arg.contract_address_address
707 << " " << arg.result_address;
708 },
709 [&](EMITNOTEHASH_Instruction arg) {
710 os << "EMITNOTEHASH_Instruction " << arg.note_hash_address << " " << arg.note_hash;
711 },
713 os << "NOTEHASHEXISTS_Instruction " << arg.notehash_address << " " << arg.notehash_address << " "
714 << arg.leaf_index_address << " " << arg.result_address;
715 },
716 [&](CALLDATACOPY_Instruction arg) {
717 os << "CALLDATACOPY_Instruction " << arg.dst_address << " " << static_cast<int>(arg.copy_size) << " "
718 << arg.copy_size_address << " " << arg.cd_start_address << " " << arg.cd_start_address;
719 },
720 [&](auto) { os << "Unknown instruction"; },
721 },
723 return os;
724}
::FuzzInstruction FuzzInstruction
bb::avm2::MemoryTag MemoryTag
std::ostream & operator<<(std::ostream &os, const MemoryTag &tag)
AddressingMode
Instruction instruction
ValueTag MemoryTag
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
mem[result_offset] = mem[a_address] + mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] + mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
mem[result_offset] = mem[a_address] & mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
mem[result_offset] = mem[a_address] & mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
MemoryTagWrapper tag
uint32_t index
Index of the address in the memory_manager.stored_variables map.
uint32_t base_offset
Base offset Used for Relative/IndirectRelative modes only Sets M[0] = base_offset.
AddressingModeWrapper mode
uint16_t pointer_address
Index of the pointer in the memory_manager.stored_variables map Used for Indirect/IndirectRelative mo...
MSGPACK_FIELDS(tag, index, pointer_address, base_offset, mode)
Wrapper for AddressingMode to allow for msgpack packing and unpacking.
AddressingModeWrapper()=default
void msgpack_unpack(msgpack::object const &o)
void msgpack_pack(auto &packer) const
AddressingModeWrapper(AddressingMode v)
AddressingMode value
CALLDATACOPY: M[dstOffset:dstOffset+M[copySizeOffset]] = calldata[M[cdStartOffset]:M[cdStartOffset]+M...
ResultAddressRef dst_address
ResultAddressRef cd_start_address
ResultAddressRef copy_size_address
MSGPACK_FIELDS(dst_address, copy_size, copy_size_address, cd_start, cd_start_address)
CAST_16: cast mem[src_offset_index] to target_tag and store at dst_offset.
MSGPACK_FIELDS(src_tag, src_address, result_address, target_tag)
MemoryTagWrapper target_tag
MemoryTagWrapper src_tag
ResultAddressRef result_address
CAST_8: cast mem[src_offset_index] to target_tag and store at dst_offset.
MSGPACK_FIELDS(src_tag, src_address, result_address, target_tag)
MemoryTagWrapper src_tag
MemoryTagWrapper target_tag
ResultAddressRef result_address
mem[result_offset] = mem[a_address] / mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] / mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
EMITNOTEHASH: M[note_hash_offset] = note_hash; emit note hash to the note hash tree.
MSGPACK_FIELDS(note_hash_address, note_hash)
ResultAddressRef note_hash_address
EMITNULIFIER: inserts new nullifier to the nullifier tree.
MSGPACK_FIELDS(nullifier_address)
mem[result_offset] = mem[a_address] == mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] == mem[b_address]
AddressRef b_address
ResultAddressRef result_address
AddressRef a_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
GETENVVAR: M[result_offset] = getenvvar(type)
ResultAddressRef result_address
MSGPACK_FIELDS(result_address, type)
mem[result_offset] = mem[a_address] < mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] < mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef a_address
ResultAddressRef result_address
AddressRef b_address
mem[result_offset] = mem[a_address] <= mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] <= mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
MOV_16 instruction: mem[dst_offset] = mem[src_offset].
ResultAddressRef result_address
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, src_address, result_address)
MOV_8 instruction: mem[dst_offset] = mem[src_offset].
MemoryTagWrapper value_tag
AddressRef src_address
MSGPACK_FIELDS(value_tag, src_address, result_address)
ResultAddressRef result_address
mem[result_offset] = mem[a_address] * mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] * mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
Wrapper for MemoryTag to allow for msgpack packing and unpacking.
MemoryTagWrapper(MemoryTag v)
MemoryTagWrapper()=default
void msgpack_pack(auto &packer) const
void msgpack_unpack(msgpack::object const &o)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, result_address)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, result_address)
NOTEHASHEXISTS: M[result_offset] = NOTEHASHEXISTS(M[notehash_offset], M[leaf_index_offset]) len = len...
ResultAddressRef leaf_index_address
ResultAddressRef result_address
MSGPACK_FIELDS(notehash_index, notehash_address, leaf_index_address, result_address)
ResultAddressRef notehash_address
NULLIFIEREXISTS: checks if nullifier exists in the nullifier tree Gets contract's address by GETENVVA...
ResultAddressRef result_address
ResultAddressRef contract_address_address
MSGPACK_FIELDS(nullifier_address, contract_address_address, result_address)
mem[result_offset] = mem[a_address] | mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] | mem[b_address]
AddressRef b_address
AddressRef a_address
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MSGPACK_FIELDS(address, pointer_address, base_offset, mode)
AddressingModeWrapper mode
uint32_t base_offset
Base offset used for Relative/IndirectRelative modes only.
uint16_t pointer_address
Pointer address used for Indirect/IndirectRelative modes only.
SET_128 instruction.
MSGPACK_FIELDS(value_tag, result_address, value_low, value_high)
MemoryTagWrapper value_tag
ResultAddressRef result_address
SET_16 instruction.
ResultAddressRef result_address
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
SET_32 instruction.
MSGPACK_FIELDS(value_tag, result_address, value)
ResultAddressRef result_address
MemoryTagWrapper value_tag
SET_64 instruction.
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
ResultAddressRef result_address
SET_8 instruction.
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, result_address, value)
ResultAddressRef result_address
SET_FF instruction.
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
ResultAddressRef result_address
mem[result_offset] = mem[a_address] << mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] << mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
mem[result_offset] = mem[a_address] >> mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] >> mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
ResultAddressRef result_address
SLOAD: M[slot_offset] = slot; M[result_offset] = S[M[slotOffset]].
ResultAddressRef result_address
MSGPACK_FIELDS(slot_index, slot_address, result_address)
ResultAddressRef slot_address
SSTORE: M[slot_offset_index] = slot; S[M[slotOffset]] = M[srcOffset].
ResultAddressRef result_address
MSGPACK_FIELDS(src_address, result_address, slot)
mem[result_offset] = mem[a_address] - mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] - mem[b_address]
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] ^ mem[b_address] (16-bit)
ResultAddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] ^ mem[b_address]
MemoryTagWrapper argument_tag
ResultAddressRef result_address
MSGPACK_FIELDS(argument_tag, a_address, b_address, result_address)