Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
debug_log.cpp
Go to the documentation of this file.
2
5
6namespace bb::avm2::simulation {
7
9{
10 return this->level != DebugLogLevel::SILENT && level <= this->level;
11}
12
13std::string DebugLogger::applyStringFormatting(const std::string& formatStr, const std::span<FF>& args)
14{
15 // TODO(Alvaro): Change behavior to mimic applyStringFormatting in TS
16 std::string message_as_str;
17 message_as_str = formatStr + ": [";
18
19 // Add fields
20 for (uint32_t i = 0; i < args.size(); ++i) {
21 message_as_str += field_to_string(args[i]);
22 if (i < args.size() - 1) {
23 message_as_str += ", ";
24 }
25 }
26 message_as_str += "]";
27
28 return message_as_str;
29}
30
33 MemoryAddress level_offset,
34 MemoryAddress message_offset,
35 uint16_t message_size,
36 MemoryAddress fields_offset,
37 MemoryAddress fields_size_offset)
38{
39 // This is a workaround. Do not copy or use in other places.
40 auto unconstrained_read = [&memory](MemoryAddress offset) {
41 Memory* memory_ptr = dynamic_cast<Memory*>(&memory);
42 if (memory_ptr) {
43 // This means that we are using the event generating memory.
44 return memory_ptr->unconstrained_get(offset);
45 } else {
46 // This assumes that any other type will not generate events.
47 return memory.get(offset);
48 }
49 };
50
51 // Get the level and validate its tag
52 const auto level_value = unconstrained_read(level_offset);
53 const uint8_t level_number = level_value.as<uint8_t>();
54
55 // Get the fields size and validate its tag
56 const auto fields_size_value = unconstrained_read(fields_size_offset);
57 const uint32_t fields_size = fields_size_value.as<uint32_t>();
58
59 const uint32_t memory_reads =
60 1 /* level */ + 1 /* fields_size */ + message_size /* message */ + fields_size; /* fields */
61
62 if (memory_reads + total_memory_reads > max_memory_reads) {
63 // Unrecoverable error
64 throw std::runtime_error(
65 "Max debug log memory reads exceeded: " + std::to_string(memory_reads + total_memory_reads) + " > " +
67 }
68
69 // Read message and fields from memory
70 std::string message_as_str;
71 for (uint32_t i = 0; i < message_size; ++i) {
72 const auto message_field = unconstrained_read(message_offset + i);
73 message_as_str += static_cast<char>(static_cast<uint8_t>(message_field.as_ff()));
74 }
75 std::vector<FF> fields;
76 fields.reserve(fields_size);
77
78 // Read fields
79 for (uint32_t i = 0; i < fields_size; ++i) {
80 const auto field = unconstrained_read(fields_offset + i);
81 fields.push_back(field.as_ff());
82 }
83
84 if (!is_valid_debug_log_level(level_number)) {
85 throw std::runtime_error("Invalid debug log level: " + std::to_string(level_number));
86 }
87 const DebugLogLevel level = static_cast<DebugLogLevel>(level_number);
88
89 debug_logs.push_back({ contract_address, debug_log_level_to_string(level), message_as_str, fields });
90
91 if (isLevelEnabled(level)) {
92 log_fn("DEBUGLOG(" + debug_log_level_to_string(level) + "): " + applyStringFormatting(message_as_str, fields));
93 }
94}
95
96} // namespace bb::avm2::simulation
std::vector< DebugLog > debug_logs
Definition debug_log.hpp:49
static std::string applyStringFormatting(const std::string &formatStr, const std::span< FF > &args)
Definition debug_log.cpp:13
bool isLevelEnabled(DebugLogLevel level) const
Definition debug_log.cpp:8
void debug_log(MemoryInterface &memory, AztecAddress contract_address, MemoryAddress level_offset, MemoryAddress message_offset, uint16_t message_size, MemoryAddress fields_offset, MemoryAddress fields_size_offset) override
Definition debug_log.cpp:31
const MemoryValue & unconstrained_get(MemoryAddress index) const
Definition memory.cpp:42
ssize_t offset
Definition engine.cpp:36
bool is_valid_debug_log_level(uint8_t v)
std::string field_to_string(const FF &ff)
Definition stringify.cpp:5
uint32_t MemoryAddress
std::string debug_log_level_to_string(DebugLogLevel lvl)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
General class for prime fields see Prime field documentation["field documentation"] for general imple...