2#include "../fixtures.hpp"
3#include "../memory_tree.hpp"
4#include "../test_fixtures.hpp"
45 std::filesystem::create_directories(
_directory);
63 EXPECT_EQ(response.success,
true);
64 EXPECT_EQ(response.inner.meta.size, expected_size);
67 tree.get_meta_data(includeUncommitted, completion);
75 EXPECT_EQ(response.success,
true);
76 EXPECT_EQ(response.inner.meta.finalizedBlockHeight, expected_finalized_block);
79 tree.get_meta_data(
false, completion);
87 EXPECT_EQ(response.success,
true);
88 EXPECT_EQ(response.inner.meta.unfinalizedBlockHeight, expected_block_height);
91 tree.get_meta_data(
true, completion);
99 EXPECT_EQ(response.success,
true);
100 EXPECT_EQ(response.inner.meta.root, expected_root);
103 tree.get_meta_data(includeUncommitted, completion);
110 bool includeUncommitted =
true,
117 EXPECT_EQ(response.inner.path, expected_sibling_path);
129 bool includeUncommitted =
true,
136 EXPECT_TRUE(response.inner.leaf_paths[0].has_value());
137 EXPECT_EQ(response.inner.leaf_paths[0].value().path, expected_sibling_path);
138 EXPECT_EQ(response.inner.leaf_paths[0].value().index, expected_index);
142 tree.find_leaf_sibling_paths({
value }, includeUncommitted, completion);
150 bool expected_success =
true)
154 EXPECT_EQ(response.success, expected_success);
155 if (response.success) {
156 EXPECT_EQ(response.inner.path, expected_sibling_path);
169 bool expected_success =
true)
173 EXPECT_EQ(response.success, expected_success);
174 if (expected_success) {
175 EXPECT_TRUE(response.inner.leaf_paths[0].has_value());
176 EXPECT_EQ(response.inner.leaf_paths[0].value().path, expected_sibling_path);
177 EXPECT_EQ(response.inner.leaf_paths[0].value().index, expected_index);
181 tree.find_leaf_sibling_paths({
value }, blockNumber,
false, completion);
189 EXPECT_EQ(response.success, expected_success);
192 tree.commit(completion);
200 EXPECT_EQ(response.success, expected_success);
203 tree.remove_historic_block(blockNumber, completion);
211 EXPECT_EQ(response.success, expected_success);
214 tree.unwind_block(blockNumber, completion);
222 EXPECT_EQ(response.success,
true);
226 tree.add_value(
value, completion);
234 EXPECT_EQ(response.success,
true);
238 tree.add_values(values, completion);
245 auto completion = [&](
const Response& response) ->
void {
246 EXPECT_EQ(response.success, expected_success);
247 if (!response.success && expected_success) {
252 tree.finalize_block(blockNumber, completion);
259 bool expected_success,
260 bool expected_match =
true,
261 bool includeUncommitted =
true)
265 EXPECT_EQ(response.
success, expected_success);
266 if (response.
success && expected_match) {
267 EXPECT_EQ(response.
inner.leaf, leaf);
278 bool expected_success,
279 bool expected_match =
true,
280 bool includeUncommitted =
true)
284 EXPECT_EQ(response.
success, expected_success);
285 if (response.
success && expected_match) {
286 EXPECT_EQ(response.
inner.leaf, leaf);
298 for (
const auto& i : sibling_path) {
299 if (
index % 2 == 0) {
311 EXPECT_EQ(
hash, expected_root);
315 const std::vector<index_t>& indices,
320 blockNumbers = response.
inner.blockNumbers;
328 const std::vector<index_t>& indices,
333 blockNumbers = response.
inner.blockNumbers;
341 constexpr size_t depth = 10;
344 EXPECT_NO_THROW(
Store store(name, depth, db));
357 constexpr size_t depth = 10;
360 EXPECT_NO_THROW(
Store store(name, depth, db));
396 constexpr size_t depth = 10;
401 EXPECT_ANY_THROW(
Store store_wrong_name(
"Wrong name", depth, db));
402 EXPECT_ANY_THROW(
Store store_wrong_depth(name, depth + 1, db));
407 constexpr size_t depth = 3;
430 constexpr size_t depth = 4;
438 std::vector<fr> values;
440 for (uint32_t i = 0; i < 16; i++) {
445 std::stringstream ss;
446 ss <<
"Unable to append leaves to tree " << name <<
" new size: 17 max size: 16";
450 EXPECT_EQ(response.success,
false);
451 EXPECT_EQ(response.message, ss.str());
454 tree.add_value(
get_value(16), add_completion);
460 constexpr size_t depth = 4;
468 std::vector<fr> values;
470 for (uint32_t i = 0; i < 16; i++) {
477 std::string str =
"Unable to get leaf at index 17, leaf index out of tree range.";
480 EXPECT_EQ(response.success,
false);
481 EXPECT_EQ(response.message, str);
484 tree.get_leaf(17,
true, get_completion);
489 std::string str =
"Unable to get leaf at index 17 for block 1, leaf index out of tree range.";
492 EXPECT_EQ(response.success,
false);
493 EXPECT_EQ(response.message, str);
496 tree.get_leaf(17, 1,
true, get_completion);
504 constexpr size_t depth = 16;
507 std::filesystem::create_directories(directory);
521 fr empty_root = memdb.
root();
524 uint32_t num_values_to_add = 16 * 1024;
525 std::vector<fr> values;
526 for (uint32_t i = 0; i < num_values_to_add; i++) {
539 EXPECT_EQ(response.success,
false);
543 tree.commit(completion);
577 fr empty_root = memdb.
root();
607 constexpr size_t depth = 5;
677 constexpr size_t depth = 10;
705 constexpr size_t depth = 5;
719 check_find_leaf_index<fr, TreeType>(tree, {
fr(10) }, {
std::nullopt },
true,
false);
721 check_find_leaf_index<fr, TreeType>(tree, {
fr(15) }, {
std::nullopt },
true,
true);
722 check_find_leaf_index<fr, TreeType>(tree, {
fr(15) }, {
std::nullopt },
true,
false);
728 check_find_leaf_index<fr, TreeType>(tree, {
fr(40) }, {
std::nullopt },
true,
false);
729 check_find_leaf_index<fr, TreeType>(tree, {
fr(30) }, {
std::nullopt },
true,
false);
730 check_find_leaf_index<fr, TreeType>(tree, {
fr(20) }, {
std::nullopt },
true,
false);
734 std::vector<fr> values{ 15, 18, 26, 2 };
744 check_find_leaf_index<fr, TreeType>(tree, {
fr(18) }, {
std::nullopt },
true,
false);
748 values = { 16, 4, 19, 22 };
754 check_find_leaf_index_from<fr, TreeType>(tree, {
fr(19) }, 0, {
std::nullopt },
true,
false);
766 check_find_leaf_index_from<fr, TreeType>(tree, {
fr(18) }, 6, {
std::nullopt },
true,
true);
769 check_find_leaf_index_from<fr, TreeType>(tree, {
fr(18) }, 15, {
std::nullopt },
true,
true);
772 check_find_leaf_index_from<fr, TreeType>(tree, {
fr(88) }, 13, {
std::nullopt },
true,
false);
777 constexpr size_t depth = 10;
800 constexpr size_t depth = 3;
808 std::vector<fr> to_add;
810 for (
size_t i = 0; i < 4; ++i) {
825 constexpr size_t depth = 10;
833 std::vector<fr> to_add(32,
fr::zero());
836 for (
size_t i = 0; i < 32; ++i) {
851 constexpr size_t depth = 8;
859 std::vector<fr> to_add(32,
fr::zero());
862 for (
size_t i = 0; i < 32; ++i) {
868 check_find_leaf_index<fr, TreeType>(tree, { leaf }, {
std::nullopt },
true);
869 check_historic_find_leaf_index<fr, TreeType>(tree, { leaf }, 1, {
std::nullopt },
true);
870 check_find_leaf_index_from<fr, TreeType>(tree, { leaf }, 0, {
std::nullopt },
true);
871 check_historic_find_leaf_index_from<fr, TreeType>(tree, { leaf }, 1, 0, {
std::nullopt },
true);
876 constexpr size_t depth = 10;
884 auto check = [&](
index_t expected_size,
index_t expected_unfinalized_block_height) {
892 constexpr uint32_t num_blocks = 10;
893 constexpr uint32_t batch_size = 4;
894 for (uint32_t i = 0; i < num_blocks; i++) {
895 std::vector<fr> to_add;
897 for (
size_t j = 0; j < batch_size; ++j) {
898 size_t ind = i * batch_size + j;
902 index_t expected_size = (i + 1) * batch_size;
904 check(expected_size, i);
906 check(expected_size, i + 1);
913 constexpr size_t depth = 10;
921 auto check = [&](
index_t expected_size,
index_t expected_unfinalized_block_height) {
929 std::vector<size_t> batchSize = { 8, 20, 64, 32 };
932 for (uint32_t i = 0; i < batchSize.size(); i++) {
933 std::vector<fr> to_add;
935 for (
size_t j = 0; j < batchSize[i]; ++j) {
936 size_t ind = expected_size + j;
940 expected_size += batchSize[i];
942 check(expected_size, i);
944 check(expected_size, i + 1);
951 constexpr size_t depth = 10;
959 constexpr uint32_t num_blocks = 10;
960 constexpr uint32_t batch_size = 4;
965 auto check = [&](
index_t expected_size,
index_t expected_unfinalized_block_height) {
972 for (uint32_t i = 0; i < historicPathsZeroIndex.size(); i++) {
975 index_t maxSizeAtBlock = ((i + 1) * batch_size) - 1;
978 tree,
get_value(maxSizeAtBlock), historicPathsMaxIndex[i], maxSizeAtBlock, i + 1);
982 for (uint32_t i = 0; i < num_blocks; i++) {
983 std::vector<fr> to_add;
985 for (
size_t j = 0; j < batch_size; ++j) {
986 size_t ind = i * batch_size + j;
990 index_t expected_size = (i + 1) * batch_size;
992 check(expected_size, i);
994 check(expected_size, i + 1);
1002 constexpr size_t depth = 10;
1010 constexpr uint32_t num_blocks = 10;
1011 constexpr uint32_t batch_size = 4;
1013 for (uint32_t i = 0; i < num_blocks; i++) {
1014 std::vector<fr> to_add;
1016 for (
size_t j = 0; j < batch_size; ++j) {
1017 size_t ind = i * batch_size + j;
1025 uint64_t block_tree_size = 0;
1027 for (uint32_t i = 0; i < num_blocks; i++) {
1028 tree.get_meta_data(i + 1,
false, [&](
auto response) ->
void { block_tree_size = response.inner.meta.size; });
1029 for (uint32_t j = 0; j < num_blocks; j++) {
1030 index_t indexToQuery = j * batch_size;
1032 check_historic_leaf(tree, i + 1, expectedLeaf, indexToQuery, indexToQuery <= block_tree_size,
true,
false);
1039 constexpr size_t depth = 5;
1046 std::vector<fr> values{ 30, 10, 20, 40 };
1051 values = { 15, 18, 26, 2 };
1056 values = { 16, 4, 19, 22 };
1060 check_historic_find_leaf_index<fr, TreeType>(tree, {
fr(26) }, 1, {
std::nullopt },
true);
1065 check_historic_find_leaf_index_from<fr, TreeType>(tree, {
fr(18) }, 1, 2, {
std::nullopt },
true,
false);
1069 check_historic_find_leaf_index_from<fr, TreeType>(tree, {
fr(19) }, 2, 6, {
std::nullopt },
true,
false);
1081 constexpr size_t depth = 3;
1092 for (
size_t i = 0; i < 8; i++) {
1104 constexpr size_t depth = 10;
1110 uint32_t num_reads = 16 * 1024;
1122 Signal signal(1 + num_reads);
1126 tree.commit(commit_completion);
1128 tree.add_value(
get_value(0), add_completion);
1130 for (
size_t i = 0; i < num_reads; i++) {
1132 paths[i] = response.inner.path;
1140 for (
auto& path : paths) {
1141 EXPECT_TRUE(path == initial_path || path == final_sibling_path);
1147 constexpr size_t depth = 3;
1168 constexpr size_t depth = 4;
1184 tree.get_subtree_sibling_path(
1188 EXPECT_EQ(resp.inner.path, expected_sibling_path);
1197 tree.get_subtree_sibling_path(
1201 EXPECT_EQ(resp.inner.path, expected_sibling_path);
1211 constexpr size_t depth = 5;
1221 std::vector<fr> values{ 30, 10, 20, 40 };
1223 for (
auto v : values) {
1233 values = { 15, 18, 26, 2 };
1235 for (
auto v : values) {
1243 fr block2Root = memdb.
root();
1248 values = { 16, 4, 18, 22 };
1250 for (
auto v : values) {
1274 check_find_leaf_index<fr, TreeType>(treeAtBlock2, {
fr(4) }, {
std::nullopt },
true);
1291 check_historic_find_leaf_index<fr, TreeType>(treeAtBlock2, {
fr(16) }, 2, {
std::nullopt },
true,
false);
1293 check_historic_find_leaf_index_from<fr, TreeType>(treeAtBlock2, {
fr(18) }, 1, 3, {
std::nullopt },
true,
false);
1304 constexpr size_t depth = 10;
1312 constexpr uint32_t numBlocks = 50;
1313 constexpr uint32_t batchSize = 16;
1314 constexpr uint32_t windowSize = 8;
1318 std::vector<fr> roots;
1320 auto check = [&](
index_t expectedSize,
index_t expectedBlockHeight) {
1327 for (uint32_t i = 0; i < historicPathsZeroIndex.size(); i++) {
1330 const bool expectedSuccess =
1331 expectedBlockHeight <= windowSize || blockNumber > (expectedBlockHeight - windowSize);
1333 index_t maxSizeAtBlock = ((i + 1) * batchSize) - 1;
1343 for (uint32_t i = 0; i < numBlocks; i++) {
1344 std::vector<fr> to_add;
1346 for (
size_t j = 0; j < batchSize; ++j) {
1347 size_t ind = i * batchSize + j;
1351 index_t expected_size = (i + 1) * batchSize;
1353 check(expected_size, i);
1360 historicPathsMaxIndex.push_back(memdb.
get_sibling_path(expected_size - 1));
1361 roots.push_back(memdb.
root());
1364 if (i >= windowSize) {
1369 if (oldestBlock > 1) {
1374 fr rootToRemove = roots[oldestBlock - 1];
1383 check(expected_size, i + 1);
1393 uint64_t maxReaders,
1397 uint32_t numBlocksToUnwind,
1398 std::vector<fr> values)
1406 uint32_t batchSize = blockSize;
1410 std::vector<fr> roots;
1412 fr initialRoot = memdb.
root();
1415 for (uint32_t i = 0; i < numBlocks; i++) {
1416 std::vector<fr> to_add;
1418 for (
size_t j = 0; j < batchSize; ++j) {
1419 size_t ind = i * batchSize + j;
1421 to_add.push_back(values[ind]);
1423 index_t expected_size = (i + 1) * batchSize;
1437 historicPathsMaxIndex.push_back(memdb.
get_sibling_path(expected_size - 1));
1438 roots.push_back(memdb.
root());
1447 const uint32_t blocksToRemove = numBlocksToUnwind;
1448 for (uint32_t i = 0; i < blocksToRemove; i++) {
1456 if (blockNumber > 1) {
1463 const auto last = roots.begin() + long(blockNumber - 1);
1465 std::find_if(roots.begin(), last, [=](
const fr& r) ->
bool { return r == roots[blockNumber - 1]; });
1468 const index_t previousValidBlock = blockNumber - 1;
1469 index_t deletedBlockStartIndex = previousValidBlock * batchSize;
1473 check_root(tree, previousValidBlock == 0 ? initialRoot : roots[previousValidBlock - 1]);
1478 previousValidBlock == 0 ? initialPath : historicPathsZeroIndex[previousValidBlock - 1],
1483 check_leaf(tree, values[1 + deletedBlockStartIndex], 1 + deletedBlockStartIndex,
true,
false);
1484 check_find_leaf_index<fr, TreeType>(tree, { values[1 + deletedBlockStartIndex] }, {
std::nullopt },
true);
1488 bool expectedSuccess = historicBlockNumber <= previousValidBlock;
1490 index_t maxSizeAtBlock = ((j + 1) * batchSize) - 1;
1492 tree, maxSizeAtBlock, historicPathsMaxIndex[j], historicBlockNumber, expectedSuccess);
1495 check_historic_leaf(tree, historicBlockNumber, values[leafIndex], leafIndex, expectedSuccess);
1498 if (expectedSuccess) {
1499 if (values[leafIndex] !=
fr::zero()) {
1507 check_historic_find_leaf_index<fr, TreeType>(
1508 tree, { values[leafIndex] }, historicBlockNumber, expected_results, expectedSuccess);
1509 check_historic_find_leaf_index_from<fr, TreeType>(
1510 tree, { values[leafIndex] }, historicBlockNumber, 0, expected_results, expectedSuccess);
1517 std::vector<fr> first = create_values(1024);
1518 test_unwind(_directory,
"DB", _mapSize, _maxReaders, 10, 16, 16, 8, first);
1523 std::vector<fr> first = create_values(1024);
1524 test_unwind(_directory,
"DB", _mapSize, _maxReaders, 10, 16, 16, 16, first);
1525 std::vector<fr> second = create_values(1024);
1526 test_unwind(_directory,
"DB", _mapSize, _maxReaders, 10, 16, 16, 16, second);
1531 const size_t block_size = 16;
1532 const uint32_t num_blocks = 16;
1534 std::vector<fr> first(1024,
fr::zero());
1535 test_unwind(_directory,
"DB", _mapSize, _maxReaders, 10, block_size, num_blocks, num_blocks, first);
1537 std::vector<fr> second = create_values(1024);
1539 for (
size_t i = 0; i < block_size; i++) {
1542 test_unwind(_directory,
"DB", _mapSize, _maxReaders, 10, block_size, num_blocks, num_blocks, second);
1545 std::vector<fr> third = create_values(1024);
1546 size_t offset = block_size * 2;
1547 for (
size_t i = 0; i < block_size * 2; i++) {
1550 test_unwind(_directory,
"DB", _mapSize, _maxReaders, 10, block_size, num_blocks, num_blocks, third);
1553 std::vector<fr> fourth = create_values(1024);
1554 test_unwind(_directory,
"DB", _mapSize, _maxReaders, 10, block_size, num_blocks, num_blocks, fourth);
1560 constexpr uint32_t numBlocks = 4;
1561 constexpr uint32_t numBlocksToUnwind = 2;
1562 std::vector<uint32_t> blockSizes = { 2, 4, 8, 16, 32 };
1563 for (
const uint32_t& size : blockSizes) {
1564 uint32_t actualSize = size * 1024;
1565 std::vector<fr> values = create_values(actualSize * numBlocks);
1566 std::stringstream ss;
1567 ss <<
"DB " << actualSize;
1568 test_unwind(_directory, ss.str(), _mapSize, _maxReaders, 20, actualSize, numBlocks, numBlocksToUnwind, values);
1575 constexpr uint32_t depth = 10;
1585 uint32_t batchSize = 64;
1589 values.emplace_back();
1591 values.emplace_back();
1593 values.push_back(create_values(batchSize));
1595 values.emplace_back();
1596 values.emplace_back();
1598 values.push_back(create_values(batchSize));
1602 for (
auto& blockValues : values) {
1606 for (
const auto& blockValue : blockValues) {
1619 while (blockNumber > 0) {
1627 if (blockNumber > 0) {
1637 constexpr uint32_t depth = 10;
1647 uint32_t batchSize = 64;
1651 values.emplace_back();
1653 values.emplace_back();
1655 values.push_back(create_values(batchSize));
1657 values.emplace_back();
1658 values.emplace_back();
1660 values.push_back(create_values(batchSize));
1664 for (
auto& blockValues : values) {
1668 for (
const auto& blockValue : blockValues) {
1683 while (blockToRemove < blockNumber) {
1699 constexpr uint32_t depth = 10;
1705 const size_t block_size = 32;
1707 for (
size_t i = 0; i < 5; i++) {
1708 std::vector<fr> values = create_values(block_size);
1712 std::vector<index_t> indices{ 12, 33, 63, 64, 65, 80, 96, 159, 160 };
1717 EXPECT_EQ(blockNumbers.size(), indices.size());
1719 index_t maxIndex = 5 * block_size - 1;
1720 for (
size_t i = 0; i < blockNumbers.size(); i++) {
1721 bool present = indices[i] <= maxIndex;
1724 EXPECT_EQ(blockNumbers[i].
value(), expected);
1726 EXPECT_EQ(blockNumbers[i].has_value(), present);
1731 EXPECT_EQ(blockNumbers.size(), indices.size());
1733 maxIndex = 2 * block_size - 1;
1734 for (
size_t i = 0; i < blockNumbers.size(); i++) {
1735 bool present = indices[i] <= maxIndex;
1738 EXPECT_EQ(blockNumbers[i].
value(), expected);
1740 EXPECT_EQ(blockNumbers[i].has_value(), present);
1747 EXPECT_EQ(blockNumbers.size(), indices.size());
1748 maxIndex = 3 * block_size - 1;
1749 for (
size_t i = 0; i < blockNumbers.size(); i++) {
1750 bool present = indices[i] <= maxIndex;
1753 EXPECT_EQ(blockNumbers[i].
value(), expected);
1755 EXPECT_EQ(blockNumbers[i].has_value(), present);
1764 EXPECT_EQ(blockNumbers.size(), indices.size());
1766 maxIndex = block_size - 1;
1767 for (
size_t i = 0; i < blockNumbers.size(); i++) {
1768 bool present = indices[i] <= maxIndex;
1771 EXPECT_EQ(blockNumbers[i].
value(), expected);
1773 EXPECT_EQ(blockNumbers[i].has_value(), present);
1778 EXPECT_EQ(blockNumbers.size(), indices.size());
1780 maxIndex = block_size - 1;
1781 for (
size_t i = 0; i < blockNumbers.size(); i++) {
1782 bool present = indices[i] <= maxIndex;
1785 EXPECT_EQ(blockNumbers[i].
value(), expected);
1787 EXPECT_EQ(blockNumbers[i].has_value(), present);
1794 constexpr uint32_t depth = 10;
1801 uint32_t blockSize = 16;
1802 uint32_t numBlocks = 16;
1803 uint32_t finalizedBlockDelay = 4;
1804 std::vector<fr> values = create_values(blockSize * numBlocks);
1806 for (uint32_t i = 0; i < numBlocks; i++) {
1807 std::vector<fr> to_add;
1809 for (
size_t j = 0; j < blockSize; ++j) {
1810 size_t ind = i * blockSize + j;
1812 to_add.push_back(values[ind]);
1817 block_number_t expectedFinalizedBlock = i < finalizedBlockDelay ? 0 : i - finalizedBlockDelay;
1820 if (i >= finalizedBlockDelay) {
1838 constexpr uint32_t depth = 10;
1845 uint32_t blockSize = 16;
1846 uint32_t numBlocks = 16;
1847 std::vector<fr> values = create_values(blockSize * numBlocks);
1849 for (uint32_t i = 0; i < numBlocks; i++) {
1850 std::vector<fr> to_add;
1852 for (
size_t j = 0; j < blockSize; ++j) {
1853 size_t ind = i * blockSize + j;
1855 to_add.push_back(values[ind]);
1871 constexpr uint32_t depth = 10;
1878 uint32_t blockSize = 16;
1879 uint32_t numBlocks = 16;
1880 std::vector<fr> values = create_values(blockSize * numBlocks);
1885 for (uint32_t i = 0; i < numBlocks; i++) {
1886 std::vector<fr> to_add;
1888 for (
size_t j = 0; j < blockSize; ++j) {
1889 size_t ind = i * blockSize + j;
1891 to_add.push_back(values[ind]);
1911 uint32_t depth = 20;
1917 for (uint32_t i = 0; i < 5; i++) {
1918 std::vector<fr> values = create_values(1024);
1926 EXPECT_THROW(
Store(name, depth, 5, db), std::runtime_error);
1927 EXPECT_THROW(
Store(name, depth, 4, db), std::runtime_error);
1933 uint32_t depth = 20;
1939 for (uint32_t i = 0; i < 5; i++) {
1940 std::vector<fr> values = create_values(1024);
1949 EXPECT_THROW(
Store(name, depth, 1, db), std::runtime_error);
1950 EXPECT_THROW(
Store(name, depth, 2, db), std::runtime_error);
1955 uint32_t depth = 20;
1962 uint32_t numBlocks = 5;
1964 const fr initialRoot = memdb.
root();
1967 for (uint32_t i = 0; i < numBlocks; i++) {
1968 std::vector<fr> values = create_values(1024);
1975 EXPECT_NO_THROW(
Store(name, depth, 0, db));
1987 constexpr uint32_t depth = 10;
1994 uint32_t blockSize = 16;
1995 uint32_t numBlocks = 16;
1996 std::vector<fr> values = create_values(blockSize * numBlocks);
1998 for (uint32_t i = 0; i < numBlocks; i++) {
1999 std::vector<fr> to_add;
2001 for (
size_t j = 0; j < blockSize; ++j) {
2002 size_t ind = i * blockSize + j;
2004 to_add.push_back(values[ind]);
2016 for (uint32_t i = numBlocks; i > blockToFinalize; i--) {
2025 constexpr uint32_t depth = 10;
2032 uint32_t blockSize = 16;
2033 uint32_t numBlocks = 16;
2034 std::vector<fr> values = create_values(blockSize * numBlocks);
2036 for (uint32_t i = 0; i < numBlocks; i++) {
2037 std::vector<fr> to_add;
2039 for (
size_t j = 0; j < blockSize; ++j) {
2040 size_t ind = i * blockSize + j;
2042 to_add.push_back(values[ind]);
2054 for (uint32_t i = 0; i < blockToFinalize - 1; i++) {
2062 constexpr size_t depth = 10;
2063 uint32_t blockSize = 16;
2073 std::vector<fr> values = create_values(blockSize);
2084 uint32_t stackDepth = 20;
2089 std::vector<fr> values = create_values(blockSize);
2096 }
catch (std::exception& e) {
2103 std::vector<fr> values = create_values(blockSize);
2116 if (
index % 2 == 0) {
2118 checkpointIndex =
index - 1;
2128 std::vector<fr> values = create_values(blockSize);
2135 }
catch (std::exception& e) {
2142 std::vector<fr> values = create_values(blockSize);
2148 checkpointIndex =
index;
2154 if (
index % 2 == 0) {
2156 checkpointIndex =
index - 1;
2171 constexpr size_t depth = 10;
2172 uint32_t blockSize = 16;
2182 std::vector<fr> values = create_values(blockSize);
2193 uint32_t stackDepth = 20;
2198 std::vector<fr> values = create_values(blockSize);
2205 }
catch (std::exception& e) {
2223 constexpr size_t depth = 10;
2224 uint32_t blockSize = 16;
2234 std::vector<fr> values = create_values(blockSize);
2245 uint32_t stackDepth = 20;
2250 std::vector<fr> values = create_values(blockSize);
2257 }
catch (std::exception& e) {
static std::string _directory
static uint64_t _maxReaders
Implements a simple append-only merkle tree All methods are asynchronous unless specified as otherwis...
std::function< void(TypedResponse< CommitResponse > &)> CommitCallback
Serves as a key-value node store for merkle trees. Caches all changes in memory before persisting the...
std::shared_ptr< LMDBTreeStore > SharedPtr
fr update_element(size_t index, fr const &value)
fr get_node(uint32_t level, size_t index) const
fr_sibling_path get_sibling_path(size_t index) const
fr_sibling_path get_sibling_path(index_t index)
Used in parallel insertions in the the IndexedTree. Workers signal to other following workes as they ...
void signal_level(uint32_t level=0)
Signals that the given level has been passed.
void signal_decrement(uint32_t delta=1)
void wait_for_level(uint32_t level=0)
Causes the thread to wait until the required level has been signalled.
void check_historic_leaf(TreeType &tree, const block_number_t &blockNumber, const fr &leaf, index_t leaf_index, bool expected_success, bool expected_match=true, bool includeUncommitted=true)
void add_value(TreeType &tree, const fr &value)
void check_size(TreeType &tree, index_t expected_size, bool includeUncommitted=true)
void check_historic_sibling_path_by_value(TreeType &tree, fr value, fr_sibling_path expected_sibling_path, index_t expected_index, block_number_t blockNumber, bool expected_success=true)
void test_unwind(std::string directory, std::string name, uint64_t mapSize, uint64_t maxReaders, uint32_t depth, uint32_t blockSize, uint32_t numBlocks, uint32_t numBlocksToUnwind, std::vector< fr > values)
ContentAddressedCachedTreeStore< bb::fr > Store
void get_blocks_for_indices(TreeType &tree, const std::vector< index_t > &indices, std::vector< std::optional< block_number_t > > &blockNumbers)
void check_finalized_block_height(TreeType &tree, block_number_t expected_finalized_block)
void check_sibling_path_by_value(TreeType &tree, fr value, fr_sibling_path expected_sibling_path, index_t expected_index, bool includeUncommitted=true, bool expected_result=true)
void check_leaf(TreeType &tree, const fr &leaf, index_t leaf_index, bool expected_success, bool expected_match=true, bool includeUncommitted=true)
void check_block_height(TreeType &tree, index_t expected_block_height)
void remove_historic_block(TreeType &tree, const block_number_t &blockNumber, bool expected_success=true)
void unwind_block(TreeType &tree, const block_number_t &blockNumber, bool expected_success=true)
void add_values(TreeType &tree, const std::vector< fr > &values)
void finalize_block(TreeType &tree, const block_number_t &blockNumber, bool expected_success=true)
void check_historic_sibling_path(TreeType &tree, index_t index, fr_sibling_path expected_sibling_path, block_number_t blockNumber, bool expected_success=true)
void check_sibling_path(TreeType &tree, index_t index, fr_sibling_path expected_sibling_path, bool includeUncommitted=true, bool expected_result=true)
void commit_tree(TreeType &tree, bool expected_success=true)
void check_root(TreeType &tree, fr expected_root, bool includeUncommitted=true)
void hash(State &state) noexcept
void checkpoint_tree(TreeType &tree)
ThreadPoolPtr make_thread_pool(uint64_t numThreads)
void commit_all_tree_checkpoints(TreeType &tree, bool expected_success=true)
void rollback_tree(TreeType &tree)
const fr & get_value(size_t index)
const uint32_t NUM_VALUES
void check_historic_find_leaf_index_from(TypeOfTree &tree, const std::vector< LeafValueType > &leaves, block_number_t blockNumber, index_t start_index, const std::vector< std::optional< index_t > > &expected_indices, bool expected_success, bool includeUncommitted=true)
std::string random_temp_directory()
void check_find_leaf_index(TypeOfTree &tree, const std::vector< LeafValueType > &leaves, const std::vector< std::optional< index_t > > &expected_indices, bool expected_success, bool includeUncommitted=true)
void check_block_and_root_data(LMDBTreeStore::SharedPtr db, block_number_t blockNumber, fr root, bool expectedSuccess)
void check_find_leaf_index_from(TypeOfTree &tree, const std::vector< LeafValueType > &leaves, index_t start_index, const std::vector< std::optional< index_t > > &expected_indices, bool expected_success, bool includeUncommitted=true)
std::string random_string()
std::shared_ptr< ThreadPool > ThreadPoolPtr
void check_block_and_size_data(LMDBTreeStore::SharedPtr db, block_number_t blockNumber, index_t expectedSize, bool expectedSuccess)
void commit_checkpoint_tree(TreeType &tree, bool expected_success=true)
std::vector< fr > fr_sibling_path
void revert_checkpoint_tree(TreeType &tree, bool expected_success=true)
void revert_all_tree_checkpoints(TreeType &tree, bool expected_success=true)
void check_historic_find_leaf_index(TypeOfTree &tree, const std::vector< LeafValueType > &leaves, block_number_t blockNumber, const std::vector< std::optional< index_t > > &expected_indices, bool expected_success, bool includeUncommitted=true)
fr_sibling_path get_sibling_path(TypeOfTree &tree, index_t index, bool includeUncommitted=true, bool expected_success=true)
Entry point for Barretenberg command-line interface.
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 constexpr field zero()