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);
117 for (
const auto& node : sibling_path) {
118 if (
index % 2 == 0) {
130 EXPECT_EQ(
hash, root);
135 bool includeUncommitted,
137 MerkleTreeId::NOTE_HASH_TREE,
138 MerkleTreeId::PUBLIC_DATA_TREE,
139 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
140 MerkleTreeId::ARCHIVE })
143 for (
auto tree_id : trees) {
144 auto canonical_tree_info =
149 .includeUncommitted = includeUncommitted,
153 EXPECT_EQ(canonical_tree_info.meta, fork_tree_info.meta);
159 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
163 EXPECT_EQ(
info.meta.size, 128);
164 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::NULLIFIER_TREE));
165 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x1ec3788cd1c32e54d889d67fe29e481114f9d4afe9b44b229aa29d8ad528dd31"));
170 EXPECT_EQ(
info.meta.size, 0);
171 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::NOTE_HASH_TREE));
172 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x2ac5dda169f6bb3b9ca09bbac34e14c94d1654597db740153a1288d859a8a30a"));
177 EXPECT_EQ(
info.meta.size, 128);
178 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::PUBLIC_DATA_TREE));
179 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9"));
184 EXPECT_EQ(
info.meta.size, 0);
185 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE));
186 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5"));
191 EXPECT_EQ(
info.meta.size, 1);
192 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::ARCHIVE));
205 std::filesystem::create_directories(data_dir_prefilled);
216 initial_header_generator_point);
218 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
223 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
224 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
225 EXPECT_EQ(prefilled.meta.root,
info.meta.root);
231 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
232 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
233 EXPECT_EQ(prefilled.meta.root,
info.meta.root);
239 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
240 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
242 EXPECT_NE(prefilled.meta.root,
info.meta.root);
248 EXPECT_EQ(leaf.value().leaf, prefilled_values[0]);
253 EXPECT_EQ(leaf.value().leaf, prefilled_values[1]);
260 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
261 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
263 EXPECT_NE(prefilled.meta.root,
info.meta.root);
269 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
274 auto snapshot = state_ref.at(MerkleTreeId::NULLIFIER_TREE);
277 std::make_pair(
bb::fr(
"0x1ec3788cd1c32e54d889d67fe29e481114f9d4afe9b44b229aa29d8ad528dd31"), 128UL));
281 auto snapshot = state_ref.at(MerkleTreeId::NOTE_HASH_TREE);
284 std::make_pair(
bb::fr(
"0x2ac5dda169f6bb3b9ca09bbac34e14c94d1654597db740153a1288d859a8a30a"), 0UL));
288 auto snapshot = state_ref.at(MerkleTreeId::PUBLIC_DATA_TREE);
291 std::make_pair(
bb::fr(
"0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9"), 128UL));
295 auto snapshot = state_ref.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE);
298 std::make_pair(
bb::fr(
"0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5"), 0UL));
307 auto snapshot = state_ref.at(MerkleTreeId::NULLIFIER_TREE);
310 std::make_pair(
bb::fr(
"0x1ec3788cd1c32e54d889d67fe29e481114f9d4afe9b44b229aa29d8ad528dd31"), 128UL));
314 auto snapshot = state_ref.at(MerkleTreeId::NOTE_HASH_TREE);
317 std::make_pair(
bb::fr(
"0x19581629b6133a7e6fb7b472992ed85cf2b33ee6a74109fd5323ffd2f12e4550"), 1UL));
321 auto snapshot = state_ref.at(MerkleTreeId::PUBLIC_DATA_TREE);
324 std::make_pair(
bb::fr(
"0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9"), 128UL));
328 auto snapshot = state_ref.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE);
331 std::make_pair(
bb::fr(
"0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5"), 0UL));
338 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
347 EXPECT_EQ(before_commit, after_commit);
352 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
355 std::vector tree_ids{ MerkleTreeId::NOTE_HASH_TREE, MerkleTreeId::L1_TO_L2_MESSAGE_TREE };
357 for (
auto tree_id : tree_ids) {
368 EXPECT_EQ(uncommitted.meta.size, initial.meta.size + 1);
369 EXPECT_NE(uncommitted.meta.root, initial.meta.root);
374 EXPECT_EQ(committed.meta.size, initial.meta.size);
375 EXPECT_EQ(committed.meta.root, initial.meta.root);
384 EXPECT_EQ(after_commit.meta.size, uncommitted.meta.size);
385 EXPECT_EQ(after_commit.meta.root, uncommitted.meta.root);
395 EXPECT_EQ(before_rollback.meta.size, after_commit.meta.size + 1);
396 EXPECT_NE(before_rollback.meta.root, after_commit.meta.root);
404 EXPECT_EQ(after_rollback.meta.size, after_commit.meta.size);
405 EXPECT_EQ(after_rollback.meta.root, after_commit.meta.root);
411 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
414 std::vector tree_ids{
415 MerkleTreeId::NOTE_HASH_TREE,
416 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
419 for (
auto tree_id : tree_ids) {
438 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
439 auto tree_id = MerkleTreeId::NULLIFIER_TREE;
442 auto predecessor_of_142 =
454 EXPECT_TRUE(test_leaf.has_value());
455 EXPECT_EQ(test_leaf.value(),
IndexedLeaf(test_nullifier, 0, 0));
457 auto predecessor_of_142_again =
462 EXPECT_EQ(predecessor_of_143,
476 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
477 auto tree_id = MerkleTreeId::NULLIFIER_TREE;
491 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
498 EXPECT_EQ(response.sorted_leaves, expected_sorted_leaves);
504 auto low_leaf = response.low_leaf_witness_data[0];
507 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
513 auto low_leaf = response.low_leaf_witness_data[1];
516 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
522 auto low_leaf = response.low_leaf_witness_data[2];
525 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
531 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
551 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
588 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
590 { MerkleTreeId::NULLIFIER_TREE,
591 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
592 { MerkleTreeId::NOTE_HASH_TREE,
593 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
594 { MerkleTreeId::PUBLIC_DATA_TREE,
595 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
596 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
597 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
603 EXPECT_EQ(status.
summary, expected);
613 for (
const auto& [tree_id, snapshot] : block_state_ref) {
614 EXPECT_EQ(state_ref.at(tree_id), snapshot);
620 EXPECT_EQ(blockNumbers.size(), 1);
621 EXPECT_EQ(blockNumbers[0], 1);
624 WorldStateRevision{ .forkId = CANONICAL_FORK_ID, .blockNumber = 2, .includeUncommitted = false },
625 MerkleTreeId::NOTE_HASH_TREE,
633 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
635 { MerkleTreeId::NULLIFIER_TREE,
636 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
637 { MerkleTreeId::NOTE_HASH_TREE,
638 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
639 { MerkleTreeId::PUBLIC_DATA_TREE,
640 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
641 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
642 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
651 for (
const auto& [tree_id, snapshot] : block_state_ref) {
652 EXPECT_NE(uncommitted_state_ref.at(tree_id), snapshot);
658 EXPECT_EQ(status.
summary, expected);
668 for (
const auto& [tree_id, snapshot] : block_state_ref) {
669 EXPECT_EQ(state_ref.at(tree_id), snapshot);
675 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
678 { MerkleTreeId::NULLIFIER_TREE,
679 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
680 { MerkleTreeId::NOTE_HASH_TREE,
681 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
682 { MerkleTreeId::PUBLIC_DATA_TREE,
683 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
684 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
685 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
695 for (
const auto& [tree_id, snapshot] : block_state_ref) {
696 EXPECT_EQ(uncommitted_state_ref.at(tree_id), snapshot);
702 EXPECT_EQ(status.
summary, expected);
707 for (
const auto& [tree_id, snapshot] : block_state_ref) {
708 EXPECT_EQ(state_ref.at(tree_id), snapshot);
714 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
716 { MerkleTreeId::NULLIFIER_TREE,
717 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
718 { MerkleTreeId::NOTE_HASH_TREE,
719 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
720 { MerkleTreeId::PUBLIC_DATA_TREE,
721 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
722 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
723 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
736 EXPECT_THROW(sync(), std::runtime_error);
741 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
743 { MerkleTreeId::NULLIFIER_TREE,
744 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
745 { MerkleTreeId::NOTE_HASH_TREE,
746 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
747 { MerkleTreeId::PUBLIC_DATA_TREE,
748 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
749 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
750 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
764 EXPECT_THROW(sync(), std::runtime_error);
769 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
773 EXPECT_EQ(block_state_ref, after_sync);
778 EXPECT_EQ(indices, expected);
783 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
792 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
799 .includeUncommitted =
true,
801 MerkleTreeId::ARCHIVE);
809 .includeUncommitted =
true,
811 MerkleTreeId::ARCHIVE);
813 EXPECT_EQ(canonical_archive_state_after.meta, canonical_archive_state_before.meta);
814 EXPECT_EQ(fork_archive_state_before.meta, canonical_archive_state_before.meta);
815 EXPECT_NE(fork_archive_state_after.meta, fork_archive_state_before.meta);
820 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
827 .includeUncommitted =
true,
829 MerkleTreeId::ARCHIVE);
835 auto canonical_archive_state_after_insert =
840 .includeUncommitted =
true,
842 MerkleTreeId::ARCHIVE);
844 EXPECT_EQ(fork_archive_state_before_insert.meta, canonical_archive_state_before.meta);
846 EXPECT_NE(canonical_archive_state_after_insert.meta, canonical_archive_state_before.meta);
847 EXPECT_NE(fork_archive_state_after_insert.meta, fork_archive_state_before_insert.meta);
848 EXPECT_NE(fork_archive_state_after_insert.meta, canonical_archive_state_after_insert.meta);
852 auto canonical_archive_state_after_commit =
857 .includeUncommitted =
false,
859 MerkleTreeId::ARCHIVE);
862 EXPECT_EQ(fork_archive_state_after_commit.meta.size, fork_archive_state_before_insert.meta.size);
863 EXPECT_EQ(fork_archive_state_after_commit.meta.root, fork_archive_state_before_insert.meta.root);
866 EXPECT_EQ(canonical_archive_state_after_commit.meta.root, canonical_archive_state_after_insert.meta.root);
867 EXPECT_EQ(canonical_archive_state_after_commit.meta.size, canonical_archive_state_after_insert.meta.size);
872 assert_leaf_value<bb::fr>(
878 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
894 ws.
sync_block(fork_state_ref, { 1 }, { 42 }, { 43 }, { { 129 } }, { { { 129, 1 } } });
901 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
904 { MerkleTreeId::NULLIFIER_TREE,
905 {
fr(
"0x1a8a3172ecd372de7d144459831cfabf0496159a5defd0f2ecb8f5124f1717af"), 129 } },
906 { MerkleTreeId::NOTE_HASH_TREE,
907 {
fr(
"0x2496ae3983b59733967ef32aecb041134d5f17bd2b040def30e699432dcc8967"), 1 } },
908 { MerkleTreeId::PUBLIC_DATA_TREE,
909 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
910 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
911 {
fr(
"0x149be5d1559bbefa0006c5e55ed982c43a1db53848e2f59385523d0c40d74a94"), 1 } },
917 EXPECT_EQ(status.
summary, expected);
922 MerkleTreeId::NULLIFIER_TREE,
923 MerkleTreeId::NOTE_HASH_TREE,
924 MerkleTreeId::PUBLIC_DATA_TREE,
925 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
928 for (
const auto&
id : tree_ids) {
933 EXPECT_EQ(blockNumbers.size(), 1);
934 EXPECT_TRUE(blockNumbers[0].has_value());
935 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 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)