Skip to main content

MerkleTree implementation

Project description

merkle-zeppelin

CI/CD pre-commit

PyPI Version PyPI - Status PyPI - Downloads

Python Versions License

A Merkle Tree library aligned with OpenZeppelin's implementation standards.

What's the purpose of Merkle Tree

By storing just one value, the server can confirm whether a specific value belongs to a previously constructed tree.
The server needs to store only the root hash of the tree.
Requests must include the value to be verified along with a list of hashes specific to that value—known as proofs.
This algorithm is particularly valuable when saving storage space is more important than computational power.

How the Tree is Constructed

The animation demonstrates the algorithm constructing a tree for proof verification or calculation. The letters at the bottom represent a list of items stored in the program's memory.

Constructing the tree

Note that dividing the number of each node in the final tree by 2 (without remainder) identifies its parent node. The None placeholder ensures the first element is indexed at 1, not 0, maintaining this parent-child relationship.

Each element, represented by one or more letters, is a hashed value. For instance, given a, ..., e, we have A = hash(a), ..., E = hash(e), where AB = hash(A + B) = hash(hash(a) + hash(b)), and so on.

This library allows selection of the hash function, with keccak256 set as the default to match the OpenZeppelin implementation.

Collecting Proofs

Consider the example below:

Collecting proofs

To collect proofs for a specific value, locate the leaf containing the hash of that value. Collect the sibling's value, move up to the parent node, and repeat until you reach the root.

The proofs are the sibling values collected on this path.

Note

  • To find a sibling's node number, use current_node_number ^ 1.
  • To find a parent's node number, use current_node_number // 2.

Verifying Proofs

To verify proofs, you only need the root value. For example:

value = b
proofs = [A, E, CD]
  1. Hash the value b to get B.
  2. Combine B with the first proof and hash result: hash(A + B) = AB.
  3. Combine AB with the second proof and hash result: hash(AB + E) = ABE.
  4. Combine ABE with the third proof and hash result: hash(ABE + CD) = ABECD, which is the calculated root.
  5. If the calculated root matches the stored root value, it confirms that the value b is part of the tree.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

merkle_zeppelin-1.0.0.tar.gz (1.7 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

merkle_zeppelin-1.0.0-py3-none-any.whl (8.4 kB view details)

Uploaded Python 3

File details

Details for the file merkle_zeppelin-1.0.0.tar.gz.

File metadata

  • Download URL: merkle_zeppelin-1.0.0.tar.gz
  • Upload date:
  • Size: 1.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.7.3

File hashes

Hashes for merkle_zeppelin-1.0.0.tar.gz
Algorithm Hash digest
SHA256 313a2c6a37a25a36e6e6f5d3b3998c03662110b7cb53c489b660a8862966c114
MD5 b90fc0288da6542cffb18fa67297792a
BLAKE2b-256 cf91795dcbfe9a282286f727c36dbc0339da0299f689d0597f6525fd0191fdce

See more details on using hashes here.

File details

Details for the file merkle_zeppelin-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for merkle_zeppelin-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d36a827c0b3af74c85200a9de1f7742f5856aabbe305d937126c72a5e2e140a8
MD5 7aabcd02a7767600cc35b5545ac991b4
BLAKE2b-256 5aa926b2e63fc501eda2dbbc942b22388b991f03627a0aab4634e477e9d62d80

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page