19using simulation::PublicDataTreeReadWriteEvent;
23struct EventWithDiscard {
24 simulation::PublicDataTreeReadWriteEvent
event;
31 TraceContainer&
trace)
40 for (
size_t i = 0; i < events_with_metadata.size(); i++) {
41 bool end = i == events_with_metadata.size() - 1;
42 const auto&
event = events_with_metadata[i].event;
43 const bool discard = events_with_metadata[i].discard;
45 bool exists =
event.low_leaf_preimage.leaf.slot ==
event.leaf_slot;
46 FF slot_low_leaf_slot_diff =
event.leaf_slot -
event.low_leaf_preimage.leaf.slot;
48 bool next_slot_is_nonzero =
false;
51 next_slot_is_nonzero =
event.low_leaf_preimage.nextKey != 0;
52 next_slot =
event.low_leaf_preimage.nextKey;
55 bool write =
event.write_data.has_value();
58 bool protocol_write =
event.execution_id == std::numeric_limits<uint32_t>::max();
61 bool should_write_to_public_inputs =
62 nondiscarded_write && first_write_per_slot.at(
event.leaf_slot) ==
event.execution_id;
63 FF final_value = nondiscarded_write ? last_value_per_slot.at(
event.leaf_slot) : 0;
65 FF intermediate_root = 0;
67 FF updated_low_leaf_hash = 0;
69 AppendOnlyTreeSnapshot next_snapshot =
event.prev_snapshot;
72 next_snapshot =
event.write_data->next_snapshot;
73 intermediate_root =
event.write_data->intermediate_root;
74 updated_low_leaf =
event.write_data->updated_low_leaf_preimage;
75 updated_low_leaf_hash =
event.write_data->updated_low_leaf_hash;
76 new_leaf_hash =
event.write_data->new_leaf_hash;
78 uint32_t clk =
event.execution_id;
79 uint32_t clk_diff = end ? 0 : events_with_metadata[i + 1].event.execution_id - clk;
81 uint32_t public_data_writes_length = write_idx -
83 static_cast<uint32_t
>(should_write_to_public_inputs);
87 { C::public_data_check_sel, 1 },
88 { C::public_data_check_not_end, !end },
89 { C::public_data_check_end, end },
90 { C::public_data_check_value,
event.value },
91 { C::public_data_check_slot,
event.slot },
92 { C::public_data_check_root,
event.prev_snapshot.root },
93 { C::public_data_check_address,
event.contract_address },
94 { C::public_data_check_write_root, next_snapshot.root },
95 { C::public_data_check_tree_size_before_write,
event.prev_snapshot.nextAvailableLeafIndex },
96 { C::public_data_check_tree_size_after_write, next_snapshot.nextAvailableLeafIndex },
97 { C::public_data_check_write,
write },
98 { C::public_data_check_protocol_write, protocol_write },
99 { C::public_data_check_non_protocol_write,
write && !protocol_write },
100 { C::public_data_check_clk, clk },
101 { C::public_data_check_discard,
discard },
102 { C::public_data_check_low_leaf_slot,
event.low_leaf_preimage.leaf.slot },
103 { C::public_data_check_low_leaf_value,
event.low_leaf_preimage.leaf.value },
104 { C::public_data_check_low_leaf_next_index,
event.low_leaf_preimage.nextIndex },
105 { C::public_data_check_low_leaf_next_slot,
event.low_leaf_preimage.nextKey },
106 { C::public_data_check_updated_low_leaf_value, updated_low_leaf.leaf.value },
107 { C::public_data_check_updated_low_leaf_next_index, updated_low_leaf.nextIndex },
108 { C::public_data_check_updated_low_leaf_next_slot, updated_low_leaf.nextKey },
109 { C::public_data_check_low_leaf_index,
event.low_leaf_index },
110 { C::public_data_check_clk_diff_lo,
static_cast<uint16_t
>(clk_diff) },
111 { C::public_data_check_clk_diff_hi, clk_diff >> 16 },
112 { C::public_data_check_leaf_slot,
event.leaf_slot },
114 { C::public_data_check_leaf_not_exists, !
exists },
115 { C::public_data_check_leaf_slot_low_leaf_slot_diff_inv,
116 slot_low_leaf_slot_diff },
117 { C::public_data_check_next_slot_is_nonzero, next_slot_is_nonzero },
118 { C::public_data_check_next_slot_inv, next_slot },
119 { C::public_data_check_low_leaf_hash,
event.low_leaf_hash },
120 { C::public_data_check_intermediate_root, intermediate_root },
122 { C::public_data_check_const_two, 2 },
123 { C::public_data_check_updated_low_leaf_hash, updated_low_leaf_hash },
124 { C::public_data_check_should_insert, should_insert },
125 { C::public_data_check_new_leaf_hash, new_leaf_hash },
126 { C::public_data_check_write_idx, write_idx },
127 { C::public_data_check_non_discarded_write, nondiscarded_write },
128 { C::public_data_check_should_write_to_public_inputs, should_write_to_public_inputs },
129 { C::public_data_check_final_value, final_value },
130 { C::public_data_check_public_data_writes_length, public_data_writes_length },
131 { C::public_data_check_length_pi_idx,
135 if (should_write_to_public_inputs) {
144 TraceContainer&
trace)
151 for (
size_t i = 0; i < nondiscarded_writes.size(); i++) {
152 bool end = i == nondiscarded_writes.size() - 1;
153 const auto&
event = nondiscarded_writes[i];
155 uint32_t clk =
event.execution_id;
157 bool leaf_slot_increase =
false;
158 bool check_clock =
false;
159 uint32_t clk_diff = 0;
162 const auto& next_event = nondiscarded_writes[i + 1];
164 if (
event.leaf_slot == next_event.leaf_slot) {
165 assert(
event.execution_id < next_event.execution_id);
166 clk_diff = next_event.execution_id -
event.execution_id;
170 leaf_slot_increase =
true;
174 bool should_write_to_public_inputs = first_write_per_slot.at(
event.leaf_slot) ==
event.execution_id;
175 FF final_value = last_value_per_slot.at(
event.leaf_slot);
179 { C::public_data_squash_sel, 1 },
180 { C::public_data_squash_leaf_slot,
event.leaf_slot },
181 { C::public_data_squash_value,
event.value },
182 { C::public_data_squash_clk, clk },
183 { C::public_data_squash_write_to_public_inputs, should_write_to_public_inputs },
184 { C::public_data_squash_leaf_slot_increase, leaf_slot_increase },
185 { C::public_data_squash_check_clock, check_clock },
186 { C::public_data_squash_clk_diff_lo,
static_cast<uint16_t
>(clk_diff) },
187 { C::public_data_squash_clk_diff_hi, clk_diff >> 16 },
188 { C::public_data_squash_final_value, final_value },
204 events_with_metadata.reserve(events.size());
208 if (!first_write_per_slot.contains(event.leaf_slot)) {
209 first_write_per_slot[event.leaf_slot] = event.execution_id;
211 last_value_per_slot[
event.leaf_slot] =
event.value;
216 std::ranges::sort(events_with_metadata.begin(),
217 events_with_metadata.end(),
218 [](
const EventWithDiscard&
a,
const EventWithDiscard&
b) {
219 return a.event.execution_id < b.event.execution_id;
222 process_public_data_tree_check_trace(events_with_metadata, first_write_per_slot, last_value_per_slot,
trace);
225 nondiscarded_writes.reserve(events_with_metadata.size());
227 for (
const auto& event_with_metadata : events_with_metadata) {
228 if (event_with_metadata.event.write_data.has_value() && !event_with_metadata.discard) {
229 nondiscarded_writes.push_back(event_with_metadata.event);
234 std::ranges::sort(nondiscarded_writes.begin(),
235 nondiscarded_writes.end(),
236 [](
const PublicDataTreeReadWriteEvent&
a,
const PublicDataTreeReadWriteEvent&
b) {
237 if (a.leaf_slot == b.leaf_slot) {
238 return a.execution_id < b.execution_id;
243 process_squashing_trace(nondiscarded_writes, first_write_per_slot, last_value_per_slot,
trace);
247 { { Column::public_data_check_leaf_slot_low_leaf_slot_diff_inv, Column::public_data_check_next_slot_inv } });
251 InteractionDefinition()
254 .add<lookup_public_data_check_low_leaf_slot_validation_settings, InteractionType::LookupGeneric>()
256 .add<lookup_public_data_check_low_leaf_poseidon2_0_settings, InteractionType::LookupGeneric>()
258 .add<lookup_public_data_check_updated_low_leaf_poseidon2_0_settings, InteractionType::LookupGeneric>()
260 .add<lookup_public_data_check_low_leaf_merkle_check_settings, InteractionType::LookupGeneric>()
262 .add<lookup_public_data_check_new_leaf_poseidon2_1_settings, InteractionType::LookupGeneric>()
264 .add<InteractionType::MultiPermutation, perm_sstore_storage_write_settings, perm_tx_balance_update_settings>(
265 Column::public_data_check_write)
268 InteractionType::LookupIntoIndexedByClk>()
270 .add<lookup_public_data_squash_clk_diff_range_lo_settings, InteractionType::LookupIntoIndexedByClk>()
272 .add<lookup_public_data_check_clk_diff_range_lo_settings, InteractionType::LookupIntoIndexedByClk>()
275 InteractionType::LookupIntoIndexedByClk>();
#define GENERATOR_INDEX__PUBLIC_LEAF_INDEX
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_PUBLIC_DATA_WRITES_ROW_IDX
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_DATA_WRITES_ROW_IDX
#define PUBLIC_DATA_TREE_HEIGHT
std::vector< Event > Container
InteractionDefinition & add(auto &&... args)
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::PublicDataTreeCheckEvent >::Container &events, TraceContainer &trace)
void invert_columns(std::span< const Column > cols)
void set(Column col, uint32_t row, const FF &value)
IndexedLeaf< PublicDataLeafValue > PublicDataTreeLeafPreimage
void process_with_discard(const std::vector< std::variant< EventType, simulation::CheckPointEventType > > &events, ProcessEventFn &&process_event)
permutation_settings< perm_public_data_check_squashing_settings_ > perm_public_data_check_squashing_settings
lookup_settings< lookup_public_data_check_low_leaf_next_slot_validation_settings_ > lookup_public_data_check_low_leaf_next_slot_validation_settings
lookup_settings< lookup_public_data_check_new_leaf_merkle_check_settings_ > lookup_public_data_check_new_leaf_merkle_check_settings
lookup_settings< lookup_public_data_check_updated_low_leaf_poseidon2_1_settings_ > lookup_public_data_check_updated_low_leaf_poseidon2_1_settings
lookup_settings< lookup_public_data_check_silo_poseidon2_settings_ > lookup_public_data_check_silo_poseidon2_settings
lookup_settings< lookup_public_data_check_write_writes_length_to_public_inputs_settings_ > lookup_public_data_check_write_writes_length_to_public_inputs_settings
lookup_settings< lookup_public_data_check_new_leaf_poseidon2_0_settings_ > lookup_public_data_check_new_leaf_poseidon2_0_settings
lookup_settings< lookup_public_data_squash_clk_diff_range_hi_settings_ > lookup_public_data_squash_clk_diff_range_hi_settings
lookup_settings< lookup_public_data_check_write_public_data_to_public_inputs_settings_ > lookup_public_data_check_write_public_data_to_public_inputs_settings
lookup_settings< lookup_public_data_check_low_leaf_poseidon2_1_settings_ > lookup_public_data_check_low_leaf_poseidon2_1_settings
lookup_settings< lookup_public_data_check_clk_diff_range_hi_settings_ > lookup_public_data_check_clk_diff_range_hi_settings
lookup_settings< lookup_public_data_squash_leaf_slot_increase_ff_gt_settings_ > lookup_public_data_squash_leaf_slot_increase_ff_gt_settings
void write(std::vector< uint8_t > &buf, ClientIVC::VerificationKey const &vk)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
simulation::PublicDataTreeReadWriteEvent event
static IndexedLeaf< PublicDataLeafValue > empty()