Skip to content

Commit 5b19abd

Browse files
ltfschoenyosriady
authored andcommitted
docs: Update Readme Example to v1.2.0 with MerkleTree.Crypto and Proof
1 parent 37a6569 commit 5b19abd

File tree

1 file changed

+74
-20
lines changed

1 file changed

+74
-20
lines changed

README.md

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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
48102
mix dialyzer
49103
```
50104

0 commit comments

Comments
 (0)