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>
58 EXPECT_EQ(leaf.has_value(),
exists);
61template <
typename Leaf>
66 const Leaf& expected_value)
69 EXPECT_EQ(leaf.has_value(),
true);
70 EXPECT_EQ(leaf.value(), expected_value);
73template <
typename Leaf>
79 EXPECT_EQ(indices.size(), 1);
80 EXPECT_EQ(indices[0].has_value(),
exists);
83template <
typename Leaf>
89 EXPECT_EQ(indices.size(), 1);
90 EXPECT_TRUE(indices[0].has_value());
91 if (!indices[0].has_value()) {
94 EXPECT_EQ(indices[0].
value(), expected_index);
100 EXPECT_EQ(
info.meta.size, expected_size);
110 for (
const auto& node : sibling_path) {
111 if (index % 2 == 0) {
123 EXPECT_EQ(
hash, root);
128 bool includeUncommitted,
130 MerkleTreeId::NOTE_HASH_TREE,
131 MerkleTreeId::PUBLIC_DATA_TREE,
132 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
133 MerkleTreeId::ARCHIVE })
136 for (
auto tree_id : trees) {
137 auto canonical_tree_info =
142 .includeUncommitted = includeUncommitted,
146 EXPECT_EQ(canonical_tree_info.meta, fork_tree_info.meta);
152 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
156 EXPECT_EQ(
info.meta.size, 128);
157 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::NULLIFIER_TREE));
158 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x1ec3788cd1c32e54d889d67fe29e481114f9d4afe9b44b229aa29d8ad528dd31"));
163 EXPECT_EQ(
info.meta.size, 0);
164 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::NOTE_HASH_TREE));
165 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x2ac5dda169f6bb3b9ca09bbac34e14c94d1654597db740153a1288d859a8a30a"));
170 EXPECT_EQ(
info.meta.size, 128);
171 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::PUBLIC_DATA_TREE));
172 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9"));
177 EXPECT_EQ(
info.meta.size, 0);
178 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE));
179 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5"));
184 EXPECT_EQ(
info.meta.size, 1);
185 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::ARCHIVE));
198 std::filesystem::create_directories(data_dir_prefilled);
209 initial_header_generator_point);
211 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
216 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
217 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
218 EXPECT_EQ(prefilled.meta.root,
info.meta.root);
224 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
225 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
226 EXPECT_EQ(prefilled.meta.root,
info.meta.root);
232 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
233 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
235 EXPECT_NE(prefilled.meta.root,
info.meta.root);
241 EXPECT_EQ(leaf.value().leaf, prefilled_values[0]);
246 EXPECT_EQ(leaf.value().leaf, prefilled_values[1]);
253 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
254 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
256 EXPECT_NE(prefilled.meta.root,
info.meta.root);
262 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
267 auto snapshot = state_ref.at(MerkleTreeId::NULLIFIER_TREE);
270 std::make_pair(
bb::fr(
"0x1ec3788cd1c32e54d889d67fe29e481114f9d4afe9b44b229aa29d8ad528dd31"), 128UL));
274 auto snapshot = state_ref.at(MerkleTreeId::NOTE_HASH_TREE);
277 std::make_pair(
bb::fr(
"0x2ac5dda169f6bb3b9ca09bbac34e14c94d1654597db740153a1288d859a8a30a"), 0UL));
281 auto snapshot = state_ref.at(MerkleTreeId::PUBLIC_DATA_TREE);
284 std::make_pair(
bb::fr(
"0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9"), 128UL));
288 auto snapshot = state_ref.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE);
291 std::make_pair(
bb::fr(
"0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5"), 0UL));
300 auto snapshot = state_ref.at(MerkleTreeId::NULLIFIER_TREE);
303 std::make_pair(
bb::fr(
"0x1ec3788cd1c32e54d889d67fe29e481114f9d4afe9b44b229aa29d8ad528dd31"), 128UL));
307 auto snapshot = state_ref.at(MerkleTreeId::NOTE_HASH_TREE);
310 std::make_pair(
bb::fr(
"0x19581629b6133a7e6fb7b472992ed85cf2b33ee6a74109fd5323ffd2f12e4550"), 1UL));
314 auto snapshot = state_ref.at(MerkleTreeId::PUBLIC_DATA_TREE);
317 std::make_pair(
bb::fr(
"0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9"), 128UL));
321 auto snapshot = state_ref.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE);
324 std::make_pair(
bb::fr(
"0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5"), 0UL));
331 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
340 EXPECT_EQ(before_commit, after_commit);
345 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
348 std::vector tree_ids{ MerkleTreeId::NOTE_HASH_TREE, MerkleTreeId::L1_TO_L2_MESSAGE_TREE };
350 for (
auto tree_id : tree_ids) {
361 EXPECT_EQ(uncommitted.meta.size, initial.meta.size + 1);
362 EXPECT_NE(uncommitted.meta.root, initial.meta.root);
367 EXPECT_EQ(committed.meta.size, initial.meta.size);
368 EXPECT_EQ(committed.meta.root, initial.meta.root);
377 EXPECT_EQ(after_commit.meta.size, uncommitted.meta.size);
378 EXPECT_EQ(after_commit.meta.root, uncommitted.meta.root);
388 EXPECT_EQ(before_rollback.meta.size, after_commit.meta.size + 1);
389 EXPECT_NE(before_rollback.meta.root, after_commit.meta.root);
397 EXPECT_EQ(after_rollback.meta.size, after_commit.meta.size);
398 EXPECT_EQ(after_rollback.meta.root, after_commit.meta.root);
404 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
407 std::vector tree_ids{
408 MerkleTreeId::NOTE_HASH_TREE,
409 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
412 for (
auto tree_id : tree_ids) {
431 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
432 auto tree_id = MerkleTreeId::NULLIFIER_TREE;
435 auto predecessor_of_142 =
447 EXPECT_TRUE(test_leaf.has_value());
448 EXPECT_EQ(test_leaf.value(),
IndexedLeaf(test_nullifier, 0, 0));
450 auto predecessor_of_142_again =
455 EXPECT_EQ(predecessor_of_143,
469 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
470 auto tree_id = MerkleTreeId::NULLIFIER_TREE;
484 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
491 EXPECT_EQ(response.sorted_leaves, expected_sorted_leaves);
497 auto low_leaf = response.low_leaf_witness_data[0];
500 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
506 auto low_leaf = response.low_leaf_witness_data[1];
509 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
515 auto low_leaf = response.low_leaf_witness_data[2];
518 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
524 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
544 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
581 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
583 { MerkleTreeId::NULLIFIER_TREE,
584 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
585 { MerkleTreeId::NOTE_HASH_TREE,
586 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
587 { MerkleTreeId::PUBLIC_DATA_TREE,
588 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
589 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
590 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
596 EXPECT_EQ(status.
summary, expected);
606 for (
const auto& [tree_id, snapshot] : block_state_ref) {
607 EXPECT_EQ(state_ref.at(tree_id), snapshot);
613 EXPECT_EQ(blockNumbers.size(), 1);
614 EXPECT_EQ(blockNumbers[0], 1);
617 WorldStateRevision{ .forkId = CANONICAL_FORK_ID, .blockNumber = 2, .includeUncommitted = false },
618 MerkleTreeId::NOTE_HASH_TREE,
626 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
628 { MerkleTreeId::NULLIFIER_TREE,
629 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
630 { MerkleTreeId::NOTE_HASH_TREE,
631 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
632 { MerkleTreeId::PUBLIC_DATA_TREE,
633 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
634 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
635 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
644 for (
const auto& [tree_id, snapshot] : block_state_ref) {
645 EXPECT_NE(uncommitted_state_ref.at(tree_id), snapshot);
651 EXPECT_EQ(status.
summary, expected);
661 for (
const auto& [tree_id, snapshot] : block_state_ref) {
662 EXPECT_EQ(state_ref.at(tree_id), snapshot);
668 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
671 { MerkleTreeId::NULLIFIER_TREE,
672 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
673 { MerkleTreeId::NOTE_HASH_TREE,
674 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
675 { MerkleTreeId::PUBLIC_DATA_TREE,
676 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
677 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
678 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
688 for (
const auto& [tree_id, snapshot] : block_state_ref) {
689 EXPECT_EQ(uncommitted_state_ref.at(tree_id), snapshot);
695 EXPECT_EQ(status.
summary, expected);
700 for (
const auto& [tree_id, snapshot] : block_state_ref) {
701 EXPECT_EQ(state_ref.at(tree_id), snapshot);
707 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
709 { MerkleTreeId::NULLIFIER_TREE,
710 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
711 { MerkleTreeId::NOTE_HASH_TREE,
712 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
713 { MerkleTreeId::PUBLIC_DATA_TREE,
714 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
715 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
716 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
729 EXPECT_THROW(sync(), std::runtime_error);
734 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
736 { MerkleTreeId::NULLIFIER_TREE,
737 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
738 { MerkleTreeId::NOTE_HASH_TREE,
739 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
740 { MerkleTreeId::PUBLIC_DATA_TREE,
741 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
742 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
743 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
757 EXPECT_THROW(sync(), std::runtime_error);
762 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
766 EXPECT_EQ(block_state_ref, after_sync);
771 EXPECT_EQ(indices, expected);
776 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
785 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
792 .includeUncommitted =
true,
794 MerkleTreeId::ARCHIVE);
802 .includeUncommitted =
true,
804 MerkleTreeId::ARCHIVE);
806 EXPECT_EQ(canonical_archive_state_after.meta, canonical_archive_state_before.meta);
807 EXPECT_EQ(fork_archive_state_before.meta, canonical_archive_state_before.meta);
808 EXPECT_NE(fork_archive_state_after.meta, fork_archive_state_before.meta);
813 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
820 .includeUncommitted =
true,
822 MerkleTreeId::ARCHIVE);
828 auto canonical_archive_state_after_insert =
833 .includeUncommitted =
true,
835 MerkleTreeId::ARCHIVE);
837 EXPECT_EQ(fork_archive_state_before_insert.meta, canonical_archive_state_before.meta);
839 EXPECT_NE(canonical_archive_state_after_insert.meta, canonical_archive_state_before.meta);
840 EXPECT_NE(fork_archive_state_after_insert.meta, fork_archive_state_before_insert.meta);
841 EXPECT_NE(fork_archive_state_after_insert.meta, canonical_archive_state_after_insert.meta);
845 auto canonical_archive_state_after_commit =
850 .includeUncommitted =
false,
852 MerkleTreeId::ARCHIVE);
855 EXPECT_EQ(fork_archive_state_after_commit.meta.size, fork_archive_state_before_insert.meta.size);
856 EXPECT_EQ(fork_archive_state_after_commit.meta.root, fork_archive_state_before_insert.meta.root);
859 EXPECT_EQ(canonical_archive_state_after_commit.meta.root, canonical_archive_state_after_insert.meta.root);
860 EXPECT_EQ(canonical_archive_state_after_commit.meta.size, canonical_archive_state_after_insert.meta.size);
865 assert_leaf_value<bb::fr>(
871 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
887 ws.
sync_block(fork_state_ref, { 1 }, { 42 }, { 43 }, { { 129 } }, { { { 129, 1 } } });
894 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
897 { MerkleTreeId::NULLIFIER_TREE,
898 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
899 { MerkleTreeId::NOTE_HASH_TREE,
900 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
901 { MerkleTreeId::PUBLIC_DATA_TREE,
902 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
903 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
904 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
910 EXPECT_EQ(status.
summary, expected);
915 MerkleTreeId::NULLIFIER_TREE,
916 MerkleTreeId::NOTE_HASH_TREE,
917 MerkleTreeId::PUBLIC_DATA_TREE,
918 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
921 for (
const auto&
id : tree_ids) {
926 EXPECT_EQ(blockNumbers.size(), 1);
927 EXPECT_TRUE(blockNumbers[0].has_value());
928 EXPECT_EQ(blockNumbers[0].
value(), 1);
#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.
NullifierTreeLeafPreimage low_leaf
void hash(State &state) noexcept
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 fr hash_pair(const fr &lhs, const fr &rhs)
static fr hash(const std::vector< fr > &inputs)
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)