Skip to content

refactor(PR #11): rework Merkle tree layer and error type, remove sled and pmtree utilities, migrate to pmtree v3, fix override_range bug, generic PmTree<D,H> struct for any persistent backend#421

Merged
vinhtc27 merged 20 commits into
develop/v3.0.0from
refactor/pr11-merkle-tree-update
Jul 3, 2026

Conversation

@vinhtc27

@vinhtc27 vinhtc27 commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

This PR need the this new release of pmtree vacp2p/pmtree#6

Changes: All the changes related to merkle tree impl in Zerokit

  • Moved the sled-backed PmTree into rln module, utils module is now apure, storage-agnostic Merkle-tree crate with no sled/pmtree dependency.
  • Make PmTree generic over the pmtree Database backend via a PmTreeBackendConfig trait (Sled impl by default). Allow any custom impl for persistent layer (RocksDB, PostgreSQL,...) with minimal impl via Database trait.
  • ZerokitMerkleTree now has an associated Error type. The in-memory backends keep ZerokitMerkleTreeError, de-overloaded to one variant per condition; PmTree returns a structured PmTreeError that separates tree-logic errors (MerkleTree) from storage-backend faults (Backend), and pre-validates domain conditions so the same misuse yields the same variant on every backend. Callers match flat variants instead of nested enums (#343).
  • Adopted pmtree 3.0.0: PmTree writes (set/delete/update_next/override_range) are now crash-atomic (PR).
    - PmTree is now generic over the hash (PmTree<H> instead of a hardcoded PoseidonHash), so a future PoseidonHash2 can plug in. (Generic over both persistent backend anh hash (PmTree<D, H>)
  • Fixed override_range: replaced the per-tree span logic and its separate pre-validation pass (validate_override_range_inputs / EmptyIndicesPolicy in override_range_validation.rs, now deleted) with one shared default trait method — write the new leaves from start, reset only the delete-indices the write doesn't already cover (writes win on overlap), validate everything before touching the tree.
  • Fixed a bug where leaves landed at the wrong indices. Full/Optimal use the default; PmTree overrides it to apply the whole change in a single atomic commit.
  • Tests: value + cache + validation coverage for override_range across all three merkle tree.
  • Add TODO marked the RLN-math sites still calling Poseidon directly (id-commitment, nullifier, root recompute) for a later generic hash trait.
  • Fixed silence delete opt in Full/OptimalMerkleTree.

@vinhtc27 vinhtc27 changed the title refactor(PR 11): refactor(PR #11): rework Merkle tree layer and error type, remove sled and pmtree utilities, generic per-backend PmTree with new pmtree v3, fix override_range Jun 25, 2026
@vinhtc27 vinhtc27 changed the title refactor(PR #11): rework Merkle tree layer and error type, remove sled and pmtree utilities, generic per-backend PmTree with new pmtree v3, fix override_range refactor(PR #11): rework Merkle tree layer and error type, remove sled and pmtree utilities, migrate to pmtree v3, fix override_range bug Jun 25, 2026
@vinhtc27 vinhtc27 linked an issue Jun 25, 2026 that may be closed by this pull request
@vinhtc27
vinhtc27 requested a review from sydhds June 25, 2026 08:20
@vinhtc27 vinhtc27 self-assigned this Jun 25, 2026
Comment thread rln/src/protocol/serialize.rs Outdated
Comment thread rln/src/protocol/proof.rs Outdated
Comment thread rln/src/pm_tree.rs Outdated
Comment thread rln/src/pm_tree.rs Outdated
Comment thread rln/src/pm_tree.rs Outdated
Comment thread utils/src/merkle_tree/optimal_merkle_tree.rs
Comment thread utils/src/merkle_tree/full_merkle_tree.rs
Comment thread utils/src/merkle_tree/full_merkle_tree.rs
Comment thread utils/src/merkle_tree/full_merkle_tree.rs
Comment thread utils/src/merkle_tree/merkle_tree.rs Outdated
@vinhtc27
vinhtc27 requested a review from sydhds June 30, 2026 09:17
@github-actions

Copy link
Copy Markdown

Benchmark for 33613a0

Click to view benchmark
Test Base PR %
FullMerkleProof::compute_root_from 9.6±0.09µs 9.5±0.14µs -1.04%
FullMerkleTree::delete 20.9±0.27µs 20.5±0.42µs -1.91%
FullMerkleTree::get 0.9±0.01ns 0.9±0.01ns 0.00%
FullMerkleTree::get_empty_leaves_indices 1116.5±50.23µs 1569.4±10.63µs +40.56%
FullMerkleTree::get_subtree_root 10.7±0.06ns 10.7±0.09ns 0.00%
FullMerkleTree::override_range 2.1±0.02ms 2.1±0.02ms 0.00%
FullMerkleTree::proof 90.2±1.04ns 91.3±2.04ns +1.22%
FullMerkleTree::set 10.3±0.20µs 10.1±0.08µs -1.94%
FullMerkleTree::set_range 2.1±0.03ms 2.1±0.03ms 0.00%
FullMerkleTree::update_next 10.3±0.09µs 10.1±0.18µs -1.94%
FullMerkleTree::verify 9.6±0.18µs 9.5±0.16µs -1.04%
OptimalMerkleProof::compute_root_from 9.6±0.12µs 9.5±0.14µs -1.04%
OptimalMerkleTree::delete 24.4±0.21µs 23.5±0.37µs -3.69%
OptimalMerkleTree::get 35.4±1.26ns 36.6±1.21ns +3.39%
OptimalMerkleTree::get_empty_leaves_indices 1112.0±24.14µs 1110.3±7.48µs -0.15%
OptimalMerkleTree::get_subtree_root 24.7±0.35ns 25.1±0.35ns +1.62%
OptimalMerkleTree::override_range 4.1±0.07ms 4.1±0.13ms 0.00%
OptimalMerkleTree::proof 575.4±7.31ns 575.2±9.61ns -0.03%
OptimalMerkleTree::set 12.4±0.16µs 11.8±0.18µs -4.84%
OptimalMerkleTree::set_range 4.1±0.07ms 4.0±0.08ms -2.44%
OptimalMerkleTree::update_next 12.7±0.17µs 12.3±0.47µs -3.15%
OptimalMerkleTree::verify 9.7±0.18µs 9.6±0.16µs -1.03%
Poseidon::hash/10 152.3±0.95µs 64.1 KElem/sec N/A N/A
Poseidon::hash/100 1591.0±6.44µs 61.4 KElem/sec N/A N/A
Poseidon::hash/1000 16.8±0.03ms 58.1 KElem/sec N/A N/A
Poseidon::hash/single 15.2±0.03µs 62.8 MElem/sec N/A N/A
validate_override_range/FullMerkleTree/override_range/1024 527.2±16.56µs N/A N/A
validate_override_range/FullMerkleTree/override_range/64 79.2±2.21µs N/A N/A
validate_override_range/FullMerkleTree/override_range/65536 472.5±4.09ms N/A N/A
validate_override_range/FullMerkleTree/override_range/8192 9.3±0.05ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/1024 713.7±18.29µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/64 98.3±3.23µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/65536 500.1±8.62ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/8192 11.1±0.09ms N/A N/A
validate_override_range/validate_only/1024 9.3±0.04µs N/A N/A
validate_override_range/validate_only/64 378.2±4.94ns N/A N/A
validate_override_range/validate_only/65536 906.3±12.10µs N/A N/A
validate_override_range/validate_only/8192 93.6±1.04µs N/A N/A

@github-actions

Copy link
Copy Markdown

Benchmark for 33613a0

Click to view benchmark
Test Base PR %
PmTree::delete 1217.7±8.97µs 1376.2±15.93µs +13.02%
PmTree::get 644.0±55.31ns 506.5±14.87ns -21.35%
PmTree::get_empty_leaves_indices 61.4±0.92µs 61.5±1.15µs +0.16%
PmTree::get_subtree_root 386.3±8.28ns 383.6±5.87ns -0.70%
PmTree::override_range 259.4±2.06ms 258.4±2.18ms -0.39%
PmTree::proof 9.6±0.26µs 9.6±0.22µs 0.00%
PmTree::set 548.9±8.39µs 677.2±7.10µs +23.37%
PmTree::set_range 259.6±3.40ms 250.7±3.38ms -3.43%
PmTree::update_next 625.2±8.39µs 13.7±7.59ms +2091.30%
PmTree::verify 515.9±5.13µs 507.0±6.41µs -1.73%
PmTreeProof::compute_root_from 515.8±4.71µs 505.0±9.85µs -2.09%
RLN::finish_proof 68.4±1.05ms 68.7±0.94ms +0.44%
RLN::generate_partial_proof 128.2±1.35ms 129.8±2.80ms +1.25%
RLN::generate_proof 187.9±7.10ms 188.5±1.75ms +0.32%

@vinhtc27 vinhtc27 changed the title refactor(PR #11): rework Merkle tree layer and error type, remove sled and pmtree utilities, migrate to pmtree v3, fix override_range bug refactor(PR #11): rework Merkle tree layer and error type, remove sled and pmtree utilities, migrate to pmtree v3, fix override_range bug, generic pmtree struct for any persistent backend Jun 30, 2026
@vinhtc27 vinhtc27 changed the title refactor(PR #11): rework Merkle tree layer and error type, remove sled and pmtree utilities, migrate to pmtree v3, fix override_range bug, generic pmtree struct for any persistent backend refactor(PR #11): rework Merkle tree layer and error type, remove sled and pmtree utilities, migrate to pmtree v3, fix override_range bug, generic PmTree<D,H> struct for any persistent backend Jun 30, 2026
@github-actions

Copy link
Copy Markdown

Benchmark for 279b96a

Click to view benchmark
Test Base PR %
FullMerkleProof::compute_root_from 8.5±0.25µs 8.4±0.12µs -1.18%
FullMerkleTree::delete 18.0±0.22µs 18.1±0.46µs +0.56%
FullMerkleTree::get 0.8±0.02ns 0.8±0.01ns 0.00%
FullMerkleTree::get_empty_leaves_indices 983.4±10.04µs 1314.6±8.73µs +33.68%
FullMerkleTree::get_subtree_root 9.8±0.08ns 9.9±0.29ns +1.02%
FullMerkleTree::override_range 1928.1±34.25µs 1913.3±48.08µs -0.77%
FullMerkleTree::proof 88.3±0.61ns 88.3±1.58ns 0.00%
FullMerkleTree::set 8.9±0.22µs 8.9±0.26µs 0.00%
FullMerkleTree::set_range 1894.1±71.65µs 1876.2±48.20µs -0.95%
FullMerkleTree::update_next 8.9±0.16µs 9.0±0.38µs +1.12%
FullMerkleTree::verify 8.6±0.08µs 8.4±0.12µs -2.33%
OptimalMerkleProof::compute_root_from 8.5±0.12µs 8.4±0.12µs -1.18%
OptimalMerkleTree::delete 21.0±0.78µs 20.7±0.33µs -1.43%
OptimalMerkleTree::get 51.5±0.77ns 53.0±1.33ns +2.91%
OptimalMerkleTree::get_empty_leaves_indices 983.2±8.89µs 986.8±16.60µs +0.37%
OptimalMerkleTree::get_subtree_root 26.3±0.42ns 26.1±0.34ns -0.76%
OptimalMerkleTree::override_range 5.0±0.37ms 5.2±0.23ms +4.00%
OptimalMerkleTree::proof 672.6±18.11ns 666.4±18.65ns -0.92%
OptimalMerkleTree::set 10.6±0.24µs 10.5±0.22µs -0.94%
OptimalMerkleTree::set_range 5.2±0.16ms 5.0±0.34ms -3.85%
OptimalMerkleTree::update_next 10.9±0.66µs 10.8±0.70µs -0.92%
OptimalMerkleTree::verify 8.6±0.08µs 8.5±0.21µs -1.16%
Poseidon::hash/10 140.8±0.81µs 69.4 KElem/sec N/A N/A
Poseidon::hash/100 1509.6±7.74µs 64.7 KElem/sec N/A N/A
Poseidon::hash/1000 15.2±0.06ms 64.2 KElem/sec N/A N/A
Poseidon::hash/single 14.0±0.31µs 68.1 MElem/sec N/A N/A
validate_override_range/FullMerkleTree/override_range/1024 484.0±11.86µs N/A N/A
validate_override_range/FullMerkleTree/override_range/64 69.9±2.15µs N/A N/A
validate_override_range/FullMerkleTree/override_range/65536 432.6±3.90ms N/A N/A
validate_override_range/FullMerkleTree/override_range/8192 8.6±0.06ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/1024 670.2±16.64µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/64 99.4±8.87µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/65536 456.6±4.36ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/8192 9.9±0.10ms N/A N/A
validate_override_range/validate_only/1024 8.3±0.12µs N/A N/A
validate_override_range/validate_only/64 362.1±5.30ns N/A N/A
validate_override_range/validate_only/65536 862.3±7.70µs N/A N/A
validate_override_range/validate_only/8192 115.2±2.05µs N/A N/A

@github-actions

Copy link
Copy Markdown

Benchmark for 279b96a

Click to view benchmark
Test Base PR %
PmTree::delete 1210.2±10.51µs 1536.3±14.31µs +26.95%
PmTree::get 593.0±55.32ns 667.4±48.40ns +12.55%
PmTree::get_empty_leaves_indices 61.5±1.18µs 61.5±1.70µs 0.00%
PmTree::get_subtree_root 380.9±5.59ns 391.9±7.58ns +2.89%
PmTree::override_range 257.4±3.65ms 133.9±3.87ms -47.98%
PmTree::proof 9.3±0.25µs 9.4±0.38µs +1.08%
PmTree::set 548.2±8.07µs 761.3±8.02µs +38.87%
PmTree::set_range 255.7±3.59ms 125.9±3.39ms -50.76%
PmTree::update_next 621.4±13.48µs 6.9±3.85ms +1010.40%
PmTree::verify 510.1±11.36µs 510.6±4.30µs +0.10%
PmTreeProof::compute_root_from 509.2±5.26µs 511.2±5.93µs +0.39%
RLN::finish_proof 68.2±0.80ms 68.7±0.93ms +0.73%
RLN::generate_partial_proof 129.2±1.40ms 129.2±2.86ms 0.00%
RLN::generate_proof 188.5±7.69ms 187.5±6.68ms -0.53%

@vinhtc27 vinhtc27 added the run-coverage Runs coverage report in CI once added to the open PR. label Jun 30, 2026
@github-actions

Copy link
Copy Markdown

Benchmark for da4b690

Click to view benchmark
Test Base PR %
PmTree::delete 1209.0±14.93µs 1540.1±12.19µs +27.39%
PmTree::get 510.0±7.12ns 501.9±9.11ns -1.59%
PmTree::get_empty_leaves_indices 61.5±0.99µs 61.5±1.75µs 0.00%
PmTree::get_subtree_root 383.7±5.83ns 381.2±12.04ns -0.65%
PmTree::override_range 254.0±3.37ms 122.1±3.46ms -51.93%
PmTree::proof 9.2±0.31µs 9.1±0.14µs -1.09%
PmTree::set 558.5±60.54µs 755.1±8.69µs +35.20%
PmTree::set_range 250.6±4.52ms 115.2±3.67ms -54.03%
PmTree::update_next 613.8±8.55µs 6.7±3.65ms +991.56%
PmTree::verify 510.7±5.75µs 516.7±26.41µs +1.17%
PmTreeProof::compute_root_from 510.1±8.04µs 510.4±6.02µs +0.06%
RLN::finish_proof 68.3±0.95ms 68.6±0.96ms +0.44%
RLN::generate_partial_proof 128.5±1.34ms 129.7±3.64ms +0.93%
RLN::generate_proof 186.5±1.60ms 189.2±7.04ms +1.45%

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown

Benchmark for 211657d

Click to view benchmark
Test Base PR %
FullMerkleProof::compute_root_from 8.4±0.12µs 8.5±0.12µs +1.19%
FullMerkleTree::delete 18.2±0.49µs 18.4±0.37µs +1.10%
FullMerkleTree::get 0.8±0.01ns 0.8±0.01ns 0.00%
FullMerkleTree::get_empty_leaves_indices 984.1±9.76µs 1314.8±20.94µs +33.60%
FullMerkleTree::get_subtree_root 9.8±0.13ns 9.9±0.08ns +1.02%
FullMerkleTree::override_range 1938.2±44.19µs 1923.3±45.79µs -0.77%
FullMerkleTree::proof 87.7±1.16ns 89.8±0.71ns +2.39%
FullMerkleTree::set 9.0±0.14µs 9.1±0.19µs +1.11%
FullMerkleTree::set_range 1894.8±50.39µs 1883.0±60.83µs -0.62%
FullMerkleTree::update_next 9.0±0.39µs 9.1±0.17µs +1.11%
FullMerkleTree::verify 8.4±0.11µs 8.6±0.17µs +2.38%
OptimalMerkleProof::compute_root_from 8.4±0.16µs 8.6±0.36µs +2.38%
OptimalMerkleTree::delete 21.1±0.24µs 21.3±0.22µs +0.95%
OptimalMerkleTree::get 52.0±0.72ns 54.2±2.19ns +4.23%
OptimalMerkleTree::get_empty_leaves_indices 985.4±12.83µs 987.6±15.28µs +0.22%
OptimalMerkleTree::get_subtree_root 26.1±0.41ns 26.6±1.10ns +1.92%
OptimalMerkleTree::override_range 4.2±0.44ms 4.9±0.27ms +16.67%
OptimalMerkleTree::proof 679.7±37.51ns 675.0±12.04ns -0.69%
OptimalMerkleTree::set 10.8±0.34µs 10.8±0.26µs 0.00%
OptimalMerkleTree::set_range 4.8±0.28ms 4.9±0.33ms +2.08%
OptimalMerkleTree::update_next 10.8±0.64µs 11.2±0.78µs +3.70%
OptimalMerkleTree::verify 8.5±0.07µs 8.6±0.13µs +1.18%
Poseidon::hash/10 140.5±0.23µs 69.5 KElem/sec N/A N/A
Poseidon::hash/100 1506.9±1.55µs 64.8 KElem/sec N/A N/A
Poseidon::hash/1000 15.2±0.01ms 64.3 KElem/sec N/A N/A
Poseidon::hash/single 13.9±0.03µs 68.5 MElem/sec N/A N/A
validate_override_range/FullMerkleTree/override_range/1024 482.8±11.16µs N/A N/A
validate_override_range/FullMerkleTree/override_range/64 71.7±4.00µs N/A N/A
validate_override_range/FullMerkleTree/override_range/65536 434.5±5.72ms N/A N/A
validate_override_range/FullMerkleTree/override_range/8192 8.7±0.12ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/1024 677.0±18.51µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/64 105.0±8.59µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/65536 458.7±2.37ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/8192 10.3±0.50ms N/A N/A
validate_override_range/validate_only/1024 10.9±0.14µs N/A N/A
validate_override_range/validate_only/64 360.7±4.71ns N/A N/A
validate_override_range/validate_only/65536 867.0±10.81µs N/A N/A
validate_override_range/validate_only/8192 115.1±1.64µs N/A N/A

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown

Coverage report uploaded. Download HTML Report

Comment thread rln/src/hashers.rs
Comment thread rln/src/pm_tree.rs
Comment thread rln/src/pm_tree.rs
Comment thread rln/src/pm_tree.rs
Comment thread rln/src/protocol/serialize.rs Outdated
Comment thread utils/src/merkle_tree/full_merkle_tree.rs
Comment thread utils/src/merkle_tree/full_merkle_tree.rs
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Benchmark for fbe7b38

Click to view benchmark
Test Base PR %
FullMerkleProof::compute_root_from 7.6±0.08µs 7.6±0.24µs 0.00%
FullMerkleTree::delete 16.4±0.39µs 16.4±0.26µs 0.00%
FullMerkleTree::get 0.7±0.01ns 0.7±0.00ns 0.00%
FullMerkleTree::get_empty_leaves_indices 862.6±11.99µs 1215.4±7.92µs +40.90%
FullMerkleTree::get_subtree_root 8.3±0.12ns 8.5±0.11ns +2.41%
FullMerkleTree::override_range 1680.2±55.52µs 1649.6±123.74µs -1.82%
FullMerkleTree::proof 69.2±0.66ns 69.1±0.63ns -0.14%
FullMerkleTree::set 8.1±0.17µs 8.0±0.19µs -1.23%
FullMerkleTree::set_range 1626.9±37.33µs 1614.8±42.59µs -0.74%
FullMerkleTree::update_next 8.1±0.19µs 8.1±0.17µs 0.00%
FullMerkleTree::verify 7.6±0.10µs 7.6±0.17µs 0.00%
OptimalMerkleProof::compute_root_from 7.6±0.10µs 7.6±0.12µs 0.00%
OptimalMerkleTree::delete 19.2±0.33µs 19.1±0.71µs -0.52%
OptimalMerkleTree::get 27.6±0.45ns 29.5±1.19ns +6.88%
OptimalMerkleTree::get_empty_leaves_indices 860.7±6.03µs 862.2±14.82µs +0.17%
OptimalMerkleTree::get_subtree_root 19.2±0.27ns 19.9±0.67ns +3.65%
OptimalMerkleTree::override_range 4.0±0.24ms 3.5±0.11ms -12.50%
OptimalMerkleTree::proof 475.5±34.43ns 488.0±68.11ns +2.63%
OptimalMerkleTree::set 9.9±0.23µs 9.6±0.17µs -3.03%
OptimalMerkleTree::set_range 4.2±0.21ms 3.5±0.24ms -16.67%
OptimalMerkleTree::update_next 10.1±0.93µs 9.7±0.50µs -3.96%
OptimalMerkleTree::verify 7.6±0.11µs 7.7±0.20µs +1.32%
Poseidon::hash/10 117.9±0.15µs 82.8 KElem/sec N/A N/A
Poseidon::hash/100 1236.8±5.33µs 79.0 KElem/sec N/A N/A
Poseidon::hash/1000 13.0±0.01ms 75.0 KElem/sec N/A N/A
Poseidon::hash/single 11.8±0.03µs 80.9 MElem/sec N/A N/A
validate_override_range/FullMerkleTree/override_range/1024 425.8±11.71µs N/A N/A
validate_override_range/FullMerkleTree/override_range/64 64.8±6.45µs N/A N/A
validate_override_range/FullMerkleTree/override_range/65536 373.5±8.18ms N/A N/A
validate_override_range/FullMerkleTree/override_range/8192 7.6±0.04ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/1024 555.1±19.06µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/64 83.3±10.27µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/65536 395.2±10.35ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/8192 9.0±0.33ms N/A N/A
validate_override_range/validate_only/1024 7.1±0.11µs N/A N/A
validate_override_range/validate_only/64 290.4±11.20ns N/A N/A
validate_override_range/validate_only/65536 702.2±13.99µs N/A N/A
validate_override_range/validate_only/8192 72.1±0.42µs N/A N/A

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Benchmark for fbe7b38

Click to view benchmark
Test Base PR %
PmTree::delete 1282.3±18.85µs 1583.8±29.44µs +23.51%
PmTree::get 616.6±40.50ns 587.7±15.56ns -4.69%
PmTree::get_empty_leaves_indices 69.3±0.38µs 69.3±0.52µs 0.00%
PmTree::get_subtree_root 385.3±4.97ns 390.2±3.60ns +1.27%
PmTree::override_range 282.0±3.28ms 143.2±4.08ms -49.22%
PmTree::proof 9.5±0.18µs 9.7±0.29µs +2.11%
PmTree::set 545.8±11.22µs 793.6±48.66µs +45.40%
PmTree::set_range 284.2±4.53ms 139.1±4.26ms -51.06%
PmTree::update_next 674.1±6.26µs 7.1±4.08ms +953.26%
PmTree::verify 510.6±3.73µs 511.4±6.40µs +0.16%
PmTreeProof::compute_root_from 511.2±8.35µs 511.9±5.81µs +0.14%
RLN::finish_proof 74.7±0.98ms 74.7±1.08ms 0.00%
RLN::generate_partial_proof 139.7±1.25ms 139.6±2.52ms -0.07%
RLN::generate_proof 204.3±6.88ms 202.2±1.62ms -1.03%

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Coverage report uploaded. Download HTML Report

@vinhtc27
vinhtc27 force-pushed the refactor/pr11-merkle-tree-update branch from ccf484a to 3ee3838 Compare July 2, 2026 07:05
@vinhtc27
vinhtc27 requested a review from sydhds July 2, 2026 07:19
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Benchmark for a13026b

Click to view benchmark
Test Base PR %
PmTree::delete 1212.4±7.21µs 1488.2±17.95µs +22.75%
PmTree::get 546.3±21.33ns 505.8±7.70ns -7.41%
PmTree::get_empty_leaves_indices 61.5±0.94µs 61.4±0.41µs -0.16%
PmTree::get_subtree_root 379.3±7.05ns 386.5±5.56ns +1.90%
PmTree::override_range 256.1±1.73ms 126.5±3.26ms -50.61%
PmTree::proof 9.6±0.35µs 9.1±0.32µs -5.21%
PmTree::set 548.7±6.30µs 739.1±7.13µs +34.70%
PmTree::set_range 257.9±3.61ms 119.1±3.45ms -53.82%
PmTree::update_next 618.4±6.02µs 6.8±3.64ms +999.61%
PmTree::verify 516.3±5.66µs 502.5±9.90µs -2.67%
PmTreeProof::compute_root_from 516.2±3.55µs 506.5±13.89µs -1.88%
RLN::finish_proof 68.3±0.97ms 68.3±0.90ms 0.00%
RLN::generate_partial_proof 128.6±1.40ms 129.4±2.49ms +0.62%
RLN::generate_proof 187.4±7.15ms 186.7±1.91ms -0.37%

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Benchmark for a13026b

Click to view benchmark
Test Base PR %
FullMerkleProof::compute_root_from 8.4±0.07µs 8.6±0.23µs +2.38%
FullMerkleTree::delete 18.2±0.47µs 18.3±0.28µs +0.55%
FullMerkleTree::get 0.8±0.01ns 0.8±0.01ns 0.00%
FullMerkleTree::get_empty_leaves_indices 983.1±8.33µs 1317.3±14.71µs +33.99%
FullMerkleTree::get_subtree_root 9.8±0.15ns 9.9±0.11ns +1.02%
FullMerkleTree::override_range 1927.0±30.28µs 1928.4±112.79µs +0.07%
FullMerkleTree::proof 88.6±0.92ns 87.7±1.39ns -1.02%
FullMerkleTree::set 9.0±0.11µs 9.1±0.18µs +1.11%
FullMerkleTree::set_range 1887.2±46.18µs 1885.7±61.61µs -0.08%
FullMerkleTree::update_next 9.0±0.17µs 9.1±0.19µs +1.11%
FullMerkleTree::verify 8.4±0.07µs 8.5±0.10µs +1.19%
OptimalMerkleProof::compute_root_from 8.4±0.11µs 8.5±0.09µs +1.19%
OptimalMerkleTree::delete 21.0±0.40µs 21.1±0.38µs +0.48%
OptimalMerkleTree::get 51.9±0.88ns 52.9±1.29ns +1.93%
OptimalMerkleTree::get_empty_leaves_indices 985.5±17.28µs 984.3±10.41µs -0.12%
OptimalMerkleTree::get_subtree_root 26.2±0.17ns 26.3±0.39ns +0.38%
OptimalMerkleTree::override_range 4.1±0.36ms 4.0±0.32ms -2.44%
OptimalMerkleTree::proof 676.6±15.65ns 678.1±8.88ns +0.22%
OptimalMerkleTree::set 10.4±0.17µs 10.6±0.24µs +1.92%
OptimalMerkleTree::set_range 4.1±0.37ms 4.0±0.49ms -2.44%
OptimalMerkleTree::update_next 10.8±0.61µs 10.9±0.63µs +0.93%
OptimalMerkleTree::verify 8.4±0.11µs 8.6±0.11µs +2.38%
Poseidon::hash/10 140.5±0.13µs 69.5 KElem/sec N/A N/A
Poseidon::hash/100 1511.3±11.01µs 64.6 KElem/sec N/A N/A
Poseidon::hash/1000 15.2±0.07ms 64.3 KElem/sec N/A N/A
Poseidon::hash/single 13.9±0.03µs 68.5 MElem/sec N/A N/A
validate_override_range/FullMerkleTree/override_range/1024 480.7±11.88µs N/A N/A
validate_override_range/FullMerkleTree/override_range/64 72.3±7.84µs N/A N/A
validate_override_range/FullMerkleTree/override_range/65536 434.9±3.44ms N/A N/A
validate_override_range/FullMerkleTree/override_range/8192 8.7±0.04ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/1024 663.1±25.21µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/64 96.7±5.20µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/65536 458.5±1.87ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/8192 9.8±0.22ms N/A N/A
validate_override_range/validate_only/1024 10.9±0.13µs N/A N/A
validate_override_range/validate_only/64 364.6±4.09ns N/A N/A
validate_override_range/validate_only/65536 862.5±12.87µs N/A N/A
validate_override_range/validate_only/8192 84.7±2.17µs N/A N/A

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Coverage report uploaded. Download HTML Report

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Benchmark for afac8ad

Click to view benchmark
Test Base PR %
FullMerkleProof::compute_root_from 8.4±0.05µs 8.5±0.10µs +1.19%
FullMerkleTree::delete 18.1±0.22µs 18.3±0.20µs +1.10%
FullMerkleTree::get 0.8±0.02ns 0.8±0.00ns 0.00%
FullMerkleTree::get_empty_leaves_indices 985.6±19.59µs 1315.0±11.98µs +33.42%
FullMerkleTree::get_subtree_root 9.8±0.08ns 9.9±0.07ns +1.02%
FullMerkleTree::override_range 1948.6±49.44µs 1925.8±36.56µs -1.17%
FullMerkleTree::proof 87.7±0.74ns 87.1±1.21ns -0.68%
FullMerkleTree::set 9.0±0.15µs 9.1±0.15µs +1.11%
FullMerkleTree::set_range 1898.3±49.52µs 1883.8±42.59µs -0.76%
FullMerkleTree::update_next 9.0±0.27µs 9.1±0.15µs +1.11%
FullMerkleTree::verify 8.4±0.09µs 8.5±0.07µs +1.19%
OptimalMerkleProof::compute_root_from 8.4±0.25µs 8.5±0.11µs +1.19%
OptimalMerkleTree::delete 21.0±0.36µs 21.3±0.44µs +1.43%
OptimalMerkleTree::get 51.6±0.34ns 52.6±0.53ns +1.94%
OptimalMerkleTree::get_empty_leaves_indices 984.4±10.89µs 986.8±18.84µs +0.24%
OptimalMerkleTree::get_subtree_root 26.1±0.22ns 26.4±0.39ns +1.15%
OptimalMerkleTree::override_range 5.2±0.20ms 5.2±0.19ms 0.00%
OptimalMerkleTree::proof 690.6±35.40ns 716.5±41.31ns +3.75%
OptimalMerkleTree::set 10.6±0.21µs 10.8±0.43µs +1.89%
OptimalMerkleTree::set_range 5.1±0.17ms 5.0±0.18ms -1.96%
OptimalMerkleTree::update_next 11.0±0.66µs 11.2±0.64µs +1.82%
OptimalMerkleTree::verify 8.4±0.08µs 8.6±0.13µs +2.38%
Poseidon::hash/10 140.7±0.97µs 69.4 KElem/sec N/A N/A
Poseidon::hash/100 1507.5±2.73µs 64.8 KElem/sec N/A N/A
Poseidon::hash/1000 15.2±0.02ms 64.3 KElem/sec N/A N/A
Poseidon::hash/single 14.0±0.04µs 68.3 MElem/sec N/A N/A
validate_override_range/FullMerkleTree/override_range/1024 478.8±12.37µs N/A N/A
validate_override_range/FullMerkleTree/override_range/64 72.4±5.97µs N/A N/A
validate_override_range/FullMerkleTree/override_range/65536 432.3±0.52ms N/A N/A
validate_override_range/FullMerkleTree/override_range/8192 8.6±0.05ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/1024 657.7±13.80µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/64 99.6±7.58µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/65536 457.1±2.79ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/8192 10.2±0.33ms N/A N/A
validate_override_range/validate_only/1024 8.3±0.13µs N/A N/A
validate_override_range/validate_only/64 372.1±16.82ns N/A N/A
validate_override_range/validate_only/65536 867.1±12.47µs N/A N/A
validate_override_range/validate_only/8192 114.9±1.13µs N/A N/A

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Benchmark for afac8ad

Click to view benchmark
Test Base PR %
PmTree::delete 1292.3±20.78µs 1618.8±17.32µs +25.27%
PmTree::get 803.0±76.90ns 640.7±64.41ns -20.21%
PmTree::get_empty_leaves_indices 69.3±0.71µs 69.5±1.69µs +0.29%
PmTree::get_subtree_root 388.4±4.94ns 385.6±9.42ns -0.72%
PmTree::override_range 289.8±3.62ms 150.9±4.05ms -47.93%
PmTree::proof 10.0±0.34µs 10.0±0.32µs 0.00%
PmTree::set 546.1±11.80µs 776.9±11.96µs +42.26%
PmTree::set_range 287.6±4.24ms 141.7±4.24ms -50.73%
PmTree::update_next 688.7±10.28µs 7.4±4.52ms +974.49%
PmTree::verify 511.8±6.55µs 523.3±4.42µs +2.25%
PmTreeProof::compute_root_from 512.0±10.09µs 522.3±3.08µs +2.01%
RLN::finish_proof 74.6±0.87ms 74.8±1.08ms +0.27%
RLN::generate_partial_proof 139.6±1.28ms 139.7±2.31ms +0.07%
RLN::generate_proof 203.9±7.07ms 203.7±6.76ms -0.10%

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Coverage report uploaded. Download HTML Report

Comment thread rln-wasm/src/wasm_utils.rs
Comment thread rln/src/ffi/ffi_utils.rs
@vinhtc27
vinhtc27 requested a review from sydhds July 3, 2026 05:53
@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown

Coverage report uploaded. Download HTML Report

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown

Benchmark for a2660d4

Click to view benchmark
Test Base PR %
FullMerkleProof::compute_root_from 9.5±0.36µs 9.6±0.30µs +1.05%
FullMerkleTree::delete 20.8±0.29µs 20.9±0.34µs +0.48%
FullMerkleTree::get 0.9±0.01ns 0.9±0.00ns 0.00%
FullMerkleTree::get_empty_leaves_indices 1114.3±22.69µs 1569.1±16.43µs +40.81%
FullMerkleTree::get_subtree_root 10.8±0.37ns 10.9±0.12ns +0.93%
FullMerkleTree::override_range 2.1±0.03ms 2.1±0.02ms 0.00%
FullMerkleTree::proof 90.2±1.64ns 95.4±1.31ns +5.76%
FullMerkleTree::set 10.2±0.09µs 10.3±0.27µs +0.98%
FullMerkleTree::set_range 2.1±0.03ms 2.1±0.04ms 0.00%
FullMerkleTree::update_next 10.2±0.15µs 10.3±0.08µs +0.98%
FullMerkleTree::verify 9.5±0.17µs 9.6±0.18µs +1.05%
OptimalMerkleProof::compute_root_from 9.5±0.10µs 9.5±0.23µs 0.00%
OptimalMerkleTree::delete 24.1±0.46µs 24.2±0.46µs +0.41%
OptimalMerkleTree::get 35.5±0.82ns 36.7±0.55ns +3.38%
OptimalMerkleTree::get_empty_leaves_indices 1112.0±18.52µs 1111.5±24.74µs -0.04%
OptimalMerkleTree::get_subtree_root 24.8±0.45ns 25.6±0.45ns +3.23%
OptimalMerkleTree::override_range 4.2±0.12ms 4.1±0.19ms -2.38%
OptimalMerkleTree::proof 583.5±13.90ns 569.1±21.14ns -2.47%
OptimalMerkleTree::set 12.2±0.39µs 12.2±0.34µs 0.00%
OptimalMerkleTree::set_range 4.1±0.22ms 3.9±0.10ms -4.88%
OptimalMerkleTree::update_next 12.4±0.36µs 12.2±0.56µs -1.61%
OptimalMerkleTree::verify 9.6±0.42µs 9.6±0.21µs 0.00%
Poseidon::hash/10 159.9±1.08µs 61.1 KElem/sec N/A N/A
Poseidon::hash/100 1659.2±17.97µs 58.9 KElem/sec N/A N/A
Poseidon::hash/1000 17.3±0.21ms 56.4 KElem/sec N/A N/A
Poseidon::hash/single 15.2±0.02µs 62.8 MElem/sec N/A N/A
validate_override_range/FullMerkleTree/override_range/1024 540.4±13.33µs N/A N/A
validate_override_range/FullMerkleTree/override_range/64 81.0±6.90µs N/A N/A
validate_override_range/FullMerkleTree/override_range/65536 489.8±5.40ms N/A N/A
validate_override_range/FullMerkleTree/override_range/8192 9.7±0.07ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/1024 711.6±16.62µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/64 97.5±6.42µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/65536 501.9±8.33ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/8192 11.6±0.20ms N/A N/A
validate_override_range/validate_only/1024 9.3±0.18µs N/A N/A
validate_override_range/validate_only/64 382.3±4.89ns N/A N/A
validate_override_range/validate_only/65536 905.2±6.88µs N/A N/A
validate_override_range/validate_only/8192 93.5±0.54µs N/A N/A

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown

Benchmark for a2660d4

Click to view benchmark
Test Base PR %
PmTree::delete 1206.8±20.03µs 1514.9±13.51µs +25.53%
PmTree::get 515.7±12.23ns 524.4±27.09ns +1.69%
PmTree::get_empty_leaves_indices 61.5±1.67µs 61.5±1.33µs 0.00%
PmTree::get_subtree_root 384.9±8.68ns 394.3±6.45ns +2.44%
PmTree::override_range 254.5±1.19ms 130.0±3.70ms -48.92%
PmTree::proof 9.0±0.17µs 9.4±0.57µs +4.44%
PmTree::set 542.4±8.70µs 752.5±8.72µs +38.74%
PmTree::set_range 254.0±3.25ms 122.5±3.37ms -51.77%
PmTree::update_next 616.2±9.32µs 6.7±3.66ms +987.31%
PmTree::verify 508.3±6.13µs 505.7±9.34µs -0.51%
PmTreeProof::compute_root_from 507.5±3.56µs 505.2±5.45µs -0.45%
RLN::finish_proof 68.3±0.90ms 68.5±0.88ms +0.29%
RLN::generate_partial_proof 128.7±2.08ms 129.1±1.45ms +0.31%
RLN::generate_proof 186.8±4.42ms 187.5±2.50ms +0.37%

@vinhtc27
vinhtc27 force-pushed the refactor/pr11-merkle-tree-update branch from c0c8902 to dccd0c2 Compare July 3, 2026 06:09
@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown

Benchmark for f34133e

Click to view benchmark
Test Base PR %
FullMerkleProof::compute_root_from 8.3±0.09µs 8.3±0.08µs 0.00%
FullMerkleTree::delete 18.3±0.38µs 18.3±0.56µs 0.00%
FullMerkleTree::get 0.8±0.01ns 0.8±0.02ns 0.00%
FullMerkleTree::get_empty_leaves_indices 1201.6±20.03µs 1370.3±43.50µs +14.04%
FullMerkleTree::get_subtree_root 11.1±0.07ns 11.1±0.07ns 0.00%
FullMerkleTree::override_range 2.3±0.02ms 2.3±0.02ms 0.00%
FullMerkleTree::proof 94.7±1.50ns 93.7±1.86ns -1.06%
FullMerkleTree::set 9.1±0.20µs 9.1±0.18µs 0.00%
FullMerkleTree::set_range 2.3±0.04ms 2.3±0.03ms 0.00%
FullMerkleTree::update_next 9.0±0.20µs 9.1±0.29µs +1.11%
FullMerkleTree::verify 8.3±0.09µs 8.3±0.22µs 0.00%
OptimalMerkleProof::compute_root_from 8.3±0.10µs 8.3±0.17µs 0.00%
OptimalMerkleTree::delete 20.6±0.26µs 20.9±0.49µs +1.46%
OptimalMerkleTree::get 38.8±1.30ns 37.4±1.77ns -3.61%
OptimalMerkleTree::get_empty_leaves_indices 1207.9±37.71µs 1090.6±52.73µs -9.71%
OptimalMerkleTree::get_subtree_root 28.0±0.60ns 28.3±0.96ns +1.07%
OptimalMerkleTree::override_range 5.0±0.07ms 4.8±0.06ms -4.00%
OptimalMerkleTree::proof 567.8±35.51ns 571.6±26.79ns +0.67%
OptimalMerkleTree::set 10.5±0.19µs 10.6±0.35µs +0.95%
OptimalMerkleTree::set_range 4.9±0.07ms 4.7±0.13ms -4.08%
OptimalMerkleTree::update_next 10.7±0.88µs 10.8±0.85µs +0.93%
OptimalMerkleTree::verify 8.3±0.16µs 8.3±0.17µs 0.00%
Poseidon::hash/10 137.3±0.38µs 71.1 KElem/sec N/A N/A
Poseidon::hash/100 1468.6±9.34µs 66.5 KElem/sec N/A N/A
Poseidon::hash/1000 14.7±0.02ms 66.2 KElem/sec N/A N/A
Poseidon::hash/single 13.5±0.03µs 70.6 MElem/sec N/A N/A
validate_override_range/FullMerkleTree/override_range/1024 492.8±11.21µs N/A N/A
validate_override_range/FullMerkleTree/override_range/64 80.8±3.17µs N/A N/A
validate_override_range/FullMerkleTree/override_range/65536 608.0±1.83ms N/A N/A
validate_override_range/FullMerkleTree/override_range/8192 9.8±0.05ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/1024 736.0±20.38µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/64 104.9±4.64µs N/A N/A
validate_override_range/OptimalMerkleTree/override_range/65536 626.5±1.62ms N/A N/A
validate_override_range/OptimalMerkleTree/override_range/8192 12.1±0.32ms N/A N/A
validate_override_range/validate_only/1024 8.3±0.13µs N/A N/A
validate_override_range/validate_only/64 349.9±13.39ns N/A N/A
validate_override_range/validate_only/65536 859.5±30.02µs N/A N/A
validate_override_range/validate_only/8192 84.2±0.89µs N/A N/A

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown

Coverage report uploaded. Download HTML Report

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown

Benchmark for f34133e

Click to view benchmark
Test Base PR %
PmTree::delete 1276.9±17.34µs 1579.0±17.72µs +23.66%
PmTree::get 593.0±25.74ns 584.0±41.88ns -1.52%
PmTree::get_empty_leaves_indices 69.2±0.51µs 69.3±0.97µs +0.14%
PmTree::get_subtree_root 387.8±10.04ns 390.6±3.68ns +0.72%
PmTree::override_range 285.8±3.18ms 144.1±4.12ms -49.58%
PmTree::proof 9.6±0.31µs 10.1±0.28µs +5.21%
PmTree::set 546.1±12.33µs 749.2±12.77µs +37.19%
PmTree::set_range 286.6±4.47ms 139.7±3.79ms -51.26%
PmTree::update_next 675.8±5.51µs 7.1±4.09ms +950.61%
PmTree::verify 511.6±5.00µs 510.8±5.74µs -0.16%
PmTreeProof::compute_root_from 513.9±13.24µs 510.4±2.73µs -0.68%
RLN::finish_proof 74.8±1.00ms 74.6±0.95ms -0.27%
RLN::generate_partial_proof 139.7±1.23ms 140.3±3.08ms +0.43%
RLN::generate_proof 204.2±6.99ms 202.9±1.76ms -0.64%

@vinhtc27
vinhtc27 merged commit f8920a6 into develop/v3.0.0 Jul 3, 2026
28 of 30 checks passed
@vinhtc27
vinhtc27 deleted the refactor/pr11-merkle-tree-update branch July 3, 2026 07:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run-coverage Runs coverage report in CI once added to the open PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MerkleTree + too many users

2 participants