bitcoinrb 1.4.0 → 1.6.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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +2 -2
  3. data/.ruby-version +1 -1
  4. data/README.md +16 -5
  5. data/bitcoinrb.gemspec +2 -2
  6. data/lib/bitcoin/bip324/cipher.rb +113 -0
  7. data/lib/bitcoin/bip324/ell_swift_pubkey.rb +42 -0
  8. data/lib/bitcoin/bip324/fs_chacha20.rb +132 -0
  9. data/lib/bitcoin/bip324/fs_chacha_poly1305.rb +129 -0
  10. data/lib/bitcoin/bip324.rb +144 -0
  11. data/lib/bitcoin/descriptor/addr.rb +31 -0
  12. data/lib/bitcoin/descriptor/checksum.rb +74 -0
  13. data/lib/bitcoin/descriptor/combo.rb +30 -0
  14. data/lib/bitcoin/descriptor/expression.rb +122 -0
  15. data/lib/bitcoin/descriptor/key_expression.rb +23 -0
  16. data/lib/bitcoin/descriptor/multi.rb +49 -0
  17. data/lib/bitcoin/descriptor/multi_a.rb +43 -0
  18. data/lib/bitcoin/descriptor/pk.rb +27 -0
  19. data/lib/bitcoin/descriptor/pkh.rb +15 -0
  20. data/lib/bitcoin/descriptor/raw.rb +32 -0
  21. data/lib/bitcoin/descriptor/script_expression.rb +24 -0
  22. data/lib/bitcoin/descriptor/sh.rb +31 -0
  23. data/lib/bitcoin/descriptor/sorted_multi.rb +15 -0
  24. data/lib/bitcoin/descriptor/sorted_multi_a.rb +15 -0
  25. data/lib/bitcoin/descriptor/tr.rb +91 -0
  26. data/lib/bitcoin/descriptor/wpkh.rb +19 -0
  27. data/lib/bitcoin/descriptor/wsh.rb +30 -0
  28. data/lib/bitcoin/descriptor.rb +176 -100
  29. data/lib/bitcoin/ext/ecdsa.rb +0 -6
  30. data/lib/bitcoin/key.rb +16 -4
  31. data/lib/bitcoin/message_sign.rb +13 -8
  32. data/lib/bitcoin/script/script.rb +8 -3
  33. data/lib/bitcoin/secp256k1/native.rb +62 -6
  34. data/lib/bitcoin/secp256k1/ruby.rb +21 -4
  35. data/lib/bitcoin/taproot/custom_depth_builder.rb +64 -0
  36. data/lib/bitcoin/taproot/simple_builder.rb +1 -6
  37. data/lib/bitcoin/taproot.rb +1 -0
  38. data/lib/bitcoin/tx.rb +1 -1
  39. data/lib/bitcoin/util.rb +11 -3
  40. data/lib/bitcoin/version.rb +1 -1
  41. data/lib/bitcoin.rb +1 -0
  42. metadata +30 -7
@@ -0,0 +1,64 @@
1
+ module Bitcoin
2
+ module Taproot
3
+ # A class that takes the script tree configuration as a nested array and constructs the Taproot output.
4
+ # TODO WIP
5
+ class CustomDepthBuilder < SimpleBuilder
6
+
7
+ attr_reader :tree
8
+
9
+ # Constructor
10
+ # @param [String] internal_key Internal public key with hex format.
11
+ # @param [Array] tree Script tree configuration as a nested array.
12
+ # @return [Bitcoin::Taproot::CustomDepthBuilder]
13
+ def initialize(internal_key, tree)
14
+ super(internal_key, [])
15
+ raise ArgumentError, "tree must be an array." unless tree.is_a?(Array)
16
+ raise ArgumentError, "tree must be binary tree." unless tree.length == 2
17
+ tree.each do |item|
18
+ unless item.is_a?(Array) || item.is_a?(Bitcoin::Taproot::LeafNode)
19
+ raise ArgumentError, "tree must consist of either an array or LeafNode."
20
+ end
21
+ raise ArgumentError, "tree must be binary tree." if item.is_a?(Array) && item.length != 2
22
+ end
23
+ @tree = tree
24
+ end
25
+
26
+ def add_leaf(leaf)
27
+ raise NotImplementedError
28
+ end
29
+
30
+ def add_branch(leaf1, leaf2 = nil)
31
+ raise NotImplementedError
32
+ end
33
+
34
+ def control_block(leaf)
35
+ raise NotImplementedError # TODO
36
+ end
37
+
38
+ def inclusion_proof(leaf)
39
+ raise NotImplementedError # TODO
40
+ end
41
+
42
+ private
43
+
44
+ def merkle_root
45
+ build_tree(tree).bth
46
+ end
47
+
48
+ def build_tree(tree)
49
+ left, right = tree
50
+ left_hash = if left.is_a?(Array)
51
+ build_tree(left)
52
+ else
53
+ left
54
+ end
55
+ right_hash = if right.is_a?(Array)
56
+ build_tree(right)
57
+ else
58
+ right
59
+ end
60
+ combine_hash([left_hash, right_hash])
61
+ end
62
+ end
63
+ end
64
+ end
@@ -16,6 +16,7 @@ module Bitcoin
16
16
  # @raise [Bitcoin::Taproot::Builder] +internal_pubkey+ dose not xonly public key or leaf in +leaves+ does not instance of Bitcoin::Taproot::LeafNode.
