bitcoinrb 1.5.0 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +1 -1
- data/README.md +7 -5
- data/lib/bitcoin/block.rb +27 -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 +30 -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/raw_tr.rb +20 -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 +186 -100
- data/lib/bitcoin/key.rb +1 -1
- data/lib/bitcoin/message_sign.rb +2 -1
- data/lib/bitcoin/script/script.rb +8 -3
- data/lib/bitcoin/script_witness.rb +1 -0
- data/lib/bitcoin/secp256k1/native.rb +1 -1
- data/lib/bitcoin/silent_payment.rb +5 -0
- data/lib/bitcoin/sp/addr.rb +55 -0
- 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 +14 -1
- data/lib/bitcoin/version.rb +1 -1
- data/lib/bitcoin.rb +1 -0
- metadata +23 -2
@@ -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
@@ -33,6 +33,19 @@ module Bitcoin
|
|
33
33
|
alias_method :in, :inputs
|
34
34
|
alias_method :out, :outputs
|
35
35
|
|
36
|
+
# Create coinbase transaction.
|
37
|
+
# @param [String] msg Message embedded in coinbase transaction.
|
38
|
+
# @param [Bitcoin::Script] script Coinbase transaction scriptPubkey.
|
39
|
+
# @param [Integer] rewards Coinbase Transaction Rewards
|
40
|
+
# @return [Bitcoin::Tx] Coinbase transaction.
|
41
|
+
def self.create_coinbase(msg, script, rewards = 50 * 100000000)
|
42
|
+
coinbase = Tx.new
|
43
|
+
script_sig = Bitcoin::Script.new << 486604799 << "04" << msg.bth
|
44
|
+
coinbase.in << TxIn.new(out_point: OutPoint.create_coinbase_outpoint, script_sig: script_sig)
|
45
|
+
coinbase.out << TxOut.new(value: rewards, script_pubkey: script)
|
46
|
+
coinbase
|
47
|
+
end
|
48
|
+
|
36
49
|
def self.parse_from_payload(payload, non_witness: false, strict: false)
|
37
50
|
buf = payload.is_a?(String) ? StringIO.new(payload) : payload
|
38
51
|
tx = new
|
@@ -111,7 +124,7 @@ module Bitcoin
|
|
111
124
|
end
|
112
125
|
|
113
126
|
def witness?
|
114
|
-
|
127
|
+
inputs.any?(&:has_witness?)
|
115
128
|
end
|
116
129
|
|
117
130
|
def ==(other)
|
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 :SilentPayment, 'bitcoin/silent_payment'
|
64
65
|
autoload :BIP324, 'bitcoin/bip324'
|
65
66
|
|
66
67
|
require_relative 'bitcoin/constants'
|
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.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- azuchi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ecdsa_ext
|
@@ -350,6 +350,24 @@ files:
|
|
350
350
|
- lib/bitcoin/chainparams/testnet.yml
|
351
351
|
- lib/bitcoin/constants.rb
|
352
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/raw_tr.rb
|
364
|
+
- lib/bitcoin/descriptor/script_expression.rb
|
365
|
+
- lib/bitcoin/descriptor/sh.rb
|
366
|
+
- lib/bitcoin/descriptor/sorted_multi.rb
|
367
|
+
- lib/bitcoin/descriptor/sorted_multi_a.rb
|
368
|
+
- lib/bitcoin/descriptor/tr.rb
|
369
|
+
- lib/bitcoin/descriptor/wpkh.rb
|
370
|
+
- lib/bitcoin/descriptor/wsh.rb
|
353
371
|
- lib/bitcoin/errors.rb
|
354
372
|
- lib/bitcoin/ext.rb
|
355
373
|
- lib/bitcoin/ext/array_ext.rb
|
@@ -452,10 +470,12 @@ files:
|
|
452
470
|
- lib/bitcoin/secp256k1/rfc6979.rb
|
453
471
|
- lib/bitcoin/secp256k1/ruby.rb
|
454
472
|
- lib/bitcoin/sighash_generator.rb
|
473
|
+
- lib/bitcoin/silent_payment.rb
|
455
474
|
- lib/bitcoin/slip39.rb
|
456
475
|
- lib/bitcoin/slip39/share.rb
|
457
476
|
- lib/bitcoin/slip39/sss.rb
|
458
477
|
- lib/bitcoin/slip39/wordlist/english.txt
|
478
|
+
- lib/bitcoin/sp/addr.rb
|
459
479
|
- lib/bitcoin/store.rb
|
460
480
|
- lib/bitcoin/store/chain_entry.rb
|
461
481
|
- lib/bitcoin/store/db.rb
|
@@ -464,6 +484,7 @@ files:
|
|
464
484
|
- lib/bitcoin/store/utxo_db.rb
|
465
485
|
- lib/bitcoin/taproot.rb
|
466
486
|
- lib/bitcoin/taproot/control_block.rb
|
487
|
+
- lib/bitcoin/taproot/custom_depth_builder.rb
|
467
488
|
- lib/bitcoin/taproot/leaf_node.rb
|
468
489
|
- lib/bitcoin/taproot/simple_builder.rb
|
469
490
|
- lib/bitcoin/tx.rb
|