bitcoinrb 1.15.0 → 1.16.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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/bitcoinrb.gemspec +5 -4
  3. data/lib/bitcoin/bip321_uri.rb +95 -32
  4. data/lib/bitcoin/bip324/ell_swift_pubkey.rb +3 -1
  5. data/lib/bitcoin/bip324/fs_chacha20.rb +3 -0
  6. data/lib/bitcoin/bip324.rb +1 -1
  7. data/lib/bitcoin/bip85_entropy.rb +79 -29
  8. data/lib/bitcoin/bit_stream.rb +2 -2
  9. data/lib/bitcoin/block.rb +46 -7
  10. data/lib/bitcoin/block_filter.rb +3 -2
  11. data/lib/bitcoin/block_header.rb +31 -8
  12. data/lib/bitcoin/bloom_filter.rb +5 -2
  13. data/lib/bitcoin/chainparams/regtest.yml +0 -1
  14. data/lib/bitcoin/chainparams/signet.yml +1 -1
  15. data/lib/bitcoin/constants.rb +13 -3
  16. data/lib/bitcoin/descriptor/combo.rb +13 -1
  17. data/lib/bitcoin/descriptor/expression.rb +35 -15
  18. data/lib/bitcoin/descriptor/multi.rb +9 -1
  19. data/lib/bitcoin/descriptor/multi_a.rb +4 -0
  20. data/lib/bitcoin/descriptor/musig.rb +1 -0
  21. data/lib/bitcoin/descriptor/pk.rb +7 -0
  22. data/lib/bitcoin/descriptor/pkh.rb +5 -0
  23. data/lib/bitcoin/descriptor/raw.rb +1 -1
  24. data/lib/bitcoin/descriptor/sh.rb +1 -0
  25. data/lib/bitcoin/descriptor/sp.rb +2 -2
  26. data/lib/bitcoin/descriptor/tr.rb +29 -3
  27. data/lib/bitcoin/descriptor/wpkh.rb +1 -0
  28. data/lib/bitcoin/descriptor/wsh.rb +1 -0
  29. data/lib/bitcoin/descriptor.rb +59 -35
  30. data/lib/bitcoin/ext/array_ext.rb +3 -0
  31. data/lib/bitcoin/ext/ecdsa.rb +7 -1
  32. data/lib/bitcoin/ext_key.rb +10 -0
  33. data/lib/bitcoin/gcs_filter.rb +21 -6
  34. data/lib/bitcoin/key.rb +66 -14
  35. data/lib/bitcoin/key_path.rb +8 -5
  36. data/lib/bitcoin/message/addr.rb +1 -0
  37. data/lib/bitcoin/message/addr_v2.rb +1 -0
  38. data/lib/bitcoin/message/base.rb +8 -1
  39. data/lib/bitcoin/message/block.rb +4 -8
  40. data/lib/bitcoin/message/block_transaction_request.rb +11 -8
  41. data/lib/bitcoin/message/block_transactions.rb +2 -1
  42. data/lib/bitcoin/message/cf_parser.rb +1 -0
  43. data/lib/bitcoin/message/cfcheckpt.rb +3 -3
  44. data/lib/bitcoin/message/cfheaders.rb +5 -4
  45. data/lib/bitcoin/message/cfilter.rb +3 -3
  46. data/lib/bitcoin/message/error.rb +3 -1
  47. data/lib/bitcoin/message/fee_filter.rb +1 -0
  48. data/lib/bitcoin/message/filter_add.rb +3 -1
  49. data/lib/bitcoin/message/filter_load.rb +4 -4
  50. data/lib/bitcoin/message/get_cfcheckpt.rb +1 -0
  51. data/lib/bitcoin/message/header_and_short_ids.rb +26 -11
  52. data/lib/bitcoin/message/headers.rb +10 -2
  53. data/lib/bitcoin/message/headers_parser.rb +4 -2
  54. data/lib/bitcoin/message/inventories_parser.rb +2 -1
  55. data/lib/bitcoin/message/inventory.rb +15 -6
  56. data/lib/bitcoin/message/merkle_block.rb +4 -4
  57. data/lib/bitcoin/message/network_addr.rb +13 -13
  58. data/lib/bitcoin/message/ping.rb +1 -0
  59. data/lib/bitcoin/message/pong.rb +1 -0
  60. data/lib/bitcoin/message/reject.rb +1 -0
  61. data/lib/bitcoin/message/send_cmpct.rb +2 -2
  62. data/lib/bitcoin/message/send_tx_rcncl.rb +1 -1
  63. data/lib/bitcoin/message/version.rb +23 -8
  64. data/lib/bitcoin/message.rb +15 -0
  65. data/lib/bitcoin/message_sign.rb +44 -6
  66. data/lib/bitcoin/mnemonic.rb +8 -0
  67. data/lib/bitcoin/out_point.rb +6 -2
  68. data/lib/bitcoin/partial_tree.rb +41 -28
  69. data/lib/bitcoin/payment_code.rb +26 -8
  70. data/lib/bitcoin/psbt/hd_key_path.rb +1 -2
  71. data/lib/bitcoin/psbt/input.rb +199 -48
  72. data/lib/bitcoin/psbt/key_origin_info.rb +2 -0
  73. data/lib/bitcoin/psbt/output.rb +9 -6
  74. data/lib/bitcoin/psbt/proprietary.rb +6 -3
  75. data/lib/bitcoin/psbt/tx.rb +9 -4
  76. data/lib/bitcoin/psbt.rb +46 -0
  77. data/lib/bitcoin/rpc/bitcoin_core_client.rb +54 -13
  78. data/lib/bitcoin/rpc/error.rb +43 -0
  79. data/lib/bitcoin/rpc.rb +1 -0
  80. data/lib/bitcoin/script/script.rb +114 -33
  81. data/lib/bitcoin/script/script_interpreter.rb +11 -6
  82. data/lib/bitcoin/script/tx_checker.rb +7 -2
  83. data/lib/bitcoin/script_witness.rb +5 -1
  84. data/lib/bitcoin/secp256k1/ruby.rb +10 -4
  85. data/lib/bitcoin/silent_payment.rb +6 -3
  86. data/lib/bitcoin/slip39/share.rb +35 -9
  87. data/lib/bitcoin/slip39/sss.rb +26 -11
  88. data/lib/bitcoin/slip39.rb +13 -5
  89. data/lib/bitcoin/taproot/control_block.rb +6 -1
  90. data/lib/bitcoin/taproot/custom_depth_builder.rb +12 -0
  91. data/lib/bitcoin/tx.rb +35 -14
  92. data/lib/bitcoin/tx_in.rb +2 -2
  93. data/lib/bitcoin/tx_out.rb +2 -2
  94. data/lib/bitcoin/util.rb +49 -28
  95. data/lib/bitcoin/validation.rb +64 -12
  96. data/lib/bitcoin/version.rb +1 -1
  97. data/lib/bitcoin/wallet/account.rb +35 -11
  98. data/lib/bitcoin/wallet/base.rb +40 -15
  99. data/lib/bitcoin/wallet/utxo.rb +22 -4
  100. data/lib/bitcoin.rb +16 -4
  101. metadata +24 -9
