13#include <gtest/gtest.h>
17#include <unordered_map>
27 std::filesystem::create_directories(
data_dir);
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));
217 std::filesystem::create_directories(data_dir_prefilled);
228 initial_header_generator_point);
230 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
235 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
236 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
237 EXPECT_EQ(prefilled.meta.root,
info.meta.root);
243 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
244 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
245 EXPECT_EQ(prefilled.meta.root,
info.meta.root);
251 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
252 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
254 EXPECT_NE(prefilled.meta.root,
info.meta.root);
260 EXPECT_EQ(leaf.value().leaf, prefilled_values[0]);
265 EXPECT_EQ(leaf.value().leaf, prefilled_values[1]);
272 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
273 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
275 EXPECT_NE(prefilled.meta.root,
info.meta.root);
281 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
286 auto snapshot = state_ref.at(MerkleTreeId::NULLIFIER_TREE);
289 std::make_pair(
bb::fr(
"0x18935581a8ed73d08ffd00386fba55ba6c89f3ab848a76b8fedfa9034cee0454"), 128UL));
293 auto snapshot = state_ref.at(MerkleTreeId::NOTE_HASH_TREE);
296 std::make_pair(
bb::fr(
"0x2590f2aab19dd791700b4a43d3f52bb88ef2409a3731da8e848663559202e4c6"), 0UL));
300 auto snapshot = state_ref.at(MerkleTreeId::PUBLIC_DATA_TREE);
303 std::make_pair(
bb::fr(
"0x1bef38b621017d3c7416663d0cd81369424560710526a3fbaaec13e356b9d084"), 128UL));
307 auto snapshot = state_ref.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE);
310 std::make_pair(
bb::fr(
"0x0fef6d80d31109ddb56d6b3f607cbc9c0af0bff3ea0d43e8f278983c64c11f7a"), 0UL));
319 auto snapshot = state_ref.at(MerkleTreeId::NULLIFIER_TREE);
322 std::make_pair(
bb::fr(
"0x18935581a8ed73d08ffd00386fba55ba6c89f3ab848a76b8fedfa9034cee0454"), 128UL));
326 auto snapshot = state_ref.at(MerkleTreeId::NOTE_HASH_TREE);
329 std::make_pair(
bb::fr(
"0x278449ce779093eaaa1bd9fc608f7ed7b595417710e2baf359e1488650967f47"), 1UL));
333 auto snapshot = state_ref.at(MerkleTreeId::PUBLIC_DATA_TREE);
336 std::make_pair(
bb::fr(
"0x1bef38b621017d3c7416663d0cd81369424560710526a3fbaaec13e356b9d084"), 128UL));
340 auto snapshot = state_ref.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE);
343 std::make_pair(
bb::fr(
"0x0fef6d80d31109ddb56d6b3f607cbc9c0af0bff3ea0d43e8f278983c64c11f7a"), 0UL));
350 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
359 EXPECT_EQ(before_commit, after_commit);
364 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
367 std::vector tree_ids{ MerkleTreeId::NOTE_HASH_TREE, MerkleTreeId::L1_TO_L2_MESSAGE_TREE };
369 for (
auto tree_id : tree_ids) {
380 EXPECT_EQ(uncommitted.meta.size, initial.meta.size + 1);
381 EXPECT_NE(uncommitted.meta.root, initial.meta.root);
386 EXPECT_EQ(committed.meta.size, initial.meta.size);
387 EXPECT_EQ(committed.meta.root, initial.meta.root);
396 EXPECT_EQ(after_commit.meta.size, uncommitted.meta.size);
397 EXPECT_EQ(after_commit.meta.root, uncommitted.meta.root);
407 EXPECT_EQ(before_rollback.meta.size, after_commit.meta.size + 1);
408 EXPECT_NE(before_rollback.meta.root, after_commit.meta.root);
416 EXPECT_EQ(after_rollback.meta.size, after_commit.meta.size);
417 EXPECT_EQ(after_rollback.meta.root, after_commit.meta.root);
423 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
426 std::vector tree_ids{
427 MerkleTreeId::NOTE_HASH_TREE,
428 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
431 for (
auto tree_id : tree_ids) {
450 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
451 auto tree_id = MerkleTreeId::NULLIFIER_TREE;
454 auto predecessor_of_142 =
466 EXPECT_TRUE(test_leaf.has_value());
467 EXPECT_EQ(test_leaf.value(),
IndexedLeaf(test_nullifier, 0, 0));
469 auto predecessor_of_142_again =
474 EXPECT_EQ(predecessor_of_143,
488 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
489 auto tree_id = MerkleTreeId::NULLIFIER_TREE;
503 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
510 EXPECT_EQ(response.sorted_leaves, expected_sorted_leaves);
516 auto low_leaf = response.low_leaf_witness_data[0];
519 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
525 auto low_leaf = response.low_leaf_witness_data[1];
528 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
534 auto low_leaf = response.low_leaf_witness_data[2];
537 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
543 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
563 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
600 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
602 { MerkleTreeId::NULLIFIER_TREE,
603 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
604 { MerkleTreeId::NOTE_HASH_TREE,
605 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
606 { MerkleTreeId::PUBLIC_DATA_TREE,
607 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
608 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
609 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
615 EXPECT_EQ(status.
summary, expected);
625 for (
const auto& [tree_id, snapshot] : block_state_ref) {
626 EXPECT_EQ(state_ref.at(tree_id), snapshot);
632 EXPECT_EQ(blockNumbers.size(), 1);
633 EXPECT_EQ(blockNumbers[0], 1);
636 WorldStateRevision{ .forkId = CANONICAL_FORK_ID, .blockNumber = 2, .includeUncommitted = false },
637 MerkleTreeId::NOTE_HASH_TREE,
645 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
647 { MerkleTreeId::NULLIFIER_TREE,
648 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
649 { MerkleTreeId::NOTE_HASH_TREE,
650 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
651 { MerkleTreeId::PUBLIC_DATA_TREE,
652 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
653 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
654 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
663 for (
const auto& [tree_id, snapshot] : block_state_ref) {
664 EXPECT_NE(uncommitted_state_ref.at(tree_id), snapshot);
670 EXPECT_EQ(status.
summary, expected);
680 for (
const auto& [tree_id, snapshot] : block_state_ref) {
681 EXPECT_EQ(state_ref.at(tree_id), snapshot);
687 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
690 { MerkleTreeId::NULLIFIER_TREE,
691 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
692 { MerkleTreeId::NOTE_HASH_TREE,
693 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
694 { MerkleTreeId::PUBLIC_DATA_TREE,
695 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
696 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
697 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
707 for (
const auto& [tree_id, snapshot] : block_state_ref) {
708 EXPECT_EQ(uncommitted_state_ref.at(tree_id), snapshot);
714 EXPECT_EQ(status.
summary, expected);
719 for (
const auto& [tree_id, snapshot] : block_state_ref) {
720 EXPECT_EQ(state_ref.at(tree_id), snapshot);
726 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
728 { MerkleTreeId::NULLIFIER_TREE,
729 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
730 { MerkleTreeId::NOTE_HASH_TREE,
731 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
732 { MerkleTreeId::PUBLIC_DATA_TREE,
733 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
734 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
735 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
748 EXPECT_THROW(sync(), std::runtime_error);
753 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
755 { MerkleTreeId::NULLIFIER_TREE,
756 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
757 { MerkleTreeId::NOTE_HASH_TREE,
758 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
759 { MerkleTreeId::PUBLIC_DATA_TREE,
760 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
761 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
762 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
776 EXPECT_THROW(sync(), std::runtime_error);
781 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
785 EXPECT_EQ(block_state_ref, after_sync);
790 EXPECT_EQ(indices, expected);
795 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
804 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
811 .includeUncommitted =
true,
813 MerkleTreeId::ARCHIVE);
821 .includeUncommitted =
true,
823 MerkleTreeId::ARCHIVE);
825 EXPECT_EQ(canonical_archive_state_after.meta, canonical_archive_state_before.meta);
826 EXPECT_EQ(fork_archive_state_before.meta, canonical_archive_state_before.meta);
827 EXPECT_NE(fork_archive_state_after.meta, fork_archive_state_before.meta);
832 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
839 .includeUncommitted =
true,
841 MerkleTreeId::ARCHIVE);
847 auto canonical_archive_state_after_insert =
852 .includeUncommitted =
true,
854 MerkleTreeId::ARCHIVE);
856 EXPECT_EQ(fork_archive_state_before_insert.meta, canonical_archive_state_before.meta);
858 EXPECT_NE(canonical_archive_state_after_insert.meta, canonical_archive_state_before.meta);
859 EXPECT_NE(fork_archive_state_after_insert.meta, fork_archive_state_before_insert.meta);
860 EXPECT_NE(fork_archive_state_after_insert.meta, canonical_archive_state_after_insert.meta);
864 auto canonical_archive_state_after_commit =
869 .includeUncommitted =
false,
871 MerkleTreeId::ARCHIVE);
874 EXPECT_EQ(fork_archive_state_after_commit.meta.size, fork_archive_state_before_insert.meta.size);
875 EXPECT_EQ(fork_archive_state_after_commit.meta.root, fork_archive_state_before_insert.meta.root);
878 EXPECT_EQ(canonical_archive_state_after_commit.meta.root, canonical_archive_state_after_insert.meta.root);
879 EXPECT_EQ(canonical_archive_state_after_commit.meta.size, canonical_archive_state_after_insert.meta.size);
884 assert_leaf_value<bb::fr>(
890 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
906 ws.
sync_block(fork_state_ref, { 1 }, { 42 }, { 43 }, { { 129 } }, { { { 129, 1 } } });
913 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
916 { MerkleTreeId::NULLIFIER_TREE,
917 {
fr(
"0x2e2e2d8b72294a440c728a646f01476624063f0b50dcfe293cc0fc26bef9e311"), 129 } },
918 { MerkleTreeId::NOTE_HASH_TREE,
919 {
fr(
"0x25c4ef02ba2bec9490376d5b56b8f1a8e5bcf5ecff91636e76660b68c2a9952d"), 1 } },
920 { MerkleTreeId::PUBLIC_DATA_TREE,
921 {
fr(
"0x1e2d8d1c3ea2449b3e4787d8295df3f137e08b56e891c006b3d93faef56ca3df"), 129 } },
922 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
923 {
fr(
"0x22c6f7877092ecea5b313b22515e31f2e1e37349b787da10eff298800e3c7c0c"), 1 } },
929 EXPECT_EQ(status.
summary, expected);
934 MerkleTreeId::NULLIFIER_TREE,
935 MerkleTreeId::NOTE_HASH_TREE,
936 MerkleTreeId::PUBLIC_DATA_TREE,
937 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
940 for (
const auto&
id : tree_ids) {
945 EXPECT_EQ(blockNumbers.size(), 1);
946 EXPECT_TRUE(blockNumbers[0].has_value());
947 EXPECT_EQ(blockNumbers[0].
value(), 1);
#define DOM_SEP__BLOCK_HEADER_HASH
#define L1_TO_L2_MSG_TREE_HEIGHT
#define GENESIS_ARCHIVE_ROOT
#define NULLIFIER_TREE_HEIGHT
#define GENESIS_BLOCK_HEADER_HASH
#define NOTE_HASH_TREE_HEIGHT
#define PUBLIC_DATA_TREE_HEIGHT
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.
void rollback()
Rolls back any uncommitted changes made to the world state.
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)
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)