17
17
  # @return [Bitcoin::Taproot::SimpleBuilder]
18
18
  def initialize(internal_key, leaves = [])
19
+ raise ArgumentError, "Internal public key must be string." unless internal_key.is_a?(String)
19
20
  raise Error, "Internal public key must be #{X_ONLY_PUBKEY_SIZE} bytes" unless internal_key.htb.bytesize == X_ONLY_PUBKEY_SIZE
20
21
  raise Error, 'leaf must be Bitcoin::Taproot::LeafNode object' if leaves.find{ |leaf| !leaf.is_a?(Bitcoin::Taproot::LeafNode)}
21
22
 
@@ -113,12 +114,6 @@ module Bitcoin
113
114
 
114
115
  private
115
116
 
116
- # Compute tweak from script tree.
117
- # @return [String] tweak with binary format.
118
- def tweak
119
- Taproot.tweak(Bitcoin::Key.from_xonly_pubkey(internal_key), merkle_root)
120
- end
121
-
122
117
  # Calculate merkle root from branches.
123
118
  # @return [String] merkle root with hex format.
124
119
  def merkle_root
@@ -6,6 +6,7 @@ module Bitcoin
6
6
  autoload :LeafNode, 'bitcoin/taproot/leaf_node'
7
7
  autoload :ControlBlock, 'bitcoin/taproot/control_block'
8
8
  autoload :SimpleBuilder, 'bitcoin/taproot/simple_builder'
9
+ autoload :CustomDepthBuilder, 'bitcoin/taproot/custom_depth_builder'
9
10
 
10
11
  module_function
11
12
 
data/lib/bitcoin/tx.rb CHANGED
@@ -111,7 +111,7 @@ module Bitcoin
111
111
  end
112
112
 
113
113
  def witness?
114
- !inputs.find { |i| !i.script_witness.empty? }.nil?
114
+ inputs.any?(&:has_witness?)
115
115
  end
116
116
 
117
117
  def ==(other)
data/lib/bitcoin/util.rb CHANGED
@@ -131,10 +131,18 @@ module Bitcoin
131
131
  double_sha256(hex.htb).bth[0..7]
132
132
  end
133
133
 
134
- DIGEST_NAME_SHA256 = 'sha256'
135
-
136
134
  def hmac_sha256(key, data)
137
- OpenSSL::HMAC.digest(DIGEST_NAME_SHA256, key, data)
135
+ Bitcoin.hmac_sha256(key, data)
136
+ end
137
+
138
+ # Run HKDF.
139
+ # @param [String] ikm The input keying material with binary format.
140
+ # @param [String] salt The salt with binary format.
141
+ # @param [String] info The context and application specific information with binary format.
142
+ # @param [Integer] length The output length in octets.
143
+ # @return [String] The result of HKDF with binary format.
144
+ def hkdf_sha256(ikm, salt, info, length = 32)
145
+ OpenSSL::KDF.hkdf(ikm, salt: salt, info: info, length: length, hash: "SHA256")
138
146
  end
139
147
 
140
148
  # check whether +addr+ is valid address.
@@ -1,3 +1,3 @@
1
1
  module Bitcoin