data/lib/bitcoin.rb CHANGED
@@ -38,6 +38,7 @@ module Bitcoin
38
38
  autoload :Base58, 'bitcoin/base58'
39
39
  autoload :Secp256k1, 'bitcoin/secp256k1'
40
40
  autoload :Mnemonic, 'bitcoin/mnemonic'
41
+ autoload :Validation, 'bitcoin/validation'
41
42
  autoload :ValidationState, 'bitcoin/validation'
42
43
  autoload :RPC, 'bitcoin/rpc'
43
44
  autoload :Wallet, 'bitcoin/wallet'
@@ -50,7 +51,6 @@ module Bitcoin
50
51
  autoload :KeyPath, 'bitcoin/key_path'
51
52
  autoload :Descriptor, 'bitcoin/descriptor'
52
53
  autoload :SLIP39, 'bitcoin/slip39'
53
- autoload :Aezeed, 'bitcoin/aezeed'
54
54
  autoload :PaymentCode, 'bitcoin/payment_code'
55
55
  autoload :BIP85Entropy, 'bitcoin/bip85_entropy'
56
56
  autoload :Errors, 'bitcoin/errors'
@@ -121,7 +121,11 @@ module Bitcoin
121
121
  end
122
122
 
123
123
  # hex string convert to binary
