13#include <gtest/gtest.h>
17#include <unordered_map>
27 std::filesystem::create_directories(
data_dir);
38 { MerkleTreeId::NULLIFIER_TREE, 40 }, { MerkleTreeId::NOTE_HASH_TREE, 40 },
39 { MerkleTreeId::PUBLIC_DATA_TREE, 40 }, { MerkleTreeId::L1_TO_L2_MESSAGE_TREE, 39 },
40 { MerkleTreeId::ARCHIVE, 29 },
43 { MerkleTreeId::NULLIFIER_TREE, 128 },
44 { MerkleTreeId::PUBLIC_DATA_TREE, 128 },
51template <
typename Leaf>
56 EXPECT_EQ(leaf.has_value(),
exists);
59template <
typename Leaf>
64 const Leaf& expected_value)
67 EXPECT_EQ(leaf.has_value(),
true);
68 EXPECT_EQ(leaf.value(), expected_value);
71template <
typename Leaf>
77 EXPECT_EQ(indices.size(), 1);
78 EXPECT_EQ(indices[0].has_value(),
exists);
81template <
typename Leaf>
87 EXPECT_EQ(indices.size(), 1);
88 EXPECT_TRUE(indices[0].has_value());
89 if (!indices[0].has_value()) {
92 EXPECT_EQ(indices[0].
value(), expected_index);
98 EXPECT_EQ(
info.meta.size, expected_size);
108 for (
const auto& node : sibling_path) {
109 if (index % 2 == 0) {
121 EXPECT_EQ(
hash, root);
126 bool includeUncommitted,
128 MerkleTreeId::NOTE_HASH_TREE,
129 MerkleTreeId::PUBLIC_DATA_TREE,
130 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
131 MerkleTreeId::ARCHIVE })
134 for (
auto tree_id : trees) {
135 auto canonical_tree_info =
140 .includeUncommitted = includeUncommitted,
144 EXPECT_EQ(canonical_tree_info.meta, fork_tree_info.meta);
150 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
154 EXPECT_EQ(
info.meta.size, 128);
155 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::NULLIFIER_TREE));
156 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x0c499b373a1f0fe1b510a63563546d2d39e206895056a5af0143c5f30d639073"));
161 EXPECT_EQ(
info.meta.size, 0);
162 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::NOTE_HASH_TREE));
163 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x1fd848aa69e1633722fe249a5b7f53b094f1c9cef9f5c694b073fd1cc5850dfb"));
168 EXPECT_EQ(
info.meta.size, 128);
169 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::PUBLIC_DATA_TREE));
170 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9"));
175 EXPECT_EQ(
info.meta.size, 0);
176 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE));
177 EXPECT_EQ(
info.meta.root,
bb::fr(
"0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6"));
182 EXPECT_EQ(
info.meta.size, 1);
183 EXPECT_EQ(
info.meta.depth, tree_heights.at(MerkleTreeId::ARCHIVE));
196 std::filesystem::create_directories(data_dir_prefilled);
207 initial_header_generator_point);
209 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
214 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
215 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
216 EXPECT_EQ(prefilled.meta.root,
info.meta.root);
222 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
223 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
224 EXPECT_EQ(prefilled.meta.root,
info.meta.root);
230 EXPECT_EQ(prefilled.meta.size,
info.meta.size);
231 EXPECT_EQ(prefilled.meta.depth,
info.meta.depth);
233 EXPECT_NE(prefilled.meta.root,
info.meta.root);
239 EXPECT_EQ(leaf.value().leaf, prefilled_values[0]);
244 EXPECT_EQ(leaf.value().leaf, prefilled_values[1]);
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 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
265 auto snapshot = state_ref.at(MerkleTreeId::NULLIFIER_TREE);
268 std::make_pair(
bb::fr(
"0x0c499b373a1f0fe1b510a63563546d2d39e206895056a5af0143c5f30d639073"), 128UL));
272 auto snapshot = state_ref.at(MerkleTreeId::NOTE_HASH_TREE);
275 std::make_pair(
bb::fr(
"0x1fd848aa69e1633722fe249a5b7f53b094f1c9cef9f5c694b073fd1cc5850dfb"), 0UL));
279 auto snapshot = state_ref.at(MerkleTreeId::PUBLIC_DATA_TREE);
282 std::make_pair(
bb::fr(
"0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9"), 128UL));
286 auto snapshot = state_ref.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE);
289 std::make_pair(
bb::fr(
"0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6"), 0UL));
298 auto snapshot = state_ref.at(MerkleTreeId::NULLIFIER_TREE);
301 std::make_pair(
bb::fr(
"0x0c499b373a1f0fe1b510a63563546d2d39e206895056a5af0143c5f30d639073"), 128UL));
305 auto snapshot = state_ref.at(MerkleTreeId::NOTE_HASH_TREE);
308 std::make_pair(
bb::fr(
"0x0f031292dfc64353244dfc38871cbeac74ddbd03df4a0856c411bb1ddfb494f0"), 1UL));
312 auto snapshot = state_ref.at(MerkleTreeId::PUBLIC_DATA_TREE);
315 std::make_pair(
bb::fr(
"0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9"), 128UL));
319 auto snapshot = state_ref.at(MerkleTreeId::L1_TO_L2_MESSAGE_TREE);
322 std::make_pair(
bb::fr(
"0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6"), 0UL));
329 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
338 EXPECT_EQ(before_commit, after_commit);
343 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
346 std::vector tree_ids{ MerkleTreeId::NOTE_HASH_TREE, MerkleTreeId::L1_TO_L2_MESSAGE_TREE };
348 for (
auto tree_id : tree_ids) {
359 EXPECT_EQ(uncommitted.meta.size, initial.meta.size + 1);
360 EXPECT_NE(uncommitted.meta.root, initial.meta.root);
365 EXPECT_EQ(committed.meta.size, initial.meta.size);
366 EXPECT_EQ(committed.meta.root, initial.meta.root);
375 EXPECT_EQ(after_commit.meta.size, uncommitted.meta.size);
376 EXPECT_EQ(after_commit.meta.root, uncommitted.meta.root);
386 EXPECT_EQ(before_rollback.meta.size, after_commit.meta.size + 1);
387 EXPECT_NE(before_rollback.meta.root, after_commit.meta.root);
395 EXPECT_EQ(after_rollback.meta.size, after_commit.meta.size);
396 EXPECT_EQ(after_rollback.meta.root, after_commit.meta.root);
402 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
405 std::vector tree_ids{
406 MerkleTreeId::NOTE_HASH_TREE,
407 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
410 for (
auto tree_id : tree_ids) {
429 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
430 auto tree_id = MerkleTreeId::NULLIFIER_TREE;
433 auto predecessor_of_142 =
445 EXPECT_TRUE(test_leaf.has_value());
446 EXPECT_EQ(test_leaf.value(),
IndexedLeaf(test_nullifier, 0, 0));
448 auto predecessor_of_142_again =
453 EXPECT_EQ(predecessor_of_143,
467 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
468 auto tree_id = MerkleTreeId::NULLIFIER_TREE;
482 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
489 EXPECT_EQ(response.sorted_leaves, expected_sorted_leaves);
495 auto low_leaf = response.low_leaf_witness_data[0];
498 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
504 auto low_leaf = response.low_leaf_witness_data[1];
507 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
513 auto low_leaf = response.low_leaf_witness_data[2];
516 EXPECT_EQ(
low_leaf.leaf, expected_low_leaf);
522 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
542 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
579 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
581 { MerkleTreeId::NULLIFIER_TREE,
582 {
fr(
"0x187a19972150cd1e76d8201d720da7682fcf4d93ec6a3c7b0d84bbefde5bd927"), 129 } },
583 { MerkleTreeId::NOTE_HASH_TREE,
584 {
fr(
"0x2467e5f90736b4ea977e7d21cfb3714181e16b7d6cd867768b59e2ea90fa3eaf"), 1 } },
585 { MerkleTreeId::PUBLIC_DATA_TREE,
586 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
587 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
588 {
fr(
"0x24ffd0fab86555ab2e86cffc706d4cfb4b8c405c3966af805de954504ffc27ac"), 1 } },
594 EXPECT_EQ(status.
summary, expected);
604 for (
const auto& [tree_id, snapshot] : block_state_ref) {
605 EXPECT_EQ(state_ref.at(tree_id), snapshot);
611 EXPECT_EQ(blockNumbers.size(), 1);
612 EXPECT_EQ(blockNumbers[0], 1);
615 WorldStateRevision{ .forkId = CANONICAL_FORK_ID, .blockNumber = 2, .includeUncommitted = false },
616 MerkleTreeId::NOTE_HASH_TREE,
624 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
626 { MerkleTreeId::NULLIFIER_TREE,
627 {
fr(
"0x187a19972150cd1e76d8201d720da7682fcf4d93ec6a3c7b0d84bbefde5bd927"), 129 } },
628 { MerkleTreeId::NOTE_HASH_TREE,
629 {
fr(
"0x2467e5f90736b4ea977e7d21cfb3714181e16b7d6cd867768b59e2ea90fa3eaf"), 1 } },
630 { MerkleTreeId::PUBLIC_DATA_TREE,
631 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
632 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
633 {
fr(
"0x24ffd0fab86555ab2e86cffc706d4cfb4b8c405c3966af805de954504ffc27ac"), 1 } },
642 for (
const auto& [tree_id, snapshot] : block_state_ref) {
643 EXPECT_NE(uncommitted_state_ref.at(tree_id), snapshot);
649 EXPECT_EQ(status.
summary, expected);
659 for (
const auto& [tree_id, snapshot] : block_state_ref) {
660 EXPECT_EQ(state_ref.at(tree_id), snapshot);
666 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
669 { MerkleTreeId::NULLIFIER_TREE,
670 {
fr(
"0x187a19972150cd1e76d8201d720da7682fcf4d93ec6a3c7b0d84bbefde5bd927"), 129 } },
671 { MerkleTreeId::NOTE_HASH_TREE,
672 {
fr(
"0x2467e5f90736b4ea977e7d21cfb3714181e16b7d6cd867768b59e2ea90fa3eaf"), 1 } },
673 { MerkleTreeId::PUBLIC_DATA_TREE,
674 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
675 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
676 {
fr(
"0x24ffd0fab86555ab2e86cffc706d4cfb4b8c405c3966af805de954504ffc27ac"), 1 } },
686 for (
const auto& [tree_id, snapshot] : block_state_ref) {
687 EXPECT_EQ(uncommitted_state_ref.at(tree_id), snapshot);
693 EXPECT_EQ(status.
summary, expected);
698 for (
const auto& [tree_id, snapshot] : block_state_ref) {
699 EXPECT_EQ(state_ref.at(tree_id), snapshot);
705 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
707 { MerkleTreeId::NULLIFIER_TREE,
708 {
fr(
"0x187a19972150cd1e76d8201d720da7682fcf4d93ec6a3c7b0d84bbefde5bd927"), 129 } },
709 { MerkleTreeId::NOTE_HASH_TREE,
710 {
fr(
"0x2467e5f90736b4ea977e7d21cfb3714181e16b7d6cd867768b59e2ea90fa3eaf"), 1 } },
711 { MerkleTreeId::PUBLIC_DATA_TREE,
712 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
713 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
714 {
fr(
"0x24ffd0fab86555ab2e86cffc706d4cfb4b8c405c3966af805de954504ffc27ac"), 1 } },
727 EXPECT_THROW(sync(), std::runtime_error);
732 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
734 { MerkleTreeId::NULLIFIER_TREE,
735 {
fr(
"0x187a19972150cd1e76d8201d720da7682fcf4d93ec6a3c7b0d84bbefde5bd927"), 129 } },
736 { MerkleTreeId::NOTE_HASH_TREE,
737 {
fr(
"0x2467e5f90736b4ea977e7d21cfb3714181e16b7d6cd867768b59e2ea90fa3eaf"), 1 } },
738 { MerkleTreeId::PUBLIC_DATA_TREE,
739 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
740 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
741 {
fr(
"0x24ffd0fab86555ab2e86cffc706d4cfb4b8c405c3966af805de954504ffc27ac"), 1 } },
755 EXPECT_THROW(sync(), std::runtime_error);
760 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
764 EXPECT_EQ(block_state_ref, after_sync);
769 EXPECT_EQ(indices, expected);
774 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
783 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
790 .includeUncommitted =
true,
792 MerkleTreeId::ARCHIVE);
800 .includeUncommitted =
true,
802 MerkleTreeId::ARCHIVE);
804 EXPECT_EQ(canonical_archive_state_after.meta, canonical_archive_state_before.meta);
805 EXPECT_EQ(fork_archive_state_before.meta, canonical_archive_state_before.meta);
806 EXPECT_NE(fork_archive_state_after.meta, fork_archive_state_before.meta);
811 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
818 .includeUncommitted =
true,
820 MerkleTreeId::ARCHIVE);
826 auto canonical_archive_state_after_insert =
831 .includeUncommitted =
true,
833 MerkleTreeId::ARCHIVE);
835 EXPECT_EQ(fork_archive_state_before_insert.meta, canonical_archive_state_before.meta);
837 EXPECT_NE(canonical_archive_state_after_insert.meta, canonical_archive_state_before.meta);
838 EXPECT_NE(fork_archive_state_after_insert.meta, fork_archive_state_before_insert.meta);
839 EXPECT_NE(fork_archive_state_after_insert.meta, canonical_archive_state_after_insert.meta);
843 auto canonical_archive_state_after_commit =
848 .includeUncommitted =
false,
850 MerkleTreeId::ARCHIVE);
853 EXPECT_EQ(fork_archive_state_after_commit.meta.size, fork_archive_state_before_insert.meta.size);
854 EXPECT_EQ(fork_archive_state_after_commit.meta.root, fork_archive_state_before_insert.meta.root);
857 EXPECT_EQ(canonical_archive_state_after_commit.meta.root, canonical_archive_state_after_insert.meta.root);
858 EXPECT_EQ(canonical_archive_state_after_commit.meta.size, canonical_archive_state_after_insert.meta.size);
863 assert_leaf_value<bb::fr>(
869 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
885 ws.
sync_block(fork_state_ref, { 1 }, { 42 }, { 43 }, { { 129 } }, { { { 129, 1 } } });
892 WorldState ws(thread_pool_size, data_dir, map_size, tree_heights, tree_prefill, initial_header_generator_point);
895 { MerkleTreeId::NULLIFIER_TREE,
896 {
fr(
"0x187a19972150cd1e76d8201d720da7682fcf4d93ec6a3c7b0d84bbefde5bd927"), 129 } },
897 { MerkleTreeId::NOTE_HASH_TREE,
898 {
fr(
"0x2467e5f90736b4ea977e7d21cfb3714181e16b7d6cd867768b59e2ea90fa3eaf"), 1 } },
899 { MerkleTreeId::PUBLIC_DATA_TREE,
900 {
fr(
"0x0278dcf9ff541da255ee722aecfad849b66af0d42c2924d949b5a509f2e1aec9"), 129 } },
901 { MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
902 {
fr(
"0x24ffd0fab86555ab2e86cffc706d4cfb4b8c405c3966af805de954504ffc27ac"), 1 } },
908 EXPECT_EQ(status.
summary, expected);
913 MerkleTreeId::NULLIFIER_TREE,
914 MerkleTreeId::NOTE_HASH_TREE,
915 MerkleTreeId::PUBLIC_DATA_TREE,
916 MerkleTreeId::L1_TO_L2_MESSAGE_TREE,
919 for (
const auto&
id : tree_ids) {
924 EXPECT_EQ(blockNumbers.size(), 1);
925 EXPECT_TRUE(blockNumbers[0].has_value());
926 EXPECT_EQ(blockNumbers[0].
value(), 1);
#define GENESIS_ARCHIVE_ROOT
#define GENESIS_BLOCK_HEADER_HASH
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)