sibit 0.30.3 → 0.30.5
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/Gemfile +1 -0
- data/Gemfile.lock +8 -3
- data/lib/sibit/key.rb +19 -5
- data/lib/sibit/script.rb +5 -4
- data/lib/sibit/tx.rb +0 -2
- data/lib/sibit/version.rb +1 -1
- data/lib/sibit.rb +10 -5
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: db7bd01f34e395b7e917e22c31ae9682f93c90a97a9e6ce1a8a3c73c2d3464cc
|
|
4
|
+
data.tar.gz: 1b341f64ed5422e9b75846b4f56377110a1e16a6f7ec52b4c8d3fa3918f676ee
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 047c7f09a557625119eaf0e7edf3cecc9cf42309a84f8cdc3f722e5467aa96335f776a45e8bf7fd3a16b6ce476a2a8645aec40953660e54a64d5eeaa3a576146
|
|
7
|
+
data.tar.gz: 108155111044b40ad8d43f1716407128da670cbe12adb54839946b8ed86cb23b32cf1f5b9db921c464ba7cbaa413e560e0b1c960ba47811737334d30bc939a8d
|
data/Gemfile
CHANGED
|
@@ -10,6 +10,7 @@ gemspec
|
|
|
10
10
|
|
|
11
11
|
gem 'aruba', '~>2.2', require: false
|
|
12
12
|
gem 'cucumber', '~>10.0', require: false
|
|
13
|
+
gem 'donce', '~>0.2', require: false
|
|
13
14
|
gem 'logger', '~>1.7', require: false
|
|
14
15
|
gem 'minitest', '~>6.0', require: false
|
|
15
16
|
gem 'minitest-reporters', '~>1.7', require: false
|
data/Gemfile.lock
CHANGED
|
@@ -62,6 +62,10 @@ GEM
|
|
|
62
62
|
decoor (0.1.0)
|
|
63
63
|
diff-lcs (1.6.2)
|
|
64
64
|
docile (1.4.1)
|
|
65
|
+
donce (0.2.4)
|
|
66
|
+
backtrace (~> 0.3)
|
|
67
|
+
os (~> 1.1)
|
|
68
|
+
qbash (~> 0.3)
|
|
65
69
|
elapsed (0.2.1)
|
|
66
70
|
loog (~> 0.6)
|
|
67
71
|
tago (~> 0.1)
|
|
@@ -78,6 +82,7 @@ GEM
|
|
|
78
82
|
logger (~> 1.0)
|
|
79
83
|
memoist3 (1.0.0)
|
|
80
84
|
mini_mime (1.1.5)
|
|
85
|
+
mini_portile2 (2.8.9)
|
|
81
86
|
minitest (6.0.1)
|
|
82
87
|
prism (~> 1.5)
|
|
83
88
|
minitest-reporters (1.7.1)
|
|
@@ -86,9 +91,8 @@ GEM
|
|
|
86
91
|
minitest (>= 5.0)
|
|
87
92
|
ruby-progressbar
|
|
88
93
|
multi_test (1.1.0)
|
|
89
|
-
nokogiri (1.18.10
|
|
90
|
-
|
|
91
|
-
nokogiri (1.18.10-x86_64-linux-gnu)
|
|
94
|
+
nokogiri (1.18.10)
|
|
95
|
+
mini_portile2 (~> 2.8.2)
|
|
92
96
|
racc (~> 1.4)
|
|
93
97
|
openssl (3.3.2)
|
|
94
98
|
os (1.1.4)
|
|
@@ -182,6 +186,7 @@ PLATFORMS
|
|
|
182
186
|
DEPENDENCIES
|
|
183
187
|
aruba (~> 2.2)
|
|
184
188
|
cucumber (~> 10.0)
|
|
189
|
+
donce (~> 0.2)
|
|
185
190
|
logger (~> 1.7)
|
|
186
191
|
minitest (~> 6.0)
|
|
187
192
|
minitest-reporters (~> 1.7)
|
data/lib/sibit/key.rb
CHANGED
|
@@ -21,6 +21,8 @@ class Sibit
|
|
|
21
21
|
MIN_PRIV = 0x01
|
|
22
22
|
MAX_PRIV = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140
|
|
23
23
|
|
|
24
|
+
attr_reader :network
|
|
25
|
+
|
|
24
26
|
def self.generate
|
|
25
27
|
key = OpenSSL::PKey::EC.generate('secp256k1')
|
|
26
28
|
pvt = key.private_key.to_s(16).rjust(64, '0').downcase
|
|
@@ -28,9 +30,10 @@ class Sibit
|
|
|
28
30
|
end
|
|
29
31
|
|
|
30
32
|
def initialize(privkey)
|
|
31
|
-
@
|
|
33
|
+
@network = :mainnet
|
|
32
34
|
@compressed = true
|
|
33
|
-
@
|
|
35
|
+
@privkey = decode(privkey)
|
|
36
|
+
@key = build(@privkey)
|
|
34
37
|
end
|
|
35
38
|
|
|
36
39
|
def priv
|
|
@@ -44,17 +47,18 @@ class Sibit
|
|
|
44
47
|
|
|
45
48
|
def addr
|
|
46
49
|
hash = hash160(pub)
|
|
47
|
-
|
|
50
|
+
prefix = @network == :mainnet ? '00' : '6f'
|
|
51
|
+
versioned = "#{prefix}#{hash}"
|
|
48
52
|
checksum = Base58.new(versioned).check
|
|
49
53
|
Base58.new(versioned + checksum).encode
|
|
50
54
|
end
|
|
51
55
|
|
|
52
56
|
def sign(data)
|
|
53
|
-
@key.
|
|
57
|
+
@key.dsa_sign_asn1(data)
|
|
54
58
|
end
|
|
55
59
|
|
|
56
60
|
def verify(data, sig)
|
|
57
|
-
@key.
|
|
61
|
+
@key.dsa_verify_asn1(data, sig)
|
|
58
62
|
rescue OpenSSL::PKey::PKeyError
|
|
59
63
|
false
|
|
60
64
|
end
|
|
@@ -82,5 +86,15 @@ class Sibit
|
|
|
82
86
|
bytes = [hex].pack('H*')
|
|
83
87
|
Digest::RMD160.hexdigest(Digest::SHA256.digest(bytes))
|
|
84
88
|
end
|
|
89
|
+
|
|
90
|
+
def decode(key)
|
|
91
|
+
return key if key.length == 64 && key.match?(/\A[0-9a-f]+\z/i)
|
|
92
|
+
raw = Base58.new(key).decode
|
|
93
|
+
version = raw[0, 2]
|
|
94
|
+
@network = version == '80' ? :mainnet : :testnet
|
|
95
|
+
body = raw[2..-9]
|
|
96
|
+
@compressed = body.length == 66 && body.end_with?('01')
|
|
97
|
+
@compressed ? body[0, 64] : body
|
|
98
|
+
end
|
|
85
99
|
end
|
|
86
100
|
end
|
data/lib/sibit/script.rb
CHANGED
|
@@ -25,8 +25,8 @@ class Sibit
|
|
|
25
25
|
@bytes = [hex].pack('H*').bytes
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
def address
|
|
29
|
-
return p2pkh_address if p2pkh?
|
|
28
|
+
def address(network = :mainnet)
|
|
29
|
+
return p2pkh_address(network) if p2pkh?
|
|
30
30
|
nil
|
|
31
31
|
end
|
|
32
32
|
|
|
@@ -46,10 +46,11 @@ class Sibit
|
|
|
46
46
|
|
|
47
47
|
private
|
|
48
48
|
|
|
49
|
-
def p2pkh_address
|
|
49
|
+
def p2pkh_address(network)
|
|
50
50
|
h = hash160
|
|
51
51
|
return nil unless h
|
|
52
|
-
|
|
52
|
+
prefix = network == :mainnet ? '00' : '6f'
|
|
53
|
+
versioned = "#{prefix}#{h}"
|
|
53
54
|
checksum = Base58.new(versioned).check
|
|
54
55
|
Base58.new(versioned + checksum).encode
|
|
55
56
|
end
|
data/lib/sibit/tx.rb
CHANGED
data/lib/sibit/version.rb
CHANGED
data/lib/sibit.rb
CHANGED
|
@@ -18,6 +18,9 @@ require_relative 'sibit/version'
|
|
|
18
18
|
# Copyright:: Copyright (c) 2019-2025 Yegor Bugayenko
|
|
19
19
|
# License:: MIT
|
|
20
20
|
class Sibit
|
|
21
|
+
# Minimum fee we must pay for transaction processing:
|
|
22
|
+
MIN_SATOSHI_PER_BYTE = 0.1
|
|
23
|
+
|
|
21
24
|
# Constructor.
|
|
22
25
|
#
|
|
23
26
|
# You may provide the log you want to see the messages in. If you don't
|
|
@@ -100,7 +103,9 @@ class Sibit
|
|
|
100
103
|
# +change+: the address where the change has to be sent to
|
|
101
104
|
def pay(amount, fee, sources, target, change, skip_utxo: [])
|
|
102
105
|
p = price('USD')
|
|
103
|
-
|
|
106
|
+
keys = sources.map { |k| Key.new(k) }
|
|
107
|
+
network = keys.first&.network || :mainnet
|
|
108
|
+
sources = keys.to_h { |k| [k.addr, k.priv] }
|
|
104
109
|
satoshi = satoshi(amount)
|
|
105
110
|
builder = TxBuilder.new
|
|
106
111
|
unspent = 0
|
|
@@ -118,7 +123,7 @@ class Sibit
|
|
|
118
123
|
i.prev_out(utxo[:hash])
|
|
119
124
|
i.prev_out_index(utxo[:index])
|
|
120
125
|
i.prev_out_script = script_hex(utxo[:script])
|
|
121
|
-
address = Script.new(script_hex(utxo[:script])).address
|
|
126
|
+
address = Script.new(script_hex(utxo[:script])).address(network)
|
|
122
127
|
k = sources[address]
|
|
123
128
|
raise Error, "UTXO arrived to #{address} is incorrect" unless k
|
|
124
129
|
i.signature_key(key(k))
|
|
@@ -143,7 +148,7 @@ class Sibit
|
|
|
143
148
|
tx = builder.tx(
|
|
144
149
|
input_value: unspent,
|
|
145
150
|
leave_fee: true,
|
|
146
|
-
extra_fee: [f,
|
|
151
|
+
extra_fee: [f, (size * MIN_SATOSHI_PER_BYTE).to_i].max,
|
|
147
152
|
change_address: change
|
|
148
153
|
)
|
|
149
154
|
left = unspent - tx.outputs.sum(&:value)
|
|
@@ -152,7 +157,7 @@ class Sibit
|
|
|
152
157
|
#{tx.inputs.map { |i| " in: #{i.prev_out.unpack1('H*')}:#{i.prev_out_index}" }.join("\n ")}
|
|
153
158
|
#{tx.out.count} output#{'s' if tx.out.count > 1}:
|
|
154
159
|
#{tx.outputs.map { |o| "out: #{o.script_hex} / #{num(o.value, p)}" }.join("\n ")}
|
|
155
|
-
Min
|
|
160
|
+
Min fee: #{num(MIN_SATOSHI_PER_BYTE, p)} /byte
|
|
156
161
|
Fee requested: #{num(f, p)} as \"#{fee}\"
|
|
157
162
|
Fee actually paid: #{num(left, p)}
|
|
158
163
|
Tx size: #{size} bytes
|
|
@@ -273,7 +278,7 @@ in block #{block} (by #{json[:provider]})")
|
|
|
273
278
|
sat = fees[fee.to_sym]
|
|
274
279
|
raise Error, "Can't understand the fee: #{fee.inspect}" if sat.nil?
|
|
275
280
|
f = mul * sat * size
|
|
276
|
-
@log.debug("Fee calculated as #{mul} * #{sat} * #{size} = #{f}")
|
|
281
|
+
@log.debug("Fee calculated as #{mul} * #{sat}s * #{size} = #{f}s")
|
|
277
282
|
f
|
|
278
283
|
end
|
|
279
284
|
|