bitcoin-ruby 0.0.12 → 0.0.13
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.lock +1 -1
- data/lib/bitcoin/protocol/tx.rb +51 -52
- data/lib/bitcoin/script.rb +4 -2
- data/lib/bitcoin/version.rb +1 -1
- data/spec/bitcoin/protocol/tx_spec.rb +3 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d147f8bf63febaaeb3a38004c78f7b143284de5
|
4
|
+
data.tar.gz: f3fc9dcebed29a46a5ad850e19eb21468c9c6915
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0896c7cac52a99f68a6b6aee884d87a10516a8d419182b00f44b7e95fc2b1a9676e600d5c8bd1c373af19e17c1c72ba110c9449d4b8a8ef5bcce7918fb2cb12b'
|
7
|
+
data.tar.gz: d33dca0010b3dab6181602b8b27f4099b0814659882a64e3e298b22a9b1a71c3ac82402df5119e33dcee63224f421b1a06104ed179544c39b50ba1e43574f8c5
|
data/Gemfile.lock
CHANGED
data/lib/bitcoin/protocol/tx.rb
CHANGED
@@ -81,23 +81,18 @@ module Bitcoin
|
|
81
81
|
|
82
82
|
return false if buf.eof?
|
83
83
|
|
84
|
-
in_size = Protocol.unpack_var_int_from_io(buf)
|
85
|
-
|
86
84
|
# segwit serialization format is defined by https://github.com/bitcoin/bips/blob/master/bip-0144.mediawiki
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
buf.seek(buf.pos - 1)
|
99
|
-
end
|
100
|
-
end
|
85
|
+
# Also note that it is impossible to parse 0 input transactions. Regular transactions with 0 inputs look
|
86
|
+
# like malformed segwit transactions.
|
87
|
+
@marker = buf.read(1).unpack('c').first
|
88
|
+
@flag = buf.read(1).unpack('c').first
|
89
|
+
|
90
|
+
witness = @marker == 0 && @flag != 0
|
91
|
+
|
92
|
+
# Non-segwit format does not contain marker or flag fields.
|
93
|
+
buf.seek(buf.pos - 2) unless witness
|
94
|
+
|
95
|
+
in_size = Protocol.unpack_var_int_from_io(buf)
|
101
96
|
|
102
97
|
@in = []
|
103
98
|
in_size.times{
|
@@ -271,12 +266,12 @@ module Bitcoin
|
|
271
266
|
|
272
267
|
# verify input signature +in_idx+ against the corresponding
|
273
268
|
# output in +outpoint_tx+
|
274
|
-
# outpoint
|
269
|
+
# outpoint. This arg can also be a Script or TxOut.
|
275
270
|
#
|
276
271
|
# options are: verify_sigpushonly, verify_minimaldata, verify_cleanstack, verify_dersig, verify_low_s, verify_strictenc, fork_id
|
277
|
-
def verify_input_signature(in_idx,
|
272
|
+
def verify_input_signature(in_idx, outpoint_data, block_timestamp=Time.now.to_i, opts={})
|
278
273
|
if @enable_bitcoinconsensus
|
279
|
-
return bitcoinconsensus_verify_script(in_idx,
|
274
|
+
return bitcoinconsensus_verify_script(in_idx, outpoint_data, block_timestamp, opts)
|
280
275
|
end
|
281
276
|
|
282
277
|
# If FORKID is enabled, we also ensure strict encoding.
|
@@ -285,21 +280,12 @@ module Bitcoin
|
|
285
280
|
outpoint_idx = @in[in_idx].prev_out_index
|
286
281
|
script_sig = @in[in_idx].script_sig
|
287
282
|
|
288
|
-
amount =
|
289
|
-
script_pubkey =
|
290
|
-
if outpoint_tx_or_script.respond_to?(:out)
|
291
|
-
# If given an entire previous transaction, take the script from it
|
292
|
-
prevout = outpoint_tx_or_script.out[outpoint_idx]
|
293
|
-
amount = prevout.value
|
294
|
-
script_pubkey = prevout.pk_script
|
295
|
-
else
|
296
|
-
if opts[:fork_id]
|
297
|
-
raise "verify_input_signature must be called with a previous transaction if " \
|
298
|
-
"SIGHASH_FORKID is enabled"
|
299
|
-
end
|
283
|
+
amount = amount_from_outpoint_data(outpoint_data, outpoint_idx)
|
284
|
+
script_pubkey = script_pubkey_from_outpoint_data(outpoint_data, outpoint_idx)
|
300
285
|
|
301
|
-
|
302
|
-
|
286
|
+
if opts[:fork_id] && amount.nil?
|
287
|
+
raise "verify_input_signature must be called with a previous transaction or " \
|
288
|
+
"transaction output if SIGHASH_FORKID is enabled"
|
303
289
|
end
|
304
290
|
|
305
291
|
@scripts[in_idx] = Bitcoin::Script.new(script_sig, script_pubkey)
|
@@ -317,24 +303,19 @@ module Bitcoin
|
|
317
303
|
|
318
304
|
# verify witness input signature +in_idx+ against the corresponding
|
319
305
|
# output in +outpoint_tx+
|
320
|
-
# outpoint
|
306
|
+
# outpoint. This arg can also be a Script or TxOut
|
321
307
|
#
|
322
308
|
# options are: verify_sigpushonly, verify_minimaldata, verify_cleanstack, verify_dersig, verify_low_s, verify_strictenc
|
323
|
-
def verify_witness_input_signature(in_idx,
|
309
|
+
def verify_witness_input_signature(in_idx, outpoint_data, prev_out_amount, block_timestamp=Time.now.to_i, opts={})
|
324
310
|
if @enable_bitcoinconsensus
|
325
|
-
return bitcoinconsensus_verify_script(in_idx,
|
311
|
+
return bitcoinconsensus_verify_script(in_idx, outpoint_data, block_timestamp, opts)
|
326
312
|
end
|
327
313
|
|
328
314
|
outpoint_idx = @in[in_idx].prev_out_index
|
329
315
|
script_sig = ''
|
330
316
|
|
331
|
-
|
332
|
-
script_pubkey =
|
333
|
-
Bitcoin::Script.new(outpoint_tx_or_script.out[outpoint_idx].pk_script)
|
334
|
-
else
|
335
|
-
# Otherwise, it's already a script.
|
336
|
-
Bitcoin::Script.new(outpoint_tx_or_script)
|
337
|
-
end
|
317
|
+
script_pubkey = script_pubkey_from_outpoint_data(outpoint_data, outpoint_idx)
|
318
|
+
script_pubkey = Bitcoin::Script.new(script_pubkey)
|
338
319
|
|
339
320
|
if script_pubkey.is_p2sh?
|
340
321
|
redeem_script = Bitcoin::Script.new(@in[in_idx].script_sig).get_pubkey
|
@@ -372,17 +353,11 @@ module Bitcoin
|
|
372
353
|
return sig_valid
|
373
354
|
end
|
374
355
|
|
375
|
-
def bitcoinconsensus_verify_script(in_idx,
|
356
|
+
def bitcoinconsensus_verify_script(in_idx, outpoint_data, block_timestamp=Time.now.to_i, opts={})
|
376
357
|
raise "Bitcoin::BitcoinConsensus shared library not found" unless Bitcoin::BitcoinConsensus.lib_available?
|
377
358
|
|
378
|
-
|
379
|
-
script_pubkey =
|
380
|
-
outpoint_idx = @in[in_idx].prev_out_index
|
381
|
-
outpoint_tx_or_script.out[outpoint_idx].pk_script
|
382
|
-
else
|
383
|
-
# Otherwise, it's already a script.
|
384
|
-
outpoint_tx_or_script
|
385
|
-
end
|
359
|
+
outpoint_idx = @in[in_idx].prev_out_index
|
360
|
+
script_pubkey = script_pubkey_from_outpoint_data(outpoint_data, outpoint_idx)
|
386
361
|
|
387
362
|
flags = Bitcoin::BitcoinConsensus::SCRIPT_VERIFY_NONE
|
388
363
|
flags |= Bitcoin::BitcoinConsensus::SCRIPT_VERIFY_P2SH if block_timestamp >= 1333238400
|
@@ -583,6 +558,30 @@ module Bitcoin
|
|
583
558
|
|
584
559
|
Digest::SHA256.digest( Digest::SHA256.digest( buf ) )
|
585
560
|
end
|
561
|
+
|
562
|
+
def script_pubkey_from_outpoint_data(outpoint_data, outpoint_idx)
|
563
|
+
if outpoint_data.respond_to?(:out)
|
564
|
+
# If given an entire previous transaction, take the script from it
|
565
|
+
outpoint_data.out[outpoint_idx].pk_script
|
566
|
+
elsif outpoint_data.respond_to?(:pk_script)
|
567
|
+
# If given an transaction output, take the script
|
568
|
+
outpoint_data.pk_script
|
569
|
+
else
|
570
|
+
# Otherwise, we assume it's already a script.
|
571
|
+
outpoint_data
|
572
|
+
end
|
573
|
+
end
|
574
|
+
|
575
|
+
def amount_from_outpoint_data(outpoint_data, outpoint_idx)
|
576
|
+
if outpoint_data.respond_to?(:out)
|
577
|
+
# If given an entire previous transaction, take the amount from the
|
578
|
+
# output at the outpoint_idx
|
579
|
+
outpoint_data.out[outpoint_idx].amount
|
580
|
+
elsif outpoint_data.respond_to?(:pk_script)
|
581
|
+
# If given an transaction output, take the amount
|
582
|
+
outpoint_data.amount
|
583
|
+
end
|
584
|
+
end
|
586
585
|
end
|
587
586
|
end
|
588
587
|
end
|
data/lib/bitcoin/script.rb
CHANGED
@@ -1435,8 +1435,10 @@ class Bitcoin::Script
|
|
1435
1435
|
def sighash_subscript(drop_sigs, opts = {})
|
1436
1436
|
if opts[:fork_id]
|
1437
1437
|
drop_sigs.reject! do |signature|
|
1438
|
-
|
1439
|
-
|
1438
|
+
if signature && signature.size > 0
|
1439
|
+
_, hash_type = parse_sig(signature)
|
1440
|
+
(hash_type&SIGHASH_TYPE[:forkid]) != 0
|
1441
|
+
end
|
1440
1442
|
end
|
1441
1443
|
end
|
1442
1444
|
|
data/lib/bitcoin/version.rb
CHANGED
@@ -316,6 +316,9 @@ describe 'Tx' do
|
|
316
316
|
|
317
317
|
tx.verify_input_signature(0, outpoint_tx).should == true
|
318
318
|
|
319
|
+
# Only one test where we provide the TxOut is needed since when providing
|
320
|
+
# the full outpoint_tx the verification logic doesn't change.
|
321
|
+
tx.verify_input_signature(0, outpoint_tx.out[0]).should == true
|
319
322
|
|
320
323
|
tx = Tx.from_json( fixtures_file('rawtx-c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73.json') )
|
321
324
|
tx.hash.should == 'c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitcoin-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- lian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: This is a ruby library for interacting with the bitcoin protocol/network
|
14
14
|
email:
|