124
+ # @raise [ArgumentError] If this is not a hex string of even length. An odd length would be padded
125
+ # with a zero nibble and a character which is not a hex digit would be read as one, so that for
126
+ # example a 63 character private key would silently become a different key.
124
127
  def htb
128
+ raise ArgumentError, 'Not a hex string of even length.' unless valid_hex?
125
129
  [self].pack('H*')
126
130
  end
127
131
 
@@ -164,7 +168,7 @@ module Bitcoin
164
168
  when Bitcoin::Opcodes::OP_PUSHDATA4
165
169
  offset += 4
166
170
  end
167
- self[offset..-1]
171
+ self[offset..-1] || '' # A length field cut short leaves no data.
168
172
  end
169
173
 
170
174
  def valid_pushdata_length?
@@ -185,19 +189,27 @@ module Bitcoin
185
189
  else
186
190
  opcode
187
191
  end
192
+ return false if len.nil? # The length field itself is cut short.
188
193
  self.bytesize == len + offset
189
194
  end
190
195
 
191
196
  # whether value is hex or not hex
192
- # @return [Boolean] return true if data is hex
197
+ # @return [Boolean] return true if data is hex of even length, including an empty string. A string
198
+ # which is not valid in its encoding, e.g. binary data labelled as UTF-8, is not hex either.
193
199
  def valid_hex?
194
- !self[/\H/]
200
+ # Matching the bytes does not raise for an invalid byte sequence. A valid ASCII compatible string
201
+ # is matched as it is, to avoid a copy.
202
+ bytes = valid_encoding? && encoding.ascii_compatible? ? self : b
203
+ bytes.bytesize.even? && !bytes.match?(/[^0-9a-fA-F]/)
195
204
  end
196
205
 
197
206
  end
198
207
 
199
208
  class ::Integer
209
+ # @return [String] the hex string of this integer, padded to an even length.
210
+ # @raise [ArgumentError] If this is negative, which has no such hex string: to_s(16) gives it a '-' sign.
200
211
  def to_even_length_hex
212
+ raise ArgumentError, 'A negative integer has no even length hex string.' if negative?
201
213
  hex = to_s(16)
202
214
  hex.rjust((hex.length / 2.0).ceil * 2, '0')
203
215
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitcoinrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.15.0
4
+ version: 1.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.5.1
18
+ version: 0.6.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: 0.5.1
25
+ version: 0.6.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: murmurhash3
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -43,14 +43,14 @@ dependencies:
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 1.5.0
46
+ version: 1.6.0
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: 1.5.0
53
+ version: 1.6.0
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: siphash
56
56
  requirement: !ruby/object:Gem::Requirement
@@ -71,14 +71,14 @@ dependencies:
71
71
  requirements:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: 0.7.0
74
+ version: 0.8.0
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - ">="
80
80
  - !ruby/object:Gem::Version
81
- version: 0.7.0
81
+ version: 0.8.0
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: base32
84
84
  requirement: !ruby/object:Gem::Requirement
@@ -107,20 +107,34 @@ dependencies:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
109
  version: 0.2.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: bigdecimal
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
110
124
  - !ruby/object:Gem::Dependency
111
125
  name: secp256k1rb
112
126
  requirement: !ruby/object:Gem::Requirement
113
127
  requirements:
114
128
  - - '='
115
129
  - !ruby/object:Gem::Version
116
- version: 0.8.0
130
+ version: 0.8.1
117
131
  type: :runtime
118
132
  prerelease: false
119
133
  version_requirements: !ruby/object:Gem::Requirement
120
134
  requirements:
121
135
  - - '='
122
136
  - !ruby/object:Gem::Version
123
- version: 0.8.0
137
+ version: 0.8.1
124
138
  - !ruby/object:Gem::Dependency
125
139
  name: logger
126
140
  requirement: !ruby/object:Gem::Requirement
@@ -307,6 +321,7 @@ files:
307
321
  - lib/bitcoin/psbt/tx.rb
308
322
  - lib/bitcoin/rpc.rb
309
323
  - lib/bitcoin/rpc/bitcoin_core_client.rb
324
+ - lib/bitcoin/rpc/error.rb
310
325
  - lib/bitcoin/script/multisig.rb
311
326
  - lib/bitcoin/script/script.rb
312
327
  - lib/bitcoin/script/script_error.rb