@@ -6,33 +6,87 @@ Merkle Tree implementation in pure Elixir.
66[ ![ Coveralls] ( https://img.shields.io/coveralls/yosriady/merkle_tree.svg?maxAge=2592000 )] ( https://coveralls.io/github/yosriady/merkle_tree )
77[ ![ Hex.pm] ( https://img.shields.io/hexpm/v/merkle_tree.svg?maxAge=2592000 )] ( https://hex.pm/packages/merkle_tree )
88
9- ### [ Hex] ( http://hex.pm/packages/merkle_tree )
9+ ### [ Hex (Package Manager) ] ( http://hex.pm/packages/merkle_tree )
1010### [ API Documentation] ( https://hexdocs.pm/merkle_tree/ )
1111
1212## Installation
1313
14- Add ` merkle_tree ` to your list of dependencies in ` mix.exs ` :
14+ * Install the [ Elixir ] ( https://elixir-lang.org/ ) functional language.
1515
16- ``` elixir
17- def deps do
18- [{:merkle_tree , " ~> 1.1.1" }]
19- end
20- ```
16+ * Create New Project with Mix
17+ ``` bash
18+ mix new my_app; cd my_app
19+ ```
20+
21+ * Add ` merkle_tree ` to your list of dependencies in ` mix.exs ` . Note that merkle_tree v1.2.0 is required in order to use ` MerkleTree.Proof ` .
22+ ``` elixir
23+ def deps do
24+ [{:merkle_tree , " ~> 1.2.0" }]
25+ end
26+ ```
27+
28+ * Install Mix Dependencies
29+ ``` bash
30+ mix deps.get
31+ ```
2132
2233## Usage
2334
24- ``` elixir
25- iex> f = MerkleTree .new [' a' , ' b' , ' c' , ' d' ]
26- %MerkleTree {blocks: [' a' , ' b' , ' c' , ' d' ], hash_function: & MerkleTree .Crypto .sha256 / 1 ,
27- root: %MerkleTree .Node {children: [%MerkleTree .Node {children: [%MerkleTree .Node {children: [],
28- value: " ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb" },
29- %MerkleTree .Node {children: [], value: " 3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d" }],
30- value: " 62af5c3cb8da3e4f25061e829ebeea5c7513c54949115b1acc225930a90154da" },
31- %MerkleTree .Node {children: [%MerkleTree .Node {children: [], value: " 2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6" },
32- %MerkleTree .Node {children: [], value: " 18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4" }],
33- value: " d3a0f1c792ccf7f1708d5422696263e35755a86917ea76ef9242bd4a8cf4891a" }],
34- value: " 58c89d709329eb37285837b042ab6ff72c7c8f74de0446b091b6a0131c102cfd" }}
35- ```
35+ * Run [ Interactive Elixir (IEx)] ( https://hexdocs.pm/iex/IEx.html ) within context of Elixir app and dependencies injected into IEx runtime
36+ ``` bash
37+ iex -S mix
38+ ```
39+
40+ * Try the [ MerkleTree Module] ( https://hexdocs.pm/merkle_tree/MerkleTree.html )
41+ ``` elixir
42+ iex> MerkleTree .__info__ (:functions )
43+ [__struct__: 0 , __struct__: 1 , build: 2 , new: 1 , new: 2 ]
44+ iex> mt = MerkleTree .new [' a' , ' b' , ' c' , ' d' ]
45+ %MerkleTree {blocks: [' a' , ' b' , ' c' , ' d' ], hash_function: & MerkleTree .Crypto .sha256 / 1 ,
46+ root: %MerkleTree .Node {children: [%MerkleTree .Node {children: [%MerkleTree .Node {children: [],
47+ value: " ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb" },
48+ %MerkleTree .Node {children: [], value: " 3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d" }],
49+ value: " 62af5c3cb8da3e4f25061e829ebeea5c7513c54949115b1acc225930a90154da" },
50+ %MerkleTree .Node {children: [%MerkleTree .Node {children: [], value: " 2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6" },
51+ %MerkleTree .Node {children: [], value: " 18ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4" }],
52+ value: " d3a0f1c792ccf7f1708d5422696263e35755a86917ea76ef9242bd4a8cf4891a" }],
53+ value: " 58c89d709329eb37285837b042ab6ff72c7c8f74de0446b091b6a0131c102cfd" }}
54+ $ mt.blocks ()
55+ [' a' , ' b' , ' c' , ' d' ]
56+ $ mt.hash_function ()
57+ & MerkleTree .Crypto .sha256 / 1
58+ $ mt.root ()
59+ .. .
60+ ```
61+
62+ * Try the [ MerkleTree.Proof Module] ( https://hexdocs.pm/merkle_tree/MerkleTree.Proof.html ) (requires merkle_tree >1.2.0)
63+ ``` elixir
64+ iex> MerkleTree .Proof .__info__ (:functions )
65+ [__struct__: 0 , __struct__: 1 , prove: 2 , proven?: 3 ]
66+ iex> proof1 = MerkleTree .Proof .prove (mt, 1 )
67+ iex> proven1 = MerkleTree .Proof .proven? ({" b" , 1 }, " 58c89d709329eb37285837b042ab6ff72c7c8f74de0446b091b6a0131c102cfd" , proof1)
68+ true
69+
70+ iex> proof3 = MerkleTree .Proof .prove (mt, 3 ) %MerkleTree .Proof {
71+ hash_function: & MerkleTree .Crypto .sha256 / 1 ,
72+ hashes: [" 62af5c3cb8da3e4f25061e829ebeea5c7513c54949115b1acc225930a90154da" ,
73+ " 2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6" ]
74+ }
75+ iex> proven3 = MerkleTree .Proof .proven? ({" d" , 3 }, " 58c89d709329eb37285837b042ab6ff72c7c8f74de0446b091b6a0131c102cfd" , proof3)
76+ true
77+ ```
78+
79+ * Try the [ MerkleTree.Crypto Module] ( https://hexdocs.pm/merkle_tree/MerkleTree.Crypto.html )
80+ ``` elixir
81+ iex> MerkleTree .Crypto .__info__ (:functions )
82+ [hash: 2 , sha256: 1 ]
83+ iex> MerkleTree .Crypto .hash (" tendermint" , :sha256 )
84+ " f6c3848fc2ab9188dd2c563828019be7cee4e269f5438c19f5173f79898e9ee6"
85+ iex> MerkleTree .Crypto .hash (" tendermint" , :md5 )
86+ " bc93700bdf1d47ad28654ad93611941f"
87+ iex> MerkleTree .Crypto .sha256 (" tendermint" )
88+ " f6c3848fc2ab9188dd2c563828019be7cee4e269f5438c19f5173f79898e9ee6"
89+ ```
3690
3791## Background
3892
@@ -44,7 +98,7 @@ Hash trees can be used to verify any kind of data stored, handled and transferre
4498
4599## Running Type Checker
46100
47- ```
101+ ``` bash
48102mix dialyzer
49103```
50104
0 commit comments