merkle 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +30 -1
- data/lib/merkle/abstract_tree.rb +16 -1
- data/lib/merkle/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: acfb1daee054131392665bdb186173e4d9facf8d8a25f0d082d3d18bdb3a9b51
|
4
|
+
data.tar.gz: cb94b561dc7dfbffd9a951a94c8a015710d388f7f49466808db0bdf583d1f5cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3aae0a25fdfca015e89a4123bf7956ec3b163ae3dce0cebed93652d0eb90babd9651043fedcd12a6f346b08d15e558f2480fd9325d39294cdbcb5739594d1537
|
7
|
+
data.tar.gz: 1db01cd9b1de1bac9c1193d12e47dc324011dc3578f3b49620dc47bac7ed920da606227af0a954f5de0f0704775b7ebb90224da63a34757bd1ac2ed9b3cc86e9
|
data/README.md
CHANGED
@@ -35,7 +35,7 @@ require 'merkle'
|
|
35
35
|
# Create configuration
|
36
36
|
config = Merkle::Config.new(hash_type: :sha256)
|
37
37
|
|
38
|
-
#
|
38
|
+
# Method 1: Using pre-hashed leaves
|
39
39
|
leaves = [
|
40
40
|
'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3',
|
41
41
|
'b3a8e0e1f9ab1bfe3a36f231f676f78bb30a519d2b21e6c530c0eee8ebb4a5d0',
|
@@ -58,6 +58,35 @@ puts "Proof directions: #{proof.directions}"
|
|
58
58
|
puts "Proof valid: #{proof.valid?}"
|
59
59
|
```
|
60
60
|
|
61
|
+
### Using from_elements
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
# Method 2: Using from_elements to automatically hash raw data
|
65
|
+
elements = ['hello', 'world', 'merkle', 'tree']
|
66
|
+
|
67
|
+
# Create tree from raw elements
|
68
|
+
tree = Merkle::BinaryTree.from_elements(
|
69
|
+
config: config,
|
70
|
+
elements: elements
|
71
|
+
)
|
72
|
+
|
73
|
+
# The elements are automatically hashed before building the tree
|
74
|
+
root = tree.compute_root
|
75
|
+
puts "Root from elements: #{root}"
|
76
|
+
|
77
|
+
# With optional leaf tag for tagged hashing (e.g., Taproot)
|
78
|
+
taproot_config = Merkle::Config.taptree
|
79
|
+
tagged_tree = Merkle::AdaptiveTree.from_elements(
|
80
|
+
config: taproot_config,
|
81
|
+
elements: elements,
|
82
|
+
leaf_tag: 'TapLeaf' # Optional tag for leaf hashing
|
83
|
+
)
|
84
|
+
|
85
|
+
# Generate and verify proof
|
86
|
+
proof = tree.generate_proof(0)
|
87
|
+
puts "Proof for first element valid: #{proof.valid?}"
|
88
|
+
```
|
89
|
+
|
61
90
|
### Adaptive Tree Example
|
62
91
|
|
63
92
|
```ruby
|
data/lib/merkle/abstract_tree.rb
CHANGED
@@ -11,13 +11,28 @@ module Merkle
|
|
11
11
|
# @param [Merkle::Config] config Configuration for merkle tree.
|
12
12
|
# @param [Array] leaves An array of leaves.
|
13
13
|
# @raise [ArgumentError]
|
14
|
-
def initialize(config:, leaves:
|
14
|
+
def initialize(config:, leaves: )
|
15
15
|
raise ArgumentError, 'config must be Merkle::Config' unless config.is_a?(Merkle::Config)
|
16
16
|
raise ArgumentError, 'leaves must be Array' unless leaves.is_a?(Array)
|
17
17
|
@config = config
|
18
18
|
@leaves = leaves
|
19
19
|
end
|
20
20
|
|
21
|
+
# Create tree from +elements+. For each element in elements,
|
22
|
+
# we compute a tagged hash, which becomes the leaf value.
|
23
|
+
# @param [Merkle::Config] config Configuration for merkle tree.
|
24
|
+
# @param [Array] elements An array of element that will be hashed to become leaves.
|
25
|
+
# @param [String] leaf_tag An optional tag to use when computing the leaf hash.
|
26
|
+
def self.from_elements(config:, elements:, leaf_tag: '')
|
27
|
+
raise ArgumentError, 'config must be Merkle::Config' unless config.is_a?(Merkle::Config)
|
28
|
+
raise ArgumentError, 'elements must be Array' unless elements.is_a?(Array)
|
29
|
+
raise ArgumentError, 'leaf_tag must be string' unless leaf_tag.is_a?(String)
|
30
|
+
leaves = elements.map do |element|
|
31
|
+
config.tagged_hash(element, leaf_tag)
|
32
|
+
end
|
33
|
+
self.new(config: config, leaves: leaves)
|
34
|
+
end
|
35
|
+
|
21
36
|
# Compute merkle root.
|
22
37
|
# @return [String] merkle root (hex value). For Bitcoin, the endianness of this value must be reversed.
|
23
38
|
# @raise [Merkle::Error] If leaves is empty.
|
data/lib/merkle/version.rb
CHANGED