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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +2 -2
- data/.ruby-version +1 -1
- data/README.md +16 -5
- data/bitcoinrb.gemspec +2 -2
- data/lib/bitcoin/bip324/cipher.rb +113 -0
- data/lib/bitcoin/bip324/ell_swift_pubkey.rb +42 -0
- data/lib/bitcoin/bip324/fs_chacha20.rb +132 -0
- data/lib/bitcoin/bip324/fs_chacha_poly1305.rb +129 -0
- data/lib/bitcoin/bip324.rb +144 -0
- data/lib/bitcoin/descriptor/addr.rb +31 -0
- data/lib/bitcoin/descriptor/checksum.rb +74 -0
- data/lib/bitcoin/descriptor/combo.rb +30 -0
- data/lib/bitcoin/descriptor/expression.rb +122 -0
- data/lib/bitcoin/descriptor/key_expression.rb +23 -0
- data/lib/bitcoin/descriptor/multi.rb +49 -0
- data/lib/bitcoin/descriptor/multi_a.rb +43 -0
- data/lib/bitcoin/descriptor/pk.rb +27 -0
- data/lib/bitcoin/descriptor/pkh.rb +15 -0
- data/lib/bitcoin/descriptor/raw.rb +32 -0
- data/lib/bitcoin/descriptor/script_expression.rb +24 -0
- data/lib/bitcoin/descriptor/sh.rb +31 -0
- data/lib/bitcoin/descriptor/sorted_multi.rb +15 -0
- data/lib/bitcoin/descriptor/sorted_multi_a.rb +15 -0
- data/lib/bitcoin/descriptor/tr.rb +91 -0
- data/lib/bitcoin/descriptor/wpkh.rb +19 -0
- data/lib/bitcoin/descriptor/wsh.rb +30 -0
- data/lib/bitcoin/descriptor.rb +176 -100
- data/lib/bitcoin/ext/ecdsa.rb +0 -6
- data/lib/bitcoin/key.rb +16 -4
- data/lib/bitcoin/message_sign.rb +13 -8
- data/lib/bitcoin/script/script.rb +8 -3
- data/lib/bitcoin/secp256k1/native.rb +62 -6
- data/lib/bitcoin/secp256k1/ruby.rb +21 -4
- data/lib/bitcoin/taproot/custom_depth_builder.rb +64 -0
- data/lib/bitcoin/taproot/simple_builder.rb +1 -6
- data/lib/bitcoin/taproot.rb +1 -0
- data/lib/bitcoin/tx.rb +1 -1
- data/lib/bitcoin/util.rb +11 -3
- data/lib/bitcoin/version.rb +1 -1
- data/lib/bitcoin.rb +1 -0
- 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
|
data/lib/bitcoin/taproot.rb
CHANGED
@@ -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
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
|
-
|
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.
|
data/lib/bitcoin/version.rb
CHANGED
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
|
+
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:
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|