Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
nullifier_tree_check_trace.cpp
Go to the documentation of this file.
2
6
7namespace bb::avm2::tracegen {
8
10
27 TraceContainer& trace)
28{
29 using C = Column;
30
31 uint32_t row = 0;
33 FF nullifier = event.nullifier;
34 FF siloed_nullifier = event.nullifier;
35 FF address = 0;
36
37 if (event.siloing_data.has_value()) {
38 siloed_nullifier = event.siloing_data->siloed_nullifier;
39 address = event.siloing_data->address;
40 }
41
42 bool exists = event.low_leaf_preimage.leaf.nullifier == siloed_nullifier;
43 FF nullifier_low_leaf_nullifier_diff = siloed_nullifier - event.low_leaf_preimage.leaf.nullifier;
44
45 bool next_nullifier_is_nonzero = false;
46 FF next_nullifier = 0;
47 if (!exists) {
48 next_nullifier_is_nonzero = event.low_leaf_preimage.nextKey != 0;
49 next_nullifier = event.low_leaf_preimage.nextKey;
50 }
51
52 uint64_t updated_low_leaf_next_index = 0;
53 FF updated_low_leaf_next_key = 0;
54 FF updated_low_leaf_hash = 0;
55 FF new_leaf_hash = 0;
56 FF intermediate_root = 0;
57
58 bool append = event.append_data.has_value();
59 if (append) {
60 updated_low_leaf_next_key = siloed_nullifier;
61 updated_low_leaf_next_index = event.prev_snapshot.next_available_leaf_index;
62 updated_low_leaf_hash = event.append_data->updated_low_leaf_hash;
63 new_leaf_hash = event.append_data->new_leaf_hash;
64 intermediate_root = event.append_data->intermediate_root;
65 }
66
67 trace.set(
68 row,
69 { { { C::nullifier_check_sel, 1 },
70 { C::nullifier_check_const_three, 3 },
71 { C::nullifier_check_write, event.write ? 1 : 0 },
72 { C::nullifier_check_nullifier, nullifier },
73 { C::nullifier_check_root, event.prev_snapshot.root },
74 { C::nullifier_check_exists, exists ? 1 : 0 },
75 { C::nullifier_check_write_root, event.next_snapshot.root },
76 { C::nullifier_check_tree_size_before_write, event.prev_snapshot.next_available_leaf_index },
77 { C::nullifier_check_discard, discard ? 1 : 0 },
78 { C::nullifier_check_nullifier_index, event.nullifier_counter },
79 { C::nullifier_check_sel_silo, event.siloing_data.has_value() ? 1 : 0 },
80 { C::nullifier_check_address, address },
81 { C::nullifier_check_low_leaf_nullifier, event.low_leaf_preimage.leaf.nullifier },
82 { C::nullifier_check_low_leaf_next_index, event.low_leaf_preimage.nextIndex },
83 { C::nullifier_check_low_leaf_next_nullifier, event.low_leaf_preimage.nextKey },
84 { C::nullifier_check_updated_low_leaf_next_index, updated_low_leaf_next_index },
85 { C::nullifier_check_updated_low_leaf_next_nullifier, updated_low_leaf_next_key },
86 { C::nullifier_check_low_leaf_index, event.low_leaf_index },
87 { C::nullifier_check_siloed_nullifier, siloed_nullifier },
88 { C::nullifier_check_siloing_separator, DOM_SEP__SILOED_NULLIFIER },
89 { C::nullifier_check_sel_insert, append ? 1 : 0 },
90 { C::nullifier_check_low_leaf_hash, event.low_leaf_hash },
91 { C::nullifier_check_intermediate_root, intermediate_root },
92 { C::nullifier_check_updated_low_leaf_hash, updated_low_leaf_hash },
93 { C::nullifier_check_tree_height, NULLIFIER_TREE_HEIGHT },
94 { C::nullifier_check_leaf_not_exists, exists ? 0 : 1 },
95 { C::nullifier_check_nullifier_low_leaf_nullifier_diff_inv,
96 nullifier_low_leaf_nullifier_diff }, // Will be inverted in batch later
97 { C::nullifier_check_next_nullifier_is_nonzero, next_nullifier_is_nonzero ? 1 : 0 },
98 { C::nullifier_check_next_nullifier_inv, next_nullifier }, // Will be inverted in batch later
99 { C::nullifier_check_new_leaf_hash, new_leaf_hash },
100 { C::nullifier_check_sel_write_to_public_inputs, (event.append_data.has_value() && !discard) ? 1 : 0 },
101 { C::nullifier_check_public_inputs_index,
102 AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX + event.nullifier_counter } } });
103 row++;
104 });
105
106 // Batch invert the columns.
107 trace.invert_columns(
108 { { C::nullifier_check_nullifier_low_leaf_nullifier_diff_inv, C::nullifier_check_next_nullifier_inv } });
109}
110
114 .add<lookup_nullifier_check_low_leaf_poseidon2_settings, InteractionType::LookupSequential>()
116 .add<lookup_nullifier_check_low_leaf_merkle_check_settings, InteractionType::LookupSequential>()
118 InteractionType::LookupGeneric>() // ff_gt deduplicates
120 InteractionType::LookupGeneric>() // ff_gt deduplicates
122 .add<lookup_nullifier_check_new_leaf_merkle_check_settings, InteractionType::LookupSequential>()
125
126} // namespace bb::avm2::tracegen
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX
#define DOM_SEP__SILOED_NULLIFIER
#define NULLIFIER_TREE_HEIGHT
InteractionDefinition & add(auto &&... args)
void process(const simulation::EventEmitterInterface< simulation::NullifierTreeCheckEvent >::Container &events, TraceContainer &trace)
Process the nullifier tree check events and populate the relevant columns in the trace.
TestTraceContainer trace
crypto::merkle_tree::IndexedLeaf< crypto::merkle_tree::NullifierLeafValue > NullifierTreeLeafPreimage
Definition db_types.hpp:12
void process_with_discard(const std::vector< std::variant< EventType, simulation::CheckPointEventType > > &events, ProcessEventFn &&process_event)
Processes events from a stream, attaching a discard flag to indicate reverted checkpoints.
lookup_settings< lookup_nullifier_check_updated_low_leaf_poseidon2_settings_ > lookup_nullifier_check_updated_low_leaf_poseidon2_settings
lookup_settings< lookup_nullifier_check_low_leaf_nullifier_validation_settings_ > lookup_nullifier_check_low_leaf_nullifier_validation_settings
AvmFlavorSettings::FF FF
Definition field.hpp:10
lookup_settings< lookup_nullifier_check_silo_poseidon2_settings_ > lookup_nullifier_check_silo_poseidon2_settings
lookup_settings< lookup_nullifier_check_write_nullifier_to_public_inputs_settings_ > lookup_nullifier_check_write_nullifier_to_public_inputs_settings
lookup_settings< lookup_nullifier_check_new_leaf_poseidon2_settings_ > lookup_nullifier_check_new_leaf_poseidon2_settings
simulation::PublicDataTreeReadWriteEvent event
Settings to be passed ot GenericLookupRelationImpl.