Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
l1_to_l2_message_tree_check.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
4#include <cmath>
5#include <cstdint>
6
26
27namespace bb::avm2::constraining {
28namespace {
29
30using simulation::EventEmitter;
31using simulation::L1ToL2MessageTreeCheck;
32using simulation::MerkleCheck;
33using simulation::MerkleCheckEvent;
34using simulation::PurePoseidon2;
36
37using tracegen::L1ToL2MessageTreeCheckTraceBuilder;
38using tracegen::MerkleCheckTraceBuilder;
39using tracegen::TestTraceContainer;
40
42using C = Column;
43using l1_to_l2_message_tree_check_relations = bb::avm2::l1_to_l2_message_tree_check<FF>;
45
46TEST(L1ToL2MessageTreeCheckConstrainingTests, PositiveExists)
47{
48 PurePoseidon2 poseidon2 = PurePoseidon2();
49
50 EventEmitter<MerkleCheckEvent> merkle_event_emitter;
51 MerkleCheck merkle_check(poseidon2, merkle_event_emitter);
52
53 EventEmitter<simulation::L1ToL2MessageTreeCheckEvent> l1_to_l2_message_tree_check_event_emitter;
54 L1ToL2MessageTreeCheck l1_to_l2_message_tree_check(merkle_check, l1_to_l2_message_tree_check_event_emitter);
55
56 TestTraceContainer trace({ { { C::precomputed_first_row, 1 } } });
57 MerkleCheckTraceBuilder merkle_check_builder;
58 L1ToL2MessageTreeCheckTraceBuilder l1_to_l2_message_tree_check_builder;
59
60 FF msg_hash = 42;
61
62 uint64_t leaf_index = 30;
63 std::vector<FF> sibling_path;
64 sibling_path.reserve(L1_TO_L2_MSG_TREE_HEIGHT);
65 for (size_t i = 0; i < L1_TO_L2_MSG_TREE_HEIGHT; ++i) {
66 sibling_path.emplace_back(i);
67 }
68 FF root = unconstrained_root_from_path(DOM_SEP__MERKLE_HASH, msg_hash, leaf_index, sibling_path);
69
70 EXPECT_TRUE(
71 l1_to_l2_message_tree_check.exists(msg_hash,
72 msg_hash,
73 leaf_index,
74 sibling_path,
75 AppendOnlyTreeSnapshot{ .root = root, .next_available_leaf_index = 128 }));
76
77 l1_to_l2_message_tree_check_builder.process(l1_to_l2_message_tree_check_event_emitter.dump_events(), trace);
78 merkle_check_builder.process(merkle_event_emitter.dump_events(), trace);
79
80 check_relation<l1_to_l2_message_tree_check_relations>(trace);
81 check_all_interactions<L1ToL2MessageTreeCheckTraceBuilder>(trace);
82}
83
84TEST(L1ToL2MessageTreeCheckConstrainingTests, PositiveNotExists)
85{
86 PurePoseidon2 poseidon2 = PurePoseidon2();
87
88 EventEmitter<MerkleCheckEvent> merkle_event_emitter;
89 MerkleCheck merkle_check(poseidon2, merkle_event_emitter);
90
91 EventEmitter<simulation::L1ToL2MessageTreeCheckEvent> l1_to_l2_message_tree_check_event_emitter;
92 L1ToL2MessageTreeCheck l1_to_l2_message_tree_check(merkle_check, l1_to_l2_message_tree_check_event_emitter);
93
94 TestTraceContainer trace({ { { C::precomputed_first_row, 1 } } });
95 MerkleCheckTraceBuilder merkle_check_builder;
96 L1ToL2MessageTreeCheckTraceBuilder l1_to_l2_message_tree_check_builder;
97
98 FF requested_msg_hash = 42;
99 FF actual_leaf_value = 43;
100
101 uint64_t leaf_index = 30;
102 std::vector<FF> sibling_path;
103 sibling_path.reserve(L1_TO_L2_MSG_TREE_HEIGHT);
104 for (size_t i = 0; i < L1_TO_L2_MSG_TREE_HEIGHT; ++i) {
105 sibling_path.emplace_back(i);
106 }
107 FF root = unconstrained_root_from_path(DOM_SEP__MERKLE_HASH, actual_leaf_value, leaf_index, sibling_path);
108
109 EXPECT_FALSE(
110 l1_to_l2_message_tree_check.exists(requested_msg_hash,
111 actual_leaf_value,
112 leaf_index,
113 sibling_path,
114 AppendOnlyTreeSnapshot{ .root = root, .next_available_leaf_index = 128 }));
115
116 l1_to_l2_message_tree_check_builder.process(l1_to_l2_message_tree_check_event_emitter.dump_events(), trace);
117 merkle_check_builder.process(merkle_event_emitter.dump_events(), trace);
118
119 check_relation<l1_to_l2_message_tree_check_relations>(trace);
120 check_all_interactions<L1ToL2MessageTreeCheckTraceBuilder>(trace);
121}
122
123TEST(L1ToL2MessageTreeCheckConstrainingTests, NegativeWrongMerkleHashSeparator)
124{
125 TestTraceContainer trace({ {
126 { C::l1_to_l2_message_tree_check_sel, 1 },
127 { C::l1_to_l2_message_tree_check_merkle_hash_separator, DOM_SEP__MERKLE_HASH },
128 } });
129
130 check_relation<l1_to_l2_message_tree_check_relations>(
131 trace, l1_to_l2_message_tree_check_relations::SR_MERKLE_HASH_SEPARATOR_CONSTANT);
132
133 // A malicious prover picking any other value must be rejected.
134 trace.set(C::l1_to_l2_message_tree_check_merkle_hash_separator, 0, DOM_SEP__NULLIFIER_MERKLE);
135
136 EXPECT_THROW_WITH_MESSAGE(check_relation<l1_to_l2_message_tree_check_relations>(
137 trace, l1_to_l2_message_tree_check_relations::SR_MERKLE_HASH_SEPARATOR_CONSTANT),
138 "MERKLE_HASH_SEPARATOR_CONSTANT");
139}
140
141} // namespace
142} // namespace bb::avm2::constraining
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
Definition assert.hpp:193
#define DOM_SEP__MERKLE_HASH
#define L1_TO_L2_MSG_TREE_HEIGHT
#define DOM_SEP__NULLIFIER_MERKLE
MerkleCheck merkle_check
void set(Column col, uint32_t row, const FF &value)
TestTraceContainer trace
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
FF unconstrained_root_from_path(uint64_t domain_separator, const FF &leaf_value, const uint64_t leaf_index, std::span< const FF > path)
Definition merkle.cpp:12