2
- VERSION = "1.4.0"
2
+ VERSION = "1.6.0"
3
3
  end
data/lib/bitcoin.rb CHANGED
@@ -61,6 +61,7 @@ module Bitcoin
61
61
  autoload :SigHashGenerator, 'bitcoin/sighash_generator'
62
62
  autoload :MessageSign, 'bitcoin/message_sign'
63
63
  autoload :Taproot, 'bitcoin/taproot'
64
+ autoload :BIP324, 'bitcoin/bip324'
64
65
 
65
66
  require_relative 'bitcoin/constants'
66
67
  require_relative 'bitcoin/ext/ecdsa'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitcoinrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-12-19 00:00:00.000000000 Z
11
+ date: 2024-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ecdsa_ext
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.5.0
19
+ version: 0.5.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.5.0
26
+ version: 0.5.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: eventmachine
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -184,14 +184,14 @@ dependencies:
184
184
  requirements:
185
185
  - - ">="
186
186
  - !ruby/object:Gem::Version
187
- version: 0.5.0
187
+ version: 0.7.0
188
188
  type: :runtime
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
- version: 0.5.0
194
+ version: 0.7.0
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: base32
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -332,6 +332,11 @@ files:
332
332
  - exe/bitcoinrbd
333
333
  - lib/bitcoin.rb
334
334
  - lib/bitcoin/base58.rb
335
+ - lib/bitcoin/bip324.rb
336
+ - lib/bitcoin/bip324/cipher.rb
337
+ - lib/bitcoin/bip324/ell_swift_pubkey.rb
338
+ - lib/bitcoin/bip324/fs_chacha20.rb
339
+ - lib/bitcoin/bip324/fs_chacha_poly1305.rb
335
340
  - lib/bitcoin/bip85_entropy.rb
336
341
  - lib/bitcoin/bit_stream.rb
337
342
  - lib/bitcoin/block.rb
@@ -345,6 +350,23 @@ files:
345
350
  - lib/bitcoin/chainparams/testnet.yml
346
351
  - lib/bitcoin/constants.rb
347
352
  - lib/bitcoin/descriptor.rb
353
+ - lib/bitcoin/descriptor/addr.rb
354
+ - lib/bitcoin/descriptor/checksum.rb
355
+ - lib/bitcoin/descriptor/combo.rb
356
+ - lib/bitcoin/descriptor/expression.rb
357
+ - lib/bitcoin/descriptor/key_expression.rb
358
+ - lib/bitcoin/descriptor/multi.rb
359
+ - lib/bitcoin/descriptor/multi_a.rb
360
+ - lib/bitcoin/descriptor/pk.rb
361
+ - lib/bitcoin/descriptor/pkh.rb
362
+ - lib/bitcoin/descriptor/raw.rb
363
+ - lib/bitcoin/descriptor/script_expression.rb
364
+ - lib/bitcoin/descriptor/sh.rb
365
+ - lib/bitcoin/descriptor/sorted_multi.rb
366
+ - lib/bitcoin/descriptor/sorted_multi_a.rb
367
+ - lib/bitcoin/descriptor/tr.rb
368
+ - lib/bitcoin/descriptor/wpkh.rb
369
+ - lib/bitcoin/descriptor/wsh.rb
348
370
  - lib/bitcoin/errors.rb
349
371
  - lib/bitcoin/ext.rb
350
372
  - lib/bitcoin/ext/array_ext.rb
@@ -459,6 +481,7 @@ files:
459
481
  - lib/bitcoin/store/utxo_db.rb
460
482
  - lib/bitcoin/taproot.rb
461
483
  - lib/bitcoin/taproot/control_block.rb
484
+ - lib/bitcoin/taproot/custom_depth_builder.rb
462
485
  - lib/bitcoin/taproot/leaf_node.rb
463
486
  - lib/bitcoin/taproot/simple_builder.rb
464
487
  - lib/bitcoin/tx.rb
@@ -496,7 +519,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
496
519
  - !ruby/object:Gem::Version
497
520
  version: '0'
498
521
  requirements: []
499
- rubygems_version: 3.4.1
522
+ rubygems_version: 3.5.3
500
523
  signing_key:
501
524
  specification_version: 4
502
525
  summary: The implementation of Bitcoin Protocol for Ruby.