Skip to main content

Merkly

The simple and easy implementation of Python Merkle Tree.



Table of Contents

Credits

GitHub Contributors Image

Documentation

HOW TO INSTALL

poetry add merkly
pip install merkly

HOW TO WORKS

WARNING: We use keccak-256 under-the-hood if you dont pass your hash function

This library provides a clean and easy to use implementation of the Merkle Tree with the following features:

  • Create Leaf
  • Create Root
  • Create Proof
  • Verify Proof

HOW TO USE

Creating a Merkle Tree

from merkly.mtree import MerkleTree
from typing import Callable

# choose any hash function that is of type (bytes, bytes) -> bytes
my_hash_function: Callable[[bytes, bytes], bytes] = lambda x, y: x + y

# create a Merkle Tree
mtree = MerkleTree(['a', 'b', 'c', 'd'], my_hash_function)

# show original input
assert mtree.raw_leaves == ['a', 'b', 'c', 'd']

# hashed leaves
assert mtree.leaves == [b'a', b'b', b'c', b'd']

# shorted hashed leaves
assert mtree.short_leaves == [b'a', b'b', b'c', b'd']

Creating a Default Merkle Tree (with Keccak256)

from merkly.mtree import MerkleTree

# create a Merkle Tree with keccak256
mtree = MerkleTree(['a', 'b', 'c', 'd'])

# show original input
assert mtree.raw_leaves == ['a', 'b', 'c', 'd']

# hashed leaves (just bytes)
assert mtree.leaves == [
    b':\xc2%\x16\x8d\xf5B\x12\xa2\\\x1c\x01\xfd5\xbe\xbf\xea@\x8f\xda\xc2\xe3\x1d\xddo\x80\xa4\xbb\xf9\xa5\xf1\xcb', b'\xb5U=\xe3\x15\xe0\xed\xf5\x04\xd9\x15\n\xf8-\xaf\xa5\xc4f\x7f\xa6\x18\xed\no\x19\xc6\x9bA\x16lU\x10', b'\x0bB\xb69<\x1fS\x06\x0f\xe3\xdd\xbf\xcdz\xad\xcc\xa8\x94FZZC\x8fi\xc8}y\x0b"\x99\xb9\xb2', b'\xf1\x91\x8e\x85b#n\xb1z\xdc\x85\x023/L\x9c\x82\xbc\x14\xe1\x9b\xfc\n\xa1\n\xb6t\xffu\xb3\xd2\xf3'
]

# shorted hashed leaves
assert mtree.short_leaves == [b':\xc2', b'\xb5U', b'\x0bB', b'\xf1\x91']


######## comming soon!

# human leaves
assert mtree.human_leaves == [
    "3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb",
    "b5553de315e0edf504d9150af82dafa5c4667fa618ed0a6f19c69b41166c5510",
    "0b42b6393c1f53060fe3ddbfcd7aadcca894465a5a438f69c87d790b2299b9b2",
    "f1918e8562236eb17adc8502332f4c9c82bc14e19bfc0aa10ab674ff75b3d2f3",
]
# shorted human hashed leaves
assert mtree.human_short_leaves = ["3ac2", "b555", "0b42", "f191"]

Creating a Root

from merkly.mtree import MerkleTree

# create a Merkle Tree
mtree = MerkleTree(['a', 'b', 'c', 'd'])

# get root of tree (This is compatible with MerkleTreeJS)
assert mtree.root.hex() == '68203f90e9d07dc5859259d7536e87a6ba9d345f2552b5b9de2999ddce9ce1bf'

Creating Proof of a leaf

from merkly.mtree import MerkleTree
from merkly.node import Node, Side

# create a Merkle Tree
mtree = MerkleTree(['a', 'b', 'c', 'd'])

# get proof of a `raw` leaf
assert mtree.proof('b') == [
    Node(data=b"3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb", side=Side.LEFT),
    Node(data=b"d253a52d4cb00de2895e85f2529e2976e6aaaa5c18106b68ab66813e14415669", side=Side.RIGHT)
]

Checking the proof of a sheet

from merkly.mtree import MerkleTree
from merkly.node import Node, Side


# create a Merkle Tree
mtree = MerkleTree(['a', 'b', 'c', 'd'])

# get proof of a raw leaf
p = [
    Node(
        data=b"3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb",
        side=Side.LEFT
    ),
    Node(
        data=b"d253a52d4cb00de2895e85f2529e2976e6aaaa5c18106b68ab66813e14415669",
        side=Side.RIGHT
    )
]

# verify your proof of raw leaf
assert mtree.verify(p, 'b') == True

Roadmap

Feature Status Version
Auto deploy PyPi ✅ Deployed 0.2.0
Create Root ✅ Deployed 0.4.0
Create Proof ✅ Deployed 0.5.0
Verify Proof ✅ Deployed 0.6.0
Use any Hash function ✅ Deployed 0.7.0
Leafs of any size ✅ Deployed 0.8.0
Security deprecation pysha3 ✅ Deployed 0.8.1
Compatible with MerkleTreeJs ✅ Deployed 1.0.0
First Issue solved by community ✅ Deployed 1.0.0
Accelerator code with Rust 🏗️ Alpha 1.1.0
Tutorial how to use with solidity 🖊️ Design x.x.x
Tutorial how to use with MerkleTreeJS 🖊️ Design x.x.x

Contributing

License

MIT

Release files for merkly 1.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for merkly 1.0.2
File Size Uploaded
merkly-1.0.2.tar.gz 6.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for merkly 1.0.2
File Interpreter ABI Platform
merkly-1.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 14.8 kB

Release files / merkly-1.0.2.tar.gz

Download URL merkly-1.0.2.tar.gz
Size 6.8 kB
Tags Source
SHA-256 checksum
How to use checksums
d5711023141aa45ba6689430984686567a68ed04acd9e1cc7c602d0f37381817
BLAKE2b-256 checksum
How to use checksums
b88479fcc88c46eda5b922da7d685eb1e26d2c1c8a6f7977c790899d55f12155
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.10.2 Linux/6.2.0-1018-azure

Release files / merkly-1.0.2-py3-none-any.whl

Download URL merkly-1.0.2-py3-none-any.whl
Size 8.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b6acae8a8d31f9ad1647c8b9cdaf73621151106d1dc3e0856423f23cbe386023
BLAKE2b-256 checksum
How to use checksums
241dcb185f22e25473fe69630e500616fe92185a95823b5229bfad961e8210a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.10.2 Linux/6.2.0-1018-azure

Release history Release notifications | RSS feed

This release

1.0.2 This release

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page