Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jjyr/mmr-c
Merkle mountain range in C
https://github.com/jjyr/mmr-c
c merkle-mountain-range mmr
Last synced: 13 days ago
JSON representation
Merkle mountain range in C
- Host: GitHub
- URL: https://github.com/jjyr/mmr-c
- Owner: jjyr
- License: mit
- Created: 2019-11-11T12:46:26.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2019-11-25T13:50:51.000Z (about 5 years ago)
- Last Synced: 2024-11-07T09:51:51.543Z (2 months ago)
- Topics: c, merkle-mountain-range, mmr
- Language: C
- Size: 62.5 KB
- Stars: 2
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# Merkle mountain range
Merkle mountain range in C.
You can check [unit tests](https://github.com/jjyr/mmr-c/blob/master/test_runner.c) to learn the usage.
## Construct
``` txt
# An 11 leaves MMR14
/ \
6 13
/ \ / \
2 5 9 12 17
/ \ / \ / \ / \ / \
0 1 3 4 7 8 10 11 15 16 18
```In MMR, we use the insertion order to reference leaves and nodes.
we inserting a new leaf to MMR by the following:1. insert leaf or node to next position.
2. if the current position has a left sibling, we merge the left and right nodes to produce a new parent node, then go back to step 1 to insert the node.For example, we insert a leaf to the example MMR:
1. insert leaf to next position: `19`.
2. now check the left sibling `18` and calculate parent node: `merge(mmr[18], mmr[19])`.
3. insert parent node to position `20`.
4. the node `20` also has a left sibling `17`, calculate parent node: `merge(mmr[17], mmr[20])`.
5. insert new node to next position `21`.
6. the node `20` have no left sibling, complete the insertion.Example MMR after insertion of a new leaf:
``` txt
14
/ \
6 13 21
/ \ / \ / \
2 5 9 12 17 20
/ \ / \ / \ / \ / \ / \
0 1 3 4 7 8 10 11 15 16 18 19
```## Merkle root
An MMR is constructed by one or more sub merkle trees (or mountains). Each sub merkle tree's root is a peak in MMR, we calculate the MMR root by bagging these peaks from right to left.
For example, we have a MMR with 3 peaks: `14, 17, 18`, we bagging thses peaks from right to left to get the root: `merge(merge(mmr[18], mmr[17]), mmr[14])`.
## Merkle proof
The merkle proof is an array of hashes constructed by the follows parts:
1. A merkle proof from the leaf's sibling to the peak that contains the leaf.
2. A hash that bagging all right-hand side peaks, skip this part if no right-hand peaks.
3. Hashes of all left-hand peaks, the from right to left, skip this part if no left-hand peaks.We can reconstruct the merkle root from the proofs. Pre calculate the peaks positions from the size of MMR may help us do the bagging.
## References
* [Merkle mountain range](https://github.com/opentimestamps/opentimestamps-server/blob/master/doc/merkle-mountain-range.md)
* [Grin Doc](https://github.com/mimblewimble/grin/blob/master/doc/mmr.md#structure)
* [MMR implement in Rust](https://github.com/nervosnetwork/merkle-mountain-range)## LICENSE
MIT
## AUTHOR
Jiang Jinyang