2#include "barretenberg/aztec/aztec_constants.hpp"
13#include <gtest/gtest.h>
17#include <unordered_map>
27 std::filesystem::create_directories(
data_dir);
38 { MerkleTreeId::NULLIFIER_TREE, NULLIFIER_TREE_HEIGHT },
39 { MerkleTreeId::NOTE_HASH_TREE, NOTE_HASH_TREE_HEIGHT },
40 { MerkleTreeId::PUBLIC_DATA_TREE, PUBLIC_DATA_TREE_HEIGHT },
41 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE, L1_TO_L2_MSG_TREE_HEIGHT },
42 { MerkleTreeId::ARCHIVE, ARCHIVE_HEIGHT },
45 { MerkleTreeId::NULLIFIER_TREE, 128 },
46 { MerkleTreeId::PUBLIC_DATA_TREE, 128 },
53template <
typename Leaf>
60 EXPECT_EQ(leaf.has_value(),
true);
68template <
typename Leaf>
73 const Leaf& expected_value)
76 EXPECT_EQ(leaf.has_value(),
true);
77 EXPECT_EQ(leaf.value(), expected_value);
80template <
typename Leaf>
86 EXPECT_EQ(indices.size(), 1);
87 EXPECT_EQ(indices[0].has_value(),
exists);
90template <
typename Leaf>
96 EXPECT_EQ(indices.size(), 1);
97 EXPECT_TRUE(indices[0].has_value());
98 if (!indices[0].has_value()) {
101 EXPECT_EQ(indices[0].
value(), expected_index);
107 EXPECT_EQ(
info.meta.size, expected_size);
118 auto hash_pair_for_tree = [tree_id](
const fr& l,
const fr& r) ->
fr {
119 using namespace aztec;
121 case MerkleTreeId::NULLIFIER_TREE:
122 return NullifierMerkleHashPolicy::hash_pair(l, r);
123 case MerkleTreeId::PUBLIC_DATA_TREE:
124 return PublicDataMerkleHashPolicy::hash_pair(l, r);
129 for (
const auto& node : sibling_path) {
130 if (
index % 2 == 0) {
138 hash = hash_pair_for_tree(left, right);
142 EXPECT_EQ(hash, root);
147 bool includeUncommitted,
149 MerkleTreeId::NOTE_HASH_TREE,
150 MerkleTreeId::PUBLIC_DATA_TREE,
151 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
152 MerkleTreeId::ARCHIVE })
155 for (
auto tree_id : trees) {
156 auto canonical_tree_info =
161 .includeUncommitted = includeUncommitted,
165 EXPECT_EQ(canonical_tree_info.meta, fork_tree_info.meta);
171 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
175 EXPECT_EQ(
info.meta.size, 128);
176 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::NULLIFIER_TREE));
177 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x18935581a8ed73d08ffd00386fba55ba6c89f3ab848a76b8fedfa9034cee0454"));
182 EXPECT_EQ(
info.meta.size, 0);
183 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::NOTE_HASH_TREE));
184 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x2590f2aab19dd791700b4a43d3f52bb88ef2409a3731da8e848663559202e4c6"));
189 EXPECT_EQ(
info.meta.size, 128);
190 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::PUBLIC_DATA_TREE));
191 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x1bef38b621017d3c7416663d0cd81369424560710526a3fbaaec13e356b9d084"));
196 EXPECT_EQ(
info.meta.size, 0);
197 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE));
198 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x0fef6d80d31109ddb56d6b3f607cbc9c0af0bff3ea0d43e8f278983c64c11f7a"));
203 EXPECT_EQ(
info.meta.size, 1);
204 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::ARCHIVE));
206 EXPECT_EQ(
info.meta.root,
bb::fr(GENESIS_ARCHIVE_ROOT));
218 std::vector<bb::fr> prefilled_nullifiers = {
219 bb::fr(
"0x073b5e41abe9d7f8466bca9c81c9572b558f953bbd70081317f6a80ac65f3dd5"),
220 bb::fr(
"0x0d99507b7ecac720c73bf197a0e7366a5ed80c1c1b0afe8ff8c6ecc7b5a7aefe"),
221 bb::fr(
"0x1c0bf82e0c51834780e61ef091b17e3a1d39ae891db7a70bfdb5221f134996ac"),
225 std::filesystem::create_directories(data_dir_prefilled);
233 prefilled_nullifiers,
234 initial_header_generator_point);
237 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
244 EXPECT_EQ(prefilled.meta.size, 128);
245 EXPECT_EQ(
info.meta.size, 128);
248 EXPECT_NE(prefilled.meta.root,
info.meta.root);
251 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x18935581a8ed73d08ffd00386fba55ba6c89f3ab848a76b8fedfa9034cee0454"));
254 for (
const auto& nullifier : prefilled_nullifiers) {
255 assert_leaf_exists<NullifierLeafValue>(ws_prefilled,
257 MerkleTreeId::NULLIFIER_TREE,
262 std::filesystem::remove_all(data_dir_prefilled);
268 std::filesystem::create_directories(data_dir_prefilled);
279 std::vector<bb::fr>(),
280 initial_header_generator_point);
282 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
287 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
288 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
289 EXPECT_EQ(prefilled.meta.root,
info.meta.root);
295 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
296 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
297 EXPECT_EQ(prefilled.meta.root,
info.meta.root);
303 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
304 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
306 EXPECT_NE(prefilled.meta.root,
info.meta.root);
312 EXPECT_EQ(leaf.value().leaf, prefilled_values[0]);
317 EXPECT_EQ(leaf.value().leaf, prefilled_values[1]);
324 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
325 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
327 EXPECT_NE(prefilled.meta.root,
info.meta.root);
333 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
338 auto snapshot = state_ref.at(MerkleTreeId::NULLIFIER_TREE);
341 std::make_pair(
bb::fr(
"0x18935581a8ed73d08ffd00386fba55ba6c89f3ab848a76b8fedfa9034cee0454"), 128UL));
345 auto snapshot = state_ref.at(MerkleTreeId::NOTE_HASH_TREE);
348 std::make_pair(
bb::fr(
"0x2590f2aab19dd791700b4a43d3f52bb88ef2409a3731da8e848663559202e4c6"), 0UL));
352 auto snapshot = state_ref.at(MerkleTreeId::PUBLIC_DATA_TREE);
355 std::make_pair(
bb::fr(
"0x1bef38b621017d3c7416663d0cd81369424560710526a3fbaaec13e356b9d084"), 128UL));
359 auto snapshot = state_ref.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE);
362 std::make_pair(
bb::fr(
"0x0fef6d80d31109ddb56d6b3f607cbc9c0af0bff3ea0d43e8f278983c64c11f7a"), 0UL));
371 auto snapshot = state_ref.at(MerkleTreeId::NULLIFIER_TREE);
374 std::make_pair(
bb::fr(
"0x18935581a8ed73d08ffd00386fba55ba6c89f3ab848a76b8fedfa9034cee0454"), 128UL));
378 auto snapshot = state_ref.at(MerkleTreeId::NOTE_HASH_TREE);
381 std::make_pair(
bb::fr(
"0x278449ce779093eaaa1bd9fc608f7ed7b595417710e2baf359e1488650967f47"), 1UL));
385 auto snapshot = state_ref.at(MerkleTreeId::PUBLIC_DATA_TREE);
388 std::make_pair(
bb::fr(
"0x1bef38b621017d3c7416663d0cd81369424560710526a3fbaaec13e356b9d084"), 128UL));
392 auto snapshot = state_ref.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE);
395 std::make_pair(
bb::fr(
"0x0fef6d80d31109ddb56d6b3f607cbc9c0af0bff3ea0d43e8f278983c64c11f7a"), 0UL));
402 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
411 EXPECT_EQ(before_commit, after_commit);
416 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
419 std::vector tree_ids{ MerkleTreeId::NOTE_HASH_TREE, MerkleTreeId::L1_TO_L2_MESSAGE_TREE };
421 for (
auto tree_id : tree_ids) {
432 EXPECT_EQ(uncommitted.meta.size, initial.meta.size + 1);
433 EXPECT_NE(uncommitted.meta.root, initial.meta.root);
438 EXPECT_EQ(committed.meta.size, initial.meta.size);
439 EXPECT_EQ(committed.meta.root, initial.meta.root);
448 EXPECT_EQ(after_commit.meta.size, uncommitted.meta.size);
449 EXPECT_EQ(after_commit.meta.root, uncommitted.meta.root);
459 EXPECT_EQ(before_rollback.meta.size, after_commit.meta.size + 1);
460 EXPECT_NE(before_rollback.meta.root, after_commit.meta.root);
468 EXPECT_EQ(after_rollback.meta.size, after_commit.meta.size);
469 EXPECT_EQ(after_rollback.meta.root, after_commit.meta.root);
475 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
478 std::vector tree_ids{
479 MerkleTreeId::NOTE_HASH_TREE,
480 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
483 for (
auto tree_id : tree_ids) {
502 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
503 auto tree_id = MerkleTreeId::NULLIFIER_TREE;
506 auto predecessor_of_142 =
518 EXPECT_TRUE(test_leaf.has_value());
519 EXPECT_EQ(test_leaf.value(),
IndexedLeaf(test_nullifier, 0, 0));
521 auto predecessor_of_142_again =
526 EXPECT_EQ(predecessor_of_143,
540 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
541 auto tree_id = MerkleTreeId::NULLIFIER_TREE;
555 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
562 EXPECT_EQ(response.sorted_leaves, expected_sorted_leaves);
568 auto low_leaf = response.low_leaf_witness_data[0];
571 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
577 auto low_leaf = response.low_leaf_witness_data[1];
580 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
586 auto low_leaf = response.low_leaf_witness_data[2];
589 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
595 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
615 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
652 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
654 { MerkleTreeId::NULLIFIER_TREE,
655 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
656 { MerkleTreeId::NOTE_HASH_TREE,
657 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
658 { MerkleTreeId::PUBLIC_DATA_TREE,
659 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
660 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
661 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
667 EXPECT_EQ(status.
summary, expected);
677 for (
const auto& [tree_id, snapshot] : block_state_ref) {
678 EXPECT_EQ(state_ref.at(tree_id), snapshot);
684 EXPECT_EQ(blockNumbers.size(), 1);
685 EXPECT_EQ(blockNumbers[0], 1);
688 WorldStateRevision{ .forkId = CANONICAL_FORK_ID, .blockNumber = 2, .includeUncommitted = false },
689 MerkleTreeId::NOTE_HASH_TREE,
698 { MerkleTreeId::NULLIFIER_TREE,
699 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
700 { MerkleTreeId::NOTE_HASH_TREE,
701 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
702 { MerkleTreeId::PUBLIC_DATA_TREE,
703 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
704 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
705 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
713 thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
721 std::filesystem::create_directories(data_dir2);
722 WorldState ws(thread_pool_size, data_dir2, map_size, tree_heights, tree_prefill, initial_header_generator_point);
732 previous_root +
fr(1)),
742 resulting_root +
fr(1),
759 EXPECT_EQ(status.
summary, expected);
765 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
767 { MerkleTreeId::NULLIFIER_TREE,
768 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
769 { MerkleTreeId::NOTE_HASH_TREE,
770 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
771 { MerkleTreeId::PUBLIC_DATA_TREE,
772 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
773 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
774 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
783 for (
const auto& [tree_id, snapshot] : block_state_ref) {
784 EXPECT_NE(uncommitted_state_ref.at(tree_id), snapshot);
790 EXPECT_EQ(status.
summary, expected);
800 for (
const auto& [tree_id, snapshot] : block_state_ref) {
801 EXPECT_EQ(state_ref.at(tree_id), snapshot);
807 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
810 { MerkleTreeId::NULLIFIER_TREE,
811 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
812 { MerkleTreeId::NOTE_HASH_TREE,
813 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
814 { MerkleTreeId::PUBLIC_DATA_TREE,
815 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
816 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
817 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
827 for (
const auto& [tree_id, snapshot] : block_state_ref) {
828 EXPECT_EQ(uncommitted_state_ref.at(tree_id), snapshot);
834 EXPECT_EQ(status.
summary, expected);
839 for (
const auto& [tree_id, snapshot] : block_state_ref) {
840 EXPECT_EQ(state_ref.at(tree_id), snapshot);
846 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
848 { MerkleTreeId::NULLIFIER_TREE,
849 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
850 { MerkleTreeId::NOTE_HASH_TREE,
851 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
852 { MerkleTreeId::PUBLIC_DATA_TREE,
853 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
854 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
855 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
868 EXPECT_THROW(sync(), std::runtime_error);
873 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
875 { MerkleTreeId::NULLIFIER_TREE,
876 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
877 { MerkleTreeId::NOTE_HASH_TREE,
878 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
879 { MerkleTreeId::PUBLIC_DATA_TREE,
880 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
881 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
882 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
896 EXPECT_THROW(sync(), std::runtime_error);
901 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
905 EXPECT_EQ(block_state_ref, after_sync);
910 EXPECT_EQ(indices, expected);
915 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
924 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
931 .includeUncommitted =
true,
933 MerkleTreeId::ARCHIVE);
941 .includeUncommitted =
true,
943 MerkleTreeId::ARCHIVE);
945 EXPECT_EQ(canonical_archive_state_after.meta, canonical_archive_state_before.meta);
946 EXPECT_EQ(fork_archive_state_before.meta, canonical_archive_state_before.meta);
947 EXPECT_NE(fork_archive_state_after.meta, fork_archive_state_before.meta);
952 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
959 .includeUncommitted =
true,
961 MerkleTreeId::ARCHIVE);
967 auto canonical_archive_state_after_insert =
972 .includeUncommitted =
true,
974 MerkleTreeId::ARCHIVE);
976 EXPECT_EQ(fork_archive_state_before_insert.meta, canonical_archive_state_before.meta);
978 EXPECT_NE(canonical_archive_state_after_insert.meta, canonical_archive_state_before.meta);
979 EXPECT_NE(fork_archive_state_after_insert.meta, fork_archive_state_before_insert.meta);
980 EXPECT_NE(fork_archive_state_after_insert.meta, canonical_archive_state_after_insert.meta);
984 auto canonical_archive_state_after_commit =
989 .includeUncommitted =
false,
991 MerkleTreeId::ARCHIVE);
994 EXPECT_EQ(fork_archive_state_after_commit.meta.size, fork_archive_state_before_insert.meta.size);
995 EXPECT_EQ(fork_archive_state_after_commit.meta.root, fork_archive_state_before_insert.meta.root);
998 EXPECT_EQ(canonical_archive_state_after_commit.meta.root, canonical_archive_state_after_insert.meta.root);
999 EXPECT_EQ(canonical_archive_state_after_commit.meta.size, canonical_archive_state_after_insert.meta.size);
1004 assert_leaf_value<bb::fr>(
1010 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
1026 ws.
sync_block(fork_state_ref, { 1 }, { 42 }, { 43 }, { { 129 } }, { { { 129, 1 } } });
1033 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
1036 { MerkleTreeId::NULLIFIER_TREE,
1037 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
1038 { MerkleTreeId::NOTE_HASH_TREE,
1039 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
1040 { MerkleTreeId::PUBLIC_DATA_TREE,
1041 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
1042 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
1043 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
1049 EXPECT_EQ(status.
summary, expected);
1054 MerkleTreeId::NULLIFIER_TREE,
1055 MerkleTreeId::NOTE_HASH_TREE,
1056 MerkleTreeId::PUBLIC_DATA_TREE,
1057 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
1060 for (
const auto&
id : tree_ids) {
1065 EXPECT_EQ(blockNumbers.size(), 1);
1066 EXPECT_TRUE(blockNumbers[0].has_value());
1067 EXPECT_EQ(blockNumbers[0].
value(), 1);
1077 bb::fr previous_archive_root;
1078 bb::fr canonical_archive_root;
1081 thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
1084 scratch.
sync_block(genesis_state_ref,
fr(1), {}, {}, {}, {});
1085 canonical_archive_root =
1090 std::filesystem::create_directories(data_dir2);
1091 WorldState ws(thread_pool_size, data_dir2, map_size, tree_heights, tree_prefill, initial_header_generator_point);
1096 EXPECT_NO_THROW(ws.
sync_block(genesis_state_ref,
fr(42), {}, {}, {}, {}));
1101 EXPECT_NE(actual_archive_root, canonical_archive_root);
1102 EXPECT_NE(actual_archive_root, previous_archive_root);
1110 bb::fr previous_archive_root;
1111 bb::fr canonical_archive_root;
1114 thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
1117 scratch.
sync_block(genesis_state_ref,
fr(1), {}, {}, {}, {});
1118 canonical_archive_root =
1123 std::filesystem::create_directories(data_dir2);
1124 WorldState ws(thread_pool_size, data_dir2, map_size, tree_heights, tree_prefill, initial_header_generator_point);
1131 ws.
sync_block(genesis_state_ref,
fr(42), {}, {}, {}, {}, canonical_archive_root, previous_archive_root),
1132 std::runtime_error);
1136 previous_archive_root);
static std::string data_dir
uint32_t initial_header_generator_point
uint64_t thread_pool_size
std::unordered_map< MerkleTreeId, index_t > tree_prefill
std::unordered_map< MerkleTreeId, uint32_t > tree_heights
Implements a parallelized batch insertion indexed tree Accepts template argument of the type of store...
Holds the Merkle trees responsible for storing the state of the Aztec protocol.
BatchInsertionResult< T > batch_insert_indexed_leaves(MerkleTreeId tree_id, const std::vector< T > &leaves, uint32_t subtree_depth, Fork::Id fork_id=CANONICAL_FORK_ID)
Batch inserts a set of leaves into an indexed Merkle Tree.
void append_leaves(MerkleTreeId tree_id, const std::vector< T > &leaves, Fork::Id fork_id=CANONICAL_FORK_ID)
Appends a set of leaves to an existing Merkle Tree.
StateReference get_initial_state_reference() const
Gets the initial state reference for all the trees in the world state.
std::optional< crypto::merkle_tree::IndexedLeaf< T > > get_indexed_leaf(const WorldStateRevision &revision, MerkleTreeId tree_id, index_t leaf_index) const
Get the leaf preimage object.
crypto::merkle_tree::TreeMetaResponse get_tree_info(const WorldStateRevision &revision, MerkleTreeId tree_id) const
Get tree metadata for a particular tree.
std::pair< bool, std::string > commit(WorldStateStatusFull &status)
Commits the current state of the world state.
void get_block_numbers_for_leaf_indices(const WorldStateRevision &revision, MerkleTreeId tree_id, const std::vector< index_t > &leafIndices, std::vector< std::optional< block_number_t > > &blockNumbers) const
StateReference get_state_reference(const WorldStateRevision &revision) const
Gets the state reference for all the trees in the world state.
void update_public_data(const crypto::merkle_tree::PublicDataLeafValue &new_value, Fork::Id fork_id=CANONICAL_FORK_ID)
Updates a leaf in an existing Merkle Tree.
WorldStateStatusFull sync_block(const StateReference &block_state_ref, const bb::fr &block_header_hash, const std::vector< bb::fr > ¬es, const std::vector< bb::fr > &l1_to_l2_messages, const std::vector< crypto::merkle_tree::NullifierLeafValue > &nullifiers, const std::vector< crypto::merkle_tree::PublicDataLeafValue > &public_writes, const std::optional< bb::fr > &expected_archive_root=std::nullopt, const std::optional< bb::fr > &expected_previous_archive_root=std::nullopt)
void rollback()
Rolls back any uncommitted changes made to the world state.
void delete_fork(const uint64_t &forkId)
uint64_t create_fork(const std::optional< block_number_t > &blockNumber)
crypto::merkle_tree::fr_sibling_path get_sibling_path(const WorldStateRevision &revision, MerkleTreeId tree_id, index_t leaf_index) const
Get the sibling path object for a leaf in a tree.
void find_leaf_indices(const WorldStateRevision &revision, MerkleTreeId tree_id, const std::vector< T > &leaves, std::vector< std::optional< index_t > > &indices, index_t start_index=0) const
Finds the index of a leaf in a tree.
std::optional< T > get_leaf(const WorldStateRevision &revision, MerkleTreeId tree_id, index_t leaf_index) const
Gets the value of a leaf in a tree.
crypto::merkle_tree::GetLowIndexedLeafResponse find_low_leaf_index(const WorldStateRevision &revision, MerkleTreeId tree_id, const bb::fr &leaf_key) const
Finds the leaf that would have its nextIdx/nextValue fields modified if the target leaf were to be in...
void update_archive(const StateReference &block_state_ref, const bb::fr &block_header_hash, Fork::Id fork_id=CANONICAL_FORK_ID)
Updates the archive tree with a new block.
IndexedTreeLeafData low_leaf
std::string random_temp_directory()
std::unordered_map< MerkleTreeId, TreeStateReference > StateReference
TEST_F(IPATest, ChallengesAreZero)
field< Bn254FrParams > fr
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static bb::fr hash_pair(const bb::fr &lhs, const bb::fr &rhs)
static fr hash(const std::vector< fr > &inputs)
static constexpr field zero()
static WorldStateRevision committed()
static WorldStateRevision uncommitted()
WorldStateStatusSummary summary
void assert_fork_state_unchanged(const WorldState &ws, Fork::Id forkId, bool includeUncommitted, const std::vector< MerkleTreeId > &trees={ MerkleTreeId::NULLIFIER_TREE, MerkleTreeId::NOTE_HASH_TREE, MerkleTreeId::PUBLIC_DATA_TREE, MerkleTreeId::L1_TO_L2_MESSAGE_TREE, MerkleTreeId::ARCHIVE })
void assert_leaf_value(const WorldState &ws, WorldStateRevision revision, MerkleTreeId tree_id, index_t leaf_index, const Leaf &expected_value)
void assert_leaf_index(const WorldState &ws, WorldStateRevision revision, MerkleTreeId tree_id, const Leaf &value, index_t expected_index)
void assert_tree_size(const WorldState &ws, WorldStateRevision revision, MerkleTreeId tree_id, size_t expected_size)
void assert_sibling_path(const WorldState &ws, WorldStateRevision revision, MerkleTreeId tree_id, fr root, fr leaf, index_t index)
void assert_leaf_exists(const WorldState &ws, WorldStateRevision revision, MerkleTreeId tree_id, const Leaf &expected_value, bool exists)
void assert_leaf_status(const WorldState &ws, WorldStateRevision revision, MerkleTreeId tree_id, index_t leaf_index, bool exists)