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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bce04358fd44b062aa388fdc8bb834a33e6dc082ae522e097f7a90a777cceb7d
4
- data.tar.gz: e9cdee4066043760ecd72b89bc355060cb47273ae13a4b1c379e7ecca494fb62
3
+ metadata.gz: acfb1daee054131392665bdb186173e4d9facf8d8a25f0d082d3d18bdb3a9b51
4
+ data.tar.gz: cb94b561dc7dfbffd9a951a94c8a015710d388f7f49466808db0bdf583d1f5cb
5
5
  SHA512:
6
- metadata.gz: 7f5719c3393e13411152b2207ad1c3c109c468d0611d9c5d5c83d1430ee427dbfe914aa427145052a7bc8a55f8ebb71aaa809d45516b61243981f50a58388165
7
- data.tar.gz: 7dac36c4c6aaa55107f8ca2b7c7b06efba49c59f66017e50a225c463d17f4635f13f5401b640a0735c2893ac819574589655ec9f5e5eeed0ffaf2a1704a0a7f8
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
- # Prepare leaves (hex strings)
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
@@ -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.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Merkle
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: merkle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi