tapyrus 0.2.7 → 0.2.12
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 +37 -0
- data/.prettierignore +3 -0
- data/.prettierrc.yaml +3 -0
- data/.ruby-version +1 -1
- data/CODE_OF_CONDUCT.md +7 -7
- data/README.md +14 -17
- data/Rakefile +3 -3
- data/lib/openassets/marker_output.rb +0 -4
- data/lib/openassets/payload.rb +4 -10
- data/lib/openassets.rb +0 -2
- data/lib/schnorr/sign_to_contract.rb +51 -0
- data/lib/schnorr/signature.rb +3 -6
- data/lib/schnorr.rb +14 -9
- data/lib/tapyrus/base58.rb +7 -6
- data/lib/tapyrus/bip175.rb +78 -0
- data/lib/tapyrus/block.rb +1 -2
- data/lib/tapyrus/block_header.rb +15 -9
- data/lib/tapyrus/bloom_filter.rb +5 -3
- data/lib/tapyrus/chain_params.rb +1 -4
- data/lib/tapyrus/chainparams/dev.yml +3 -2
- data/lib/tapyrus/chainparams/prod.yml +3 -2
- data/lib/tapyrus/constants.rb +29 -23
- data/lib/tapyrus/errors.rb +1 -3
- data/lib/tapyrus/ext/ecdsa.rb +4 -4
- data/lib/tapyrus/ext/json_parser.rb +1 -4
- data/lib/tapyrus/ext.rb +1 -1
- data/lib/tapyrus/ext_key.rb +44 -32
- data/lib/tapyrus/key.rb +31 -35
- data/lib/tapyrus/key_path.rb +15 -12
- data/lib/tapyrus/logger.rb +20 -16
- data/lib/tapyrus/merkle_tree.rb +22 -20
- data/lib/tapyrus/message/addr.rb +1 -7
- data/lib/tapyrus/message/base.rb +0 -3
- data/lib/tapyrus/message/block.rb +2 -9
- data/lib/tapyrus/message/block_transaction_request.rb +3 -6
- data/lib/tapyrus/message/block_transactions.rb +2 -6
- data/lib/tapyrus/message/block_txn.rb +0 -4
- data/lib/tapyrus/message/cmpct_block.rb +1 -7
- data/lib/tapyrus/message/error.rb +1 -4
- data/lib/tapyrus/message/fee_filter.rb +1 -4
- data/lib/tapyrus/message/filter_add.rb +0 -4
- data/lib/tapyrus/message/filter_clear.rb +0 -4
- data/lib/tapyrus/message/filter_load.rb +2 -5
- data/lib/tapyrus/message/get_addr.rb +0 -4
- data/lib/tapyrus/message/get_block_txn.rb +0 -4
- data/lib/tapyrus/message/get_blocks.rb +0 -3
- data/lib/tapyrus/message/get_data.rb +1 -4
- data/lib/tapyrus/message/get_headers.rb +1 -3
- data/lib/tapyrus/message/header_and_short_ids.rb +3 -9
- data/lib/tapyrus/message/headers.rb +0 -4
- data/lib/tapyrus/message/headers_parser.rb +3 -8
- data/lib/tapyrus/message/inv.rb +1 -4
- data/lib/tapyrus/message/inventories_parser.rb +2 -7
- data/lib/tapyrus/message/inventory.rb +12 -5
- data/lib/tapyrus/message/mem_pool.rb +0 -4
- data/lib/tapyrus/message/merkle_block.rb +4 -9
- data/lib/tapyrus/message/network_addr.rb +7 -6
- data/lib/tapyrus/message/not_found.rb +0 -3
- data/lib/tapyrus/message/ping.rb +0 -3
- data/lib/tapyrus/message/pong.rb +0 -3
- data/lib/tapyrus/message/prefilled_tx.rb +0 -4
- data/lib/tapyrus/message/reject.rb +0 -3
- data/lib/tapyrus/message/send_cmpct.rb +1 -3
- data/lib/tapyrus/message/send_headers.rb +0 -3
- data/lib/tapyrus/message/tx.rb +0 -4
- data/lib/tapyrus/message/ver_ack.rb +1 -5
- data/lib/tapyrus/message/version.rb +2 -5
- data/lib/tapyrus/message.rb +14 -16
- data/lib/tapyrus/mnemonic.rb +17 -15
- data/lib/tapyrus/network/connection.rb +0 -3
- data/lib/tapyrus/network/message_handler.rb +61 -60
- data/lib/tapyrus/network/peer.rb +13 -12
- data/lib/tapyrus/network/peer_discovery.rb +10 -9
- data/lib/tapyrus/network/pool.rb +12 -12
- data/lib/tapyrus/network.rb +0 -2
- data/lib/tapyrus/node/cli.rb +12 -14
- data/lib/tapyrus/node/configuration.rb +1 -3
- data/lib/tapyrus/node/spv.rb +2 -3
- data/lib/tapyrus/node.rb +1 -1
- data/lib/tapyrus/opcodes.rb +9 -7
- data/lib/tapyrus/out_point.rb +5 -5
- data/lib/tapyrus/rpc/http_server.rb +21 -22
- data/lib/tapyrus/rpc/request_handler.rb +16 -21
- data/lib/tapyrus/rpc/tapyrus_core_client.rb +67 -25
- data/lib/tapyrus/rpc.rb +1 -0
- data/lib/tapyrus/script/color.rb +10 -0
- data/lib/tapyrus/script/multisig.rb +13 -12
- data/lib/tapyrus/script/script.rb +93 -88
- data/lib/tapyrus/script/script_error.rb +1 -4
- data/lib/tapyrus/script/script_interpreter.rb +439 -399
- data/lib/tapyrus/script/tx_checker.rb +20 -10
- data/lib/tapyrus/secp256k1/native.rb +14 -15
- data/lib/tapyrus/secp256k1/rfc6979.rb +7 -4
- data/lib/tapyrus/secp256k1/ruby.rb +10 -12
- data/lib/tapyrus/secp256k1.rb +0 -4
- data/lib/tapyrus/slip39/share.rb +41 -29
- data/lib/tapyrus/slip39/sss.rb +92 -49
- data/lib/tapyrus/slip39.rb +20 -5
- data/lib/tapyrus/store/chain_entry.rb +0 -4
- data/lib/tapyrus/store/db/level_db.rb +5 -9
- data/lib/tapyrus/store/db.rb +0 -2
- data/lib/tapyrus/store/spv_chain.rb +11 -17
- data/lib/tapyrus/store.rb +1 -3
- data/lib/tapyrus/tx.rb +45 -37
- data/lib/tapyrus/tx_builder.rb +160 -0
- data/lib/tapyrus/tx_in.rb +1 -6
- data/lib/tapyrus/tx_out.rb +2 -7
- data/lib/tapyrus/util.rb +7 -9
- data/lib/tapyrus/validation.rb +12 -11
- data/lib/tapyrus/version.rb +1 -1
- data/lib/tapyrus/wallet/account.rb +22 -18
- data/lib/tapyrus/wallet/base.rb +12 -9
- data/lib/tapyrus/wallet/db.rb +6 -9
- data/lib/tapyrus/wallet/master_key.rb +2 -4
- data/lib/tapyrus.rb +7 -22
- data/tapyrusrb.gemspec +13 -14
- metadata +26 -7
- data/.travis.yml +0 -14
data/lib/tapyrus/rpc.rb
CHANGED
data/lib/tapyrus/script/color.rb
CHANGED
|
@@ -24,6 +24,11 @@ module Tapyrus
|
|
|
24
24
|
new(TokenTypes::NFT, Tapyrus.sha256(out_point.to_payload))
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
+
# Return ColorIdentifier for native token(i.e TPC)
|
|
28
|
+
def self.default
|
|
29
|
+
new(TokenTypes::NONE, '0000000000000000000000000000000000000000000000000000000000000000'.htb)
|
|
30
|
+
end
|
|
31
|
+
|
|
27
32
|
def to_payload
|
|
28
33
|
[type, payload].pack('Ca*')
|
|
29
34
|
end
|
|
@@ -51,6 +56,11 @@ module Tapyrus
|
|
|
51
56
|
to_payload.eql?(other.to_payload)
|
|
52
57
|
end
|
|
53
58
|
|
|
59
|
+
# Return true if the coin is native token(i.e TPC), otherwise false
|
|
60
|
+
def default?
|
|
61
|
+
self == ColorIdentifier.default
|
|
62
|
+
end
|
|
63
|
+
|
|
54
64
|
private
|
|
55
65
|
|
|
56
66
|
def initialize(type, payload)
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
module Tapyrus
|
|
2
|
-
|
|
3
2
|
# utility for multisig
|
|
4
3
|
module Multisig
|
|
5
4
|
include Tapyrus::Opcodes
|
|
6
5
|
|
|
7
6
|
def self.prefix
|
|
8
|
-
[OP_0].pack(
|
|
7
|
+
[OP_0].pack('C*')
|
|
9
8
|
end
|
|
10
9
|
|
|
11
10
|
# generate input script sig spending a multisig output script.
|
|
@@ -23,7 +22,7 @@ module Tapyrus
|
|
|
23
22
|
# multiple parties. Signatures must be in the same order as the
|
|
24
23
|
# pubkeys in the output script being redeemed.
|
|
25
24
|
def self.add_sig_to_multisig_script_sig(sig_to_add, script_sig, hash_type = SIGHASH_TYPE[:all])
|
|
26
|
-
signature = sig_to_add + [hash_type].pack(
|
|
25
|
+
signature = sig_to_add + [hash_type].pack('C*')
|
|
27
26
|
offset = script_sig.empty? ? 0 : 1
|
|
28
27
|
script_sig.insert(offset, Tapyrus::Script.pack_pushdata(signature))
|
|
29
28
|
end
|
|
@@ -49,17 +48,19 @@ module Tapyrus
|
|
|
49
48
|
pubkeys = redeem_script.get_multisig_pubkeys
|
|
50
49
|
|
|
51
50
|
# find the pubkey for each signature by trying to verify it
|
|
52
|
-
sigs =
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
51
|
+
sigs =
|
|
52
|
+
Hash[
|
|
53
|
+
script.chunks[1...-1].map.with_index do |sig, idx|
|
|
54
|
+
sig = sig.pushed_data
|
|
55
|
+
pubkey =
|
|
56
|
+
pubkeys.map { |key| Tapyrus::Key.new(pubkey: key.bth).verify(sig, sig_hash) ? key : nil }.compact.first
|
|
57
|
+
raise "Key for signature ##{idx} not found in redeem script!" unless pubkey
|
|
58
|
+
[pubkey, sig]
|
|
59
|
+
end
|
|
60
|
+
]
|
|
60
61
|
|
|
61
62
|
prefix + pubkeys.map { |k| sigs[k] ? Tapyrus::Script.pack_pushdata(sigs[k]) : nil }.join +
|
|
62
63
|
Tapyrus::Script.pack_pushdata(script.chunks[-1].pushed_data)
|
|
63
64
|
end
|
|
64
65
|
end
|
|
65
|
-
end
|
|
66
|
+
end
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
# https://github.com/lian/bitcoin-ruby/blob/master/COPYING
|
|
3
3
|
|
|
4
4
|
module Tapyrus
|
|
5
|
-
|
|
6
5
|
# tapyrus script
|
|
7
6
|
class Script
|
|
8
7
|
include Tapyrus::HexConverter
|
|
@@ -82,14 +81,12 @@ module Tapyrus
|
|
|
82
81
|
def remove_color
|
|
83
82
|
raise RuntimeError, 'Only cp2pkh and cp2sh can remove color' unless cp2pkh? or cp2sh?
|
|
84
83
|
|
|
85
|
-
Tapyrus::Script.new.tap
|
|
86
|
-
s.chunks = self.chunks[2..-1]
|
|
87
|
-
end
|
|
84
|
+
Tapyrus::Script.new.tap { |s| s.chunks = self.chunks[2..-1] }
|
|
88
85
|
end
|
|
89
86
|
|
|
90
87
|
def get_multisig_pubkeys
|
|
91
88
|
num = Tapyrus::Opcodes.opcode_to_small_int(chunks[-2].bth.to_i(16))
|
|
92
|
-
(1..num).map{ |i| chunks[i].pushed_data }
|
|
89
|
+
(1..num).map { |i| chunks[i].pushed_data }
|
|
93
90
|
end
|
|
94
91
|
|
|
95
92
|
# generate m of n multisig script
|
|
@@ -104,14 +101,16 @@ module Tapyrus
|
|
|
104
101
|
# generate script from string.
|
|
105
102
|
def self.from_string(string)
|
|
106
103
|
script = new
|
|
107
|
-
string
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
104
|
+
string
|
|
105
|
+
.split(' ')
|
|
106
|
+
.each do |v|
|
|
107
|
+
opcode = Opcodes.name_to_opcode(v)
|
|
108
|
+
if opcode
|
|
109
|
+
script << (v =~ /^\d/ && Opcodes.small_int_to_opcode(v.ord) ? v.ord : opcode)
|
|
110
|
+
else
|
|
111
|
+
script << (v =~ /^[0-9]+$/ ? v.to_i : v)
|
|
112
|
+
end
|
|
113
113
|
end
|
|
114
|
-
end
|
|
115
114
|
script
|
|
116
115
|
end
|
|
117
116
|
|
|
@@ -150,19 +149,20 @@ module Tapyrus
|
|
|
150
149
|
if opcode.pushdata?
|
|
151
150
|
pushcode = opcode.ord
|
|
152
151
|
packed_size = nil
|
|
153
|
-
len =
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
152
|
+
len =
|
|
153
|
+
case pushcode
|
|
154
|
+
when OP_PUSHDATA1
|
|
155
|
+
packed_size = buf.read(1)
|
|
156
|
+
packed_size.unpack('C').first
|
|
157
|
+
when OP_PUSHDATA2
|
|
158
|
+
packed_size = buf.read(2)
|
|
159
|
+
packed_size.unpack('v').first
|
|
160
|
+
when OP_PUSHDATA4
|
|
161
|
+
packed_size = buf.read(4)
|
|
162
|
+
packed_size.unpack('V').first
|
|
163
|
+
else
|
|
164
|
+
pushcode if pushcode < OP_PUSHDATA1
|
|
165
|
+
end
|
|
166
166
|
if len
|
|
167
167
|
s.chunks << [len].pack('C') if buf.eof?
|
|
168
168
|
unless buf.eof?
|
|
@@ -194,7 +194,7 @@ module Tapyrus
|
|
|
194
194
|
return [p2sh_addr] if p2sh?
|
|
195
195
|
return [cp2pkh_addr] if cp2pkh?
|
|
196
196
|
return [cp2sh_addr] if cp2sh?
|
|
197
|
-
return get_multisig_pubkeys.map{|pubkey| Tapyrus::Key.new(pubkey: pubkey.bth).to_p2pkh} if multisig?
|
|
197
|
+
return get_multisig_pubkeys.map { |pubkey| Tapyrus::Key.new(pubkey: pubkey.bth).to_p2pkh } if multisig?
|
|
198
198
|
[]
|
|
199
199
|
end
|
|
200
200
|
|
|
@@ -206,8 +206,8 @@ module Tapyrus
|
|
|
206
206
|
# whether this script is a P2PKH format script.
|
|
207
207
|
def p2pkh?
|
|
208
208
|
return false unless chunks.size == 5
|
|
209
|
-
[OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG] ==
|
|
210
|
-
|
|
209
|
+
[OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG] == (chunks[0..1] + chunks[3..4]).map(&:ord) &&
|
|
210
|
+
chunks[2].bytesize == 21
|
|
211
211
|
end
|
|
212
212
|
|
|
213
213
|
def p2sh?
|
|
@@ -228,8 +228,7 @@ module Tapyrus
|
|
|
228
228
|
end
|
|
229
229
|
|
|
230
230
|
def standard_op_return?
|
|
231
|
-
op_return? && size <= MAX_OP_RETURN_RELAY &&
|
|
232
|
-
(chunks.size == 1 || chunks[1].opcode <= OP_16)
|
|
231
|
+
op_return? && size <= MAX_OP_RETURN_RELAY && (chunks.size == 1 || chunks[1].opcode <= OP_16)
|
|
233
232
|
end
|
|
234
233
|
|
|
235
234
|
# Return whether this script is a CP2PKH format script or not.
|
|
@@ -239,8 +238,8 @@ module Tapyrus
|
|
|
239
238
|
return false unless chunks[0].bytesize == 34
|
|
240
239
|
return false unless Tapyrus::Color::ColorIdentifier.parse_from_payload(chunks[0].pushed_data)&.valid?
|
|
241
240
|
return false unless chunks[1].ord == OP_COLOR
|
|
242
|
-
[OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG] ==
|
|
243
|
-
|
|
241
|
+
[OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG] == (chunks[2..3] + chunks[5..6]).map(&:ord) &&
|
|
242
|
+
chunks[4].bytesize == 21
|
|
244
243
|
end
|
|
245
244
|
|
|
246
245
|
# Return whether this script is a CP2SH format script or not.
|
|
@@ -252,7 +251,7 @@ module Tapyrus
|
|
|
252
251
|
return false unless chunks[1].ord == OP_COLOR
|
|
253
252
|
OP_HASH160 == chunks[2].ord && OP_EQUAL == chunks[4].ord && chunks[3].bytesize == 21
|
|
254
253
|
end
|
|
255
|
-
|
|
254
|
+
|
|
256
255
|
# Return whether this script represents colored coin.
|
|
257
256
|
# @return [Boolean] true if this script is colored, otherwise false.
|
|
258
257
|
def colored?
|
|
@@ -275,24 +274,25 @@ module Tapyrus
|
|
|
275
274
|
|
|
276
275
|
# whether data push only script which dose not include other opcode
|
|
277
276
|
def push_only?
|
|
278
|
-
chunks.each
|
|
279
|
-
return false if !c.opcode.nil? && c.opcode > OP_16
|
|
280
|
-
end
|
|
277
|
+
chunks.each { |c| return false if !c.opcode.nil? && c.opcode > OP_16 }
|
|
281
278
|
true
|
|
282
279
|
end
|
|
283
280
|
|
|
284
281
|
# get public keys in the stack.
|
|
285
282
|
# @return[Array[String]] an array of the pubkeys with hex format.
|
|
286
283
|
def get_pubkeys
|
|
287
|
-
chunks
|
|
284
|
+
chunks
|
|
285
|
+
.select do |c|
|
|
286
|
+
c.pushdata? && [33, 65].include?(c.pushed_data.bytesize) &&
|
|
287
|
+
[2, 3, 4, 6, 7].include?(c.pushed_data[0].bth.to_i(16))
|
|
288
|
+
end
|
|
289
|
+
.map { |c| c.pushed_data.bth }
|
|
288
290
|
end
|
|
289
291
|
|
|
290
292
|
# returns the self payload. ScriptInterpreter does not use this.
|
|
291
293
|
def to_script_code(skip_separator_index = 0)
|
|
292
294
|
payload = to_payload
|
|
293
|
-
if skip_separator_index > 0
|
|
294
|
-
payload = subscript_codeseparator(skip_separator_index)
|
|
295
|
-
end
|
|
295
|
+
payload = subscript_codeseparator(skip_separator_index) if skip_separator_index > 0
|
|
296
296
|
Tapyrus.pack_var_string(payload)
|
|
297
297
|
end
|
|
298
298
|
|
|
@@ -303,7 +303,7 @@ module Tapyrus
|
|
|
303
303
|
elsif obj.is_a?(String)
|
|
304
304
|
append_data(obj)
|
|
305
305
|
elsif obj.is_a?(Array)
|
|
306
|
-
obj.each { |o| self.<< o}
|
|
306
|
+
obj.each { |o| self.<< o }
|
|
307
307
|
self
|
|
308
308
|
end
|
|
309
309
|
end
|
|
@@ -339,41 +339,44 @@ module Tapyrus
|
|
|
339
339
|
|
|
340
340
|
# Check the item is in the chunk of the script.
|
|
341
341
|
def include?(item)
|
|
342
|
-
chunk_item =
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
342
|
+
chunk_item =
|
|
343
|
+
if item.is_a?(Integer)
|
|
344
|
+
item.chr
|
|
345
|
+
elsif item.is_a?(String)
|
|
346
|
+
data = Encoding::ASCII_8BIT == item.encoding ? item : item.htb
|
|
347
|
+
Tapyrus::Script.pack_pushdata(data)
|
|
348
|
+
end
|
|
348
349
|
return false unless chunk_item
|
|
349
350
|
chunks.include?(chunk_item)
|
|
350
351
|
end
|
|
351
352
|
|
|
352
353
|
def to_s
|
|
353
|
-
chunks
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
v
|
|
363
|
-
|
|
364
|
-
data = c.pushed_data
|
|
365
|
-
if data.bytesize <= 4
|
|
366
|
-
Script.decode_number(data.bth) # for scriptnum
|
|
354
|
+
chunks
|
|
355
|
+
.map do |c|
|
|
356
|
+
case c
|
|
357
|
+
when Integer
|
|
358
|
+
opcode_to_name(c)
|
|
359
|
+
when String
|
|
360
|
+
return c if c.empty?
|
|
361
|
+
if c.pushdata?
|
|
362
|
+
v = Opcodes.opcode_to_small_int(c.ord)
|
|
363
|
+
if v
|
|
364
|
+
v
|
|
367
365
|
else
|
|
368
|
-
data.
|
|
366
|
+
data = c.pushed_data
|
|
367
|
+
if data.bytesize <= 4
|
|
368
|
+
Script.decode_number(data.bth) # for scriptnum
|
|
369
|
+
else
|
|
370
|
+
data.bth
|
|
371
|
+
end
|
|
369
372
|
end
|
|
373
|
+
else
|
|
374
|
+
opcode = Opcodes.opcode_to_name(c.ord)
|
|
375
|
+
opcode ? opcode : 'OP_UNKNOWN [error]'
|
|
370
376
|
end
|
|
371
|
-
else
|
|
372
|
-
opcode = Opcodes.opcode_to_name(c.ord)
|
|
373
|
-
opcode ? opcode : 'OP_UNKNOWN [error]'
|
|
374
377
|
end
|
|
375
378
|
end
|
|
376
|
-
|
|
379
|
+
.join(' ')
|
|
377
380
|
end
|
|
378
381
|
|
|
379
382
|
# generate sha-256 hash for payload
|
|
@@ -431,17 +434,18 @@ module Tapyrus
|
|
|
431
434
|
# binary +data+ convert pushdata which contains data length and append PUSHDATA opcode if necessary.
|
|
432
435
|
def self.pack_pushdata(data)
|
|
433
436
|
size = data.bytesize
|
|
434
|
-
header =
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
437
|
+
header =
|
|
438
|
+
if size < OP_PUSHDATA1
|
|
439
|
+
[size].pack('C')
|
|
440
|
+
elsif size < 0xff
|
|
441
|
+
[OP_PUSHDATA1, size].pack('CC')
|
|
442
|
+
elsif size < 0xffff
|
|
443
|
+
[OP_PUSHDATA2, size].pack('Cv')
|
|
444
|
+
elsif size < 0xffffffff
|
|
445
|
+
[OP_PUSHDATA4, size].pack('CV')
|
|
446
|
+
else
|
|
447
|
+
raise ArgumentError, 'data size is too big.'
|
|
448
|
+
end
|
|
445
449
|
header + data
|
|
446
450
|
end
|
|
447
451
|
|
|
@@ -465,8 +469,12 @@ module Tapyrus
|
|
|
465
469
|
if chunk == sub_chunk
|
|
466
470
|
buf << chunk
|
|
467
471
|
i += 1
|
|
468
|
-
(
|
|
469
|
-
|
|
472
|
+
(
|
|
473
|
+
i = 0
|
|
474
|
+
buf.clear
|
|
475
|
+
) if i == subscript.chunks.size # matched the whole subscript
|
|
476
|
+
else
|
|
477
|
+
# matched the part of head
|
|
470
478
|
i = 0
|
|
471
479
|
tmp = chunk.dup
|
|
472
480
|
tmp.slice!(sub_chunk)
|
|
@@ -488,7 +496,7 @@ module Tapyrus
|
|
|
488
496
|
|
|
489
497
|
# remove all occurences of opcode. Typically it's OP_CODESEPARATOR.
|
|
490
498
|
def delete_opcode(opcode)
|
|
491
|
-
@chunks = chunks.select{|chunk| chunk.ord != opcode}
|
|
499
|
+
@chunks = chunks.select { |chunk| chunk.ord != opcode }
|
|
492
500
|
self
|
|
493
501
|
end
|
|
494
502
|
|
|
@@ -496,12 +504,10 @@ module Tapyrus
|
|
|
496
504
|
def subscript_codeseparator(separator_index)
|
|
497
505
|
buf = []
|
|
498
506
|
process_separator_index = 0
|
|
499
|
-
chunks.each
|
|
507
|
+
chunks.each do |chunk|
|
|
500
508
|
buf << chunk if process_separator_index == separator_index
|
|
501
|
-
if chunk.ord == OP_CODESEPARATOR && process_separator_index < separator_index
|
|
502
|
-
|
|
503
|
-
end
|
|
504
|
-
}
|
|
509
|
+
process_separator_index += 1 if chunk.ord == OP_CODESEPARATOR && process_separator_index < separator_index
|
|
510
|
+
end
|
|
505
511
|
buf.join
|
|
506
512
|
end
|
|
507
513
|
|
|
@@ -518,10 +524,10 @@ module Tapyrus
|
|
|
518
524
|
end
|
|
519
525
|
|
|
520
526
|
def to_h
|
|
521
|
-
h = {asm: to_s, hex: to_hex, type: type}
|
|
527
|
+
h = { asm: to_s, hex: to_hex, type: type }
|
|
522
528
|
addrs = addresses
|
|
523
529
|
unless addrs.empty?
|
|
524
|
-
h[:req_sigs] = multisig? ? Tapyrus::Opcodes.opcode_to_small_int(chunks[0].bth.to_i(16)) :addrs.size
|
|
530
|
+
h[:req_sigs] = multisig? ? Tapyrus::Opcodes.opcode_to_small_int(chunks[0].bth.to_i(16)) : addrs.size
|
|
525
531
|
h[:addresses] = addrs
|
|
526
532
|
end
|
|
527
533
|
h
|
|
@@ -568,5 +574,4 @@ module Tapyrus
|
|
|
568
574
|
Tapyrus.encode_base58_address(color_id + hash160, Tapyrus.chain_params.cp2sh_version)
|
|
569
575
|
end
|
|
570
576
|
end
|
|
571
|
-
|
|
572
577
|
end
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
module Tapyrus
|
|
2
|
-
|
|
3
2
|
# tapyrus script error
|
|
4
3
|
class ScriptError < Exception
|
|
5
|
-
|
|
6
4
|
attr_accessor :code
|
|
7
5
|
attr_accessor :extra_msg
|
|
8
6
|
|
|
@@ -100,6 +98,5 @@ module Tapyrus
|
|
|
100
98
|
def self.name_to_code(name)
|
|
101
99
|
NAME_MAP[name]
|
|
102
100
|
end
|
|
103
|
-
|
|
104
101
|
end
|
|
105
|
-
end
|
|
102
|
+
end
|