tapyrus 0.2.7 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +37 -0
  3. data/.prettierignore +3 -0
  4. data/.prettierrc.yaml +3 -0
  5. data/CODE_OF_CONDUCT.md +7 -7
  6. data/README.md +14 -17
  7. data/Rakefile +3 -3
  8. data/lib/openassets.rb +0 -2
  9. data/lib/openassets/marker_output.rb +0 -4
  10. data/lib/openassets/payload.rb +4 -10
  11. data/lib/schnorr.rb +2 -3
  12. data/lib/schnorr/signature.rb +3 -6
  13. data/lib/tapyrus.rb +6 -22
  14. data/lib/tapyrus/base58.rb +7 -6
  15. data/lib/tapyrus/block.rb +1 -2
  16. data/lib/tapyrus/block_header.rb +15 -9
  17. data/lib/tapyrus/bloom_filter.rb +5 -3
  18. data/lib/tapyrus/chain_params.rb +1 -4
  19. data/lib/tapyrus/chainparams/dev.yml +3 -2
  20. data/lib/tapyrus/chainparams/prod.yml +3 -2
  21. data/lib/tapyrus/constants.rb +29 -23
  22. data/lib/tapyrus/errors.rb +1 -3
  23. data/lib/tapyrus/ext.rb +1 -1
  24. data/lib/tapyrus/ext/ecdsa.rb +4 -4
  25. data/lib/tapyrus/ext/json_parser.rb +1 -4
  26. data/lib/tapyrus/ext_key.rb +38 -34
  27. data/lib/tapyrus/key.rb +31 -35
  28. data/lib/tapyrus/key_path.rb +15 -12
  29. data/lib/tapyrus/logger.rb +20 -16
  30. data/lib/tapyrus/merkle_tree.rb +19 -20
  31. data/lib/tapyrus/message.rb +14 -16
  32. data/lib/tapyrus/message/addr.rb +1 -7
  33. data/lib/tapyrus/message/base.rb +0 -3
  34. data/lib/tapyrus/message/block.rb +2 -9
  35. data/lib/tapyrus/message/block_transaction_request.rb +3 -6
  36. data/lib/tapyrus/message/block_transactions.rb +2 -6
  37. data/lib/tapyrus/message/block_txn.rb +0 -4
  38. data/lib/tapyrus/message/cmpct_block.rb +1 -7
  39. data/lib/tapyrus/message/error.rb +1 -4
  40. data/lib/tapyrus/message/fee_filter.rb +1 -4
  41. data/lib/tapyrus/message/filter_add.rb +0 -4
  42. data/lib/tapyrus/message/filter_clear.rb +0 -4
  43. data/lib/tapyrus/message/filter_load.rb +2 -5
  44. data/lib/tapyrus/message/get_addr.rb +0 -4
  45. data/lib/tapyrus/message/get_block_txn.rb +0 -4
  46. data/lib/tapyrus/message/get_blocks.rb +0 -3
  47. data/lib/tapyrus/message/get_data.rb +1 -4
  48. data/lib/tapyrus/message/get_headers.rb +1 -3
  49. data/lib/tapyrus/message/header_and_short_ids.rb +3 -9
  50. data/lib/tapyrus/message/headers.rb +0 -4
  51. data/lib/tapyrus/message/headers_parser.rb +3 -8
  52. data/lib/tapyrus/message/inv.rb +1 -4
  53. data/lib/tapyrus/message/inventories_parser.rb +2 -7
  54. data/lib/tapyrus/message/inventory.rb +12 -5
  55. data/lib/tapyrus/message/mem_pool.rb +0 -4
  56. data/lib/tapyrus/message/merkle_block.rb +4 -9
  57. data/lib/tapyrus/message/network_addr.rb +7 -6
  58. data/lib/tapyrus/message/not_found.rb +0 -3
  59. data/lib/tapyrus/message/ping.rb +0 -3
  60. data/lib/tapyrus/message/pong.rb +0 -3
  61. data/lib/tapyrus/message/prefilled_tx.rb +0 -4
  62. data/lib/tapyrus/message/reject.rb +0 -3
  63. data/lib/tapyrus/message/send_cmpct.rb +1 -3
  64. data/lib/tapyrus/message/send_headers.rb +0 -3
  65. data/lib/tapyrus/message/tx.rb +0 -4
  66. data/lib/tapyrus/message/ver_ack.rb +1 -5
  67. data/lib/tapyrus/message/version.rb +2 -5
  68. data/lib/tapyrus/mnemonic.rb +17 -15
  69. data/lib/tapyrus/network.rb +0 -2
  70. data/lib/tapyrus/network/connection.rb +0 -3
  71. data/lib/tapyrus/network/message_handler.rb +61 -60
  72. data/lib/tapyrus/network/peer.rb +13 -12
  73. data/lib/tapyrus/network/peer_discovery.rb +3 -5
  74. data/lib/tapyrus/network/pool.rb +12 -12
  75. data/lib/tapyrus/node.rb +1 -1
  76. data/lib/tapyrus/node/cli.rb +12 -14
  77. data/lib/tapyrus/node/configuration.rb +1 -3
  78. data/lib/tapyrus/node/spv.rb +2 -3
  79. data/lib/tapyrus/opcodes.rb +9 -7
  80. data/lib/tapyrus/out_point.rb +5 -5
  81. data/lib/tapyrus/rpc/http_server.rb +21 -22
  82. data/lib/tapyrus/rpc/request_handler.rb +42 -44
  83. data/lib/tapyrus/rpc/tapyrus_core_client.rb +53 -25
  84. data/lib/tapyrus/script/color.rb +10 -0
  85. data/lib/tapyrus/script/multisig.rb +13 -12
  86. data/lib/tapyrus/script/script.rb +72 -71
  87. data/lib/tapyrus/script/script_error.rb +1 -4
  88. data/lib/tapyrus/script/script_interpreter.rb +439 -399
  89. data/lib/tapyrus/script/tx_checker.rb +20 -10
  90. data/lib/tapyrus/secp256k1.rb +0 -4
  91. data/lib/tapyrus/secp256k1/native.rb +14 -15
  92. data/lib/tapyrus/secp256k1/rfc6979.rb +7 -4
  93. data/lib/tapyrus/secp256k1/ruby.rb +10 -12
  94. data/lib/tapyrus/slip39.rb +20 -5
  95. data/lib/tapyrus/slip39/share.rb +41 -29
  96. data/lib/tapyrus/slip39/sss.rb +101 -57
  97. data/lib/tapyrus/store.rb +1 -3
  98. data/lib/tapyrus/store/chain_entry.rb +0 -4
  99. data/lib/tapyrus/store/db.rb +0 -2
  100. data/lib/tapyrus/store/db/level_db.rb +5 -9
  101. data/lib/tapyrus/store/spv_chain.rb +11 -17
  102. data/lib/tapyrus/tx.rb +45 -37
  103. data/lib/tapyrus/tx_builder.rb +158 -0
  104. data/lib/tapyrus/tx_in.rb +1 -6
  105. data/lib/tapyrus/tx_out.rb +2 -7
  106. data/lib/tapyrus/util.rb +7 -9
  107. data/lib/tapyrus/validation.rb +12 -11
  108. data/lib/tapyrus/version.rb +1 -1
  109. data/lib/tapyrus/wallet/account.rb +22 -18
  110. data/lib/tapyrus/wallet/base.rb +12 -9
  111. data/lib/tapyrus/wallet/db.rb +6 -9
  112. data/lib/tapyrus/wallet/master_key.rb +2 -4
  113. data/tapyrusrb.gemspec +13 -14
  114. metadata +21 -4
  115. data/.travis.yml +0 -14
@@ -1,26 +1,29 @@
1
1
  module Tapyrus
2
2
  module KeyPath
3
-
4
3
  # key path convert an array of derive number
5
4
  # @param [String] path_string
6
5
  # @return [Array[Integer]] key path numbers.
7
6
  def parse_key_path(path_string)
8
- path_string.split('/').map.with_index do|p, index|
9
- if index == 0
10
- raise ArgumentError.new("#{path_string} is invalid format.") unless p == 'm'
11
- next
12
- end
13
- raise ArgumentError.new("#{path_string} is invalid format.") unless p.delete("'") =~ /^[0-9]+$/
14
- (p[-1] == "'" ? p.delete("'").to_i + Tapyrus::HARDENED_THRESHOLD : p.to_i)
15
- end[1..-1]
7
+ path_string
8
+ .split('/')
9
+ .map
10
+ .with_index do |p, index|
11
+ if index == 0
12
+ raise ArgumentError.new("#{path_string} is invalid format.") unless p == 'm'
13
+ next
14
+ end
15
+ raise ArgumentError.new("#{path_string} is invalid format.") unless p.delete("'") =~ /^[0-9]+$/
16
+ (p[-1] == "'" ? p.delete("'").to_i + Tapyrus::HARDENED_THRESHOLD : p.to_i)
17
+ end[
18
+ 1..-1
19
+ ]
16
20
  end
17
21
 
18
22
  # key path numbers convert to path string.
19
23
  # @param [Array[Integer]] key path numbers.
20
24
  # @return [String] path string.
21
25
  def to_key_path(numbers)
22
- "m/#{numbers.map{|p| p >= Tapyrus::HARDENED_THRESHOLD ? "#{p - Tapyrus::HARDENED_THRESHOLD}'" : p.to_s}.join('/')}"
26
+ "m/#{numbers.map { |p| p >= Tapyrus::HARDENED_THRESHOLD ? "#{p - Tapyrus::HARDENED_THRESHOLD}'" : p.to_s }.join('/')}"
23
27
  end
24
-
25
28
  end
26
- end
29
+ end
@@ -1,10 +1,8 @@
1
1
  require 'logger'
2
2
 
3
3
  module Tapyrus
4
-
5
4
  # Simple Logger module
6
5
  module Logger
7
-
8
6
  Format = "%s, [%s#%d #%d] %5s -- %s: %s\n".freeze
9
7
 
10
8
  module_function
@@ -15,28 +13,34 @@ module Tapyrus
15
13
  FileUtils.mkdir_p(dir)
16
14
  logger = ::Logger.new(dir + "/#{name}.log", 10)
17
15
  logger.level = level
18
- logger.formatter = proc do |severity, datetime, progname, msg|
19
- Format % [severity[0..0], format_datetime(datetime), $$,
20
- Thread.current.object_id, severity, progname, msg2str(msg)]
21
- end
16
+ logger.formatter =
17
+ proc do |severity, datetime, progname, msg|
18
+ Format % [
19
+ severity[0..0],
20
+ format_datetime(datetime),
21
+ $$,
22
+ Thread.current.object_id,
23
+ severity,
24
+ progname,
25
+ msg2str(msg)
26
+ ]
27
+ end
22
28
  logger
23
29
  end
24
30
 
25
31
  def self.msg2str(msg)
26
32
  case msg
27
- when ::String
28
- msg
29
- when ::Exception
30
- "#{ msg.message } (#{ msg.class })\n" <<
31
- (msg.backtrace || []).join("\n")
32
- else
33
- msg.inspect
33
+ when ::String
34
+ msg
35
+ when ::Exception
36
+ "#{msg.message} (#{msg.class})\n" << (msg.backtrace || []).join("\n")
37
+ else
38
+ msg.inspect
34
39
  end
35
40
  end
36
41
 
37
42
  def format_datetime(time)
38
- time.strftime(@datetime_format || "%Y-%m-%dT%H:%M:%S.%6N ".freeze)
43
+ time.strftime(@datetime_format || '%Y-%m-%dT%H:%M:%S.%6N '.freeze)
39
44
  end
40
-
41
45
  end
42
- end
46
+ end
@@ -1,8 +1,6 @@
1
1
  module Tapyrus
2
-
3
2
  # merkle tree
4
3
  class MerkleTree
5
-
6
4
  attr_accessor :root
7
5
 
8
6
  def initialize(root = nil)
@@ -17,11 +15,12 @@ module Tapyrus
17
15
  if txids.size == 1
18
16
  nodes = [Node.new(txids.first)]
19
17
  else
20
- nodes = txids.each_slice(2).map{ |m|
21
- left = Node.new(m[0])
22
- right = Node.new(m[1] ? m[1] : m[0])
23
- [left, right]
24
- }.flatten
18
+ nodes =
19
+ txids.each_slice(2).map do |m|
20
+ left = Node.new(m[0])
21
+ right = Node.new(m[1] ? m[1] : m[0])
22
+ [left, right]
23
+ end.flatten
25
24
  end
26
25
  new(build_initial_tree(nodes))
27
26
  end
@@ -29,7 +28,7 @@ module Tapyrus
29
28
  # https://bitcoin.org/en/developer-reference#creating-a-merkleblock-message
30
29
  def self.build_partial(tx_count, hashes, flags)
31
30
  flags = flags.each_char.map(&:to_i)
32
- root = build_initial_tree( Array.new(tx_count) { Node.new })
31
+ root = build_initial_tree(Array.new(tx_count) { Node.new })
33
32
  current_node = root
34
33
  hash_index = 0
35
34
  flags.each do |f|
@@ -40,9 +39,7 @@ module Tapyrus
40
39
  end
41
40
  current_node = current_node.next_partial
42
41
  if hash_index == hashes.size
43
- if current_node&.leaf?
44
- current_node.value = hashes.last
45
- end
42
+ current_node.value = hashes.last if current_node&.leaf?
46
43
  break
47
44
  end
48
45
  end
@@ -51,12 +48,15 @@ module Tapyrus
51
48
 
52
49
  def self.build_initial_tree(nodes)
53
50
  while nodes.size != 1
54
- nodes = nodes.each_slice(2).map { |m|
55
- parent = Node.new
56
- parent.left = m[0]
57
- parent.right = m[1] ? m[1] : m[0].dup
58
- parent
59
- }
51
+ nodes =
52
+ nodes
53
+ .each_slice(2)
54
+ .map do |m|
55
+ parent = Node.new
56
+ parent.left = m[0]
57
+ parent.right = m[1] ? m[1] : m[0].dup
58
+ parent
59
+ end
60
60
  end
61
61
  nodes.first
62
62
  end
@@ -67,7 +67,6 @@ module Tapyrus
67
67
 
68
68
  # node of merkle tree
69
69
  class Node
70
-
71
70
  attr_accessor :flag
72
71
  attr_accessor :value
73
72
  attr_accessor :parent
@@ -118,7 +117,7 @@ module Tapyrus
118
117
  def depth
119
118
  d = 0
120
119
  current_node = self
121
- until current_node.root? do
120
+ until current_node.root?
122
121
  current_node = current_node.parent
123
122
  d += 1
124
123
  end
@@ -137,7 +136,7 @@ module Tapyrus
137
136
  i = 0
138
137
  d = 1
139
138
  current_node = self
140
- until current_node.root? do
139
+ until current_node.root?
141
140
  i += d if current_node.parent.right == current_node
142
141
  current_node = current_node.parent
143
142
  d *= 2
@@ -1,6 +1,5 @@
1
1
  module Tapyrus
2
2
  module Message
3
-
4
3
  autoload :Base, 'tapyrus/message/base'
5
4
  autoload :Inventory, 'tapyrus/message/inventory'
6
5
  autoload :InventoriesParser, 'tapyrus/message/inventories_parser'
@@ -41,30 +40,29 @@ module Tapyrus
41
40
  USER_AGENT = "/tapyrusrb:#{Tapyrus::VERSION}/"
42
41
 
43
42
  SERVICE_FLAGS = {
44
- none: 0,
45
- network: 1 << 0, # the node is capable of serving the block chain. It is currently set by all Bitcoin Core node, and is unset by SPV clients or other peers that just want network services but don't provide them.
46
- # getutxo: 1 << 1, # BIP-64. not implemented in Bitcoin Core.
47
- bloom: 1 << 2, # the node is capable and willing to handle bloom-filtered connections. Bitcoin Core node used to support this by default, without advertising this bit, but no longer do as of protocol version 70011 (= NO_BLOOM_VERSION)
48
- #witness: 1 << 3, # the node can be asked for blocks and transactions including witness data.
49
- # xthin: 1 << 4 # support Xtreme Thinblocks. not implemented in Bitcoin Core
43
+ none: 0,
44
+ network: 1 << 0, # the node is capable of serving the block chain. It is currently set by all Bitcoin Core node, and is unset by SPV clients or other peers that just want network services but don't provide them.
45
+ # getutxo: 1 << 1, # BIP-64. not implemented in Bitcoin Core.
46
+ bloom: 1 << 2 # the node is capable and willing to handle bloom-filtered connections. Bitcoin Core node used to support this by default, without advertising this bit, but no longer do as of protocol version 70011 (= NO_BLOOM_VERSION)
47
+ #witness: 1 << 3, # the node can be asked for blocks and transactions including witness data.
48
+ # xthin: 1 << 4 # support Xtreme Thinblocks. not implemented in Bitcoin Core
50
49
  }
51
50
 
52
51
  # DEFAULT_SERVICE_FLAGS = SERVICE_FLAGS[:network] | SERVICE_FLAGS[:bloom] | SERVICE_FLAGS[:witness]
53
52
 
54
53
  DEFAULT_SERVICE_FLAGS = SERVICE_FLAGS[:none]
55
54
 
56
- DEFAULT_STOP_HASH = "00"*32
55
+ DEFAULT_STOP_HASH = '00' * 32
57
56
 
58
57
  # the protocol version.
59
58
  VERSION = {
60
- headers: 31800,
61
- pong: 60001,
62
- bloom: 70011,
63
- send_headers: 70012,
64
- fee_filter: 70013,
65
- compact: 70014,
66
- compact_witness: 70015
59
+ headers: 31_800,
60
+ pong: 60_001,
61
+ bloom: 70_011,
62
+ send_headers: 70_012,
63
+ fee_filter: 70_013,
64
+ compact: 70_014,
65
+ compact_witness: 70_015
67
66
  }
68
-
69
67
  end
70
68
  end
@@ -2,11 +2,9 @@ require 'ipaddr'
2
2
 
3
3
  module Tapyrus
4
4
  module Message
5
-
6
5
  # addr message
7
6
  # https://bitcoin.org/en/developer-reference#addr
8
7
  class Addr < Base
9
-
10
8
  COMMAND = 'addr'
11
9
 
12
10
  attr_reader :addrs
@@ -19,17 +17,13 @@ module Tapyrus
19
17
  buf = StringIO.new(payload)
20
18
  addr_count = Tapyrus.unpack_var_int_from_io(buf)
21
19
  addr = new
22
- addr_count.times do
23
- addr.addrs << NetworkAddr.parse_from_payload(buf)
24
- end
20
+ addr_count.times { addr.addrs << NetworkAddr.parse_from_payload(buf) }
25
21
  addr
26
22
  end
27
23
 
28
24
  def to_payload
29
25
  Tapyrus.pack_var_int(addrs.length) << addrs.map(&:to_payload).join
30
26
  end
31
-
32
27
  end
33
-
34
28
  end
35
29
  end
@@ -1,6 +1,5 @@
1
1
  module Tapyrus
2
2
  module Message
3
-
4
3
  # Base message class
5
4
  class Base
6
5
  include Tapyrus::HexConverter
@@ -22,8 +21,6 @@ module Tapyrus
22
21
  def to_payload
23
22
  raise 'to_payload must be implemented in a child class.'
24
23
  end
25
-
26
24
  end
27
-
28
25
  end
29
26
  end
@@ -1,10 +1,8 @@
1
1
  module Tapyrus
2
2
  module Message
3
-
4
3
  # block message
5
4
  # https://bitcoin.org/en/developer-reference#block
6
5
  class Block < Base
7
-
8
6
  attr_accessor :header
9
7
  attr_accessor :transactions
10
8
  attr_accessor :use_segwit
@@ -23,24 +21,19 @@ module Tapyrus
23
21
  transactions = []
24
22
  unless buf.eof?
25
23
  tx_count = Tapyrus.unpack_var_int_from_io(buf)
26
- tx_count.times do
27
- transactions << Tapyrus::Tx.parse_from_payload(buf)
28
- end
24
+ tx_count.times { transactions << Tapyrus::Tx.parse_from_payload(buf) }
29
25
  end
30
26
  new(header, transactions)
31
27
  end
32
28
 
33
29
  def to_payload
34
- header.to_payload << Tapyrus.pack_var_int(transactions.size) <<
35
- transactions.map(&:to_payload).join
30
+ header.to_payload << Tapyrus.pack_var_int(transactions.size) << transactions.map(&:to_payload).join
36
31
  end
37
32
 
38
33
  # generate Tapyrus::Block object.
39
34
  def to_block
40
35
  Tapyrus::Block.new(header, transactions)
41
36
  end
42
-
43
37
  end
44
-
45
38
  end
46
39
  end
@@ -1,10 +1,8 @@
1
1
  module Tapyrus
2
2
  module Message
3
-
4
3
  # BIP-152 Compact Block's data format.
5
4
  # https://github.com/bitcoin/bips/blob/master/bip-0152.mediawiki#BlockTransactionsRequest
6
5
  class BlockTransactionRequest
7
-
8
6
  attr_accessor :block_hash # When matching with Tapyrus::BlockHeader#hash It is necessary to reverse the byte order.
9
7
  attr_accessor :indexes
10
8
 
@@ -17,7 +15,8 @@ module Tapyrus
17
15
  buf = StringIO.new(payload)
18
16
  block_hash = buf.read(32).bth
19
17
  index_len = Tapyrus.unpack_var_int_from_io(buf)
20
- indexes = index_len.times.map{Tapyrus.unpack_var_int_from_io(buf)}
18
+ indexes = index_len.times.map { Tapyrus.unpack_var_int_from_io(buf) }
19
+
21
20
  # index data differentially encoded
22
21
  offset = 0
23
22
  index_len.times do |i|
@@ -33,13 +32,11 @@ module Tapyrus
33
32
  p = block_hash.htb << Tapyrus.pack_var_int(indexes.size)
34
33
  indexes.size.times do |i|
35
34
  index = indexes[i]
36
- index -= indexes[i-1] + 1 if i > 0
35
+ index -= indexes[i - 1] + 1 if i > 0
37
36
  p << Tapyrus.pack_var_int(index)
38
37
  end
39
38
  p
40
39
  end
41
-
42
40
  end
43
-
44
41
  end
45
42
  end
@@ -1,10 +1,8 @@
1
1
  module Tapyrus
2
2
  module Message
3
-
4
3
  # BIP-152 Compact Block's data format.
5
4
  # https://github.com/bitcoin/bips/blob/master/bip-0152.mediawiki#BlockTransactions
6
5
  class BlockTransactions
7
-
8
6
  attr_accessor :block_hash
9
7
  attr_accessor :transactions
10
8
 
@@ -17,15 +15,13 @@ module Tapyrus
17
15
  buf = StringIO.new(payload)
18
16
  block_hash = buf.read(32).bth
19
17
  tx_count = Tapyrus.unpack_var_int_from_io(buf)
20
- txn = tx_count.times.map{Tapyrus::Tx.parse_from_payload(buf)}
18
+ txn = tx_count.times.map { Tapyrus::Tx.parse_from_payload(buf) }
21
19
  self.new(block_hash, txn)
22
20
  end
23
21
 
24
22
  def to_payload
25
23
  block_hash.htb << Tapyrus.pack_var_int(transactions.size) << transactions.map(&:to_payload).join
26
24
  end
27
-
28
25
  end
29
-
30
26
  end
31
- end
27
+ end
@@ -1,10 +1,8 @@
1
1
  module Tapyrus
2
2
  module Message
3
-
4
3
  # blocktxn message.
5
4
  # https://github.com/bitcoin/bips/blob/master/bip-0152.mediawiki#blocktxn
6
5
  class BlockTxn < Base
7
-
8
6
  COMMAND = 'blocktxn'
9
7
 
10
8
  attr_accessor :block_transactions
@@ -20,8 +18,6 @@ module Tapyrus
20
18
  def to_payload
21
19
  block_transactions.to_payload
22
20
  end
23
-
24
21
  end
25
-
26
22
  end
27
23
  end
@@ -1,10 +1,8 @@
1
1
  module Tapyrus
2
2
  module Message
3
-
4
3
  # cmpctblock message. support only version 1.
5
4
  # https://github.com/bitcoin/bips/blob/master/bip-0152.mediawiki
6
5
  class CmpctBlock < Base
7
-
8
6
  COMMAND = 'cmpctblock'
9
7
 
10
8
  attr_accessor :header_and_short_ids
@@ -19,9 +17,7 @@ module Tapyrus
19
17
  # @return [Tapyrus::Message::CmpctBlock]
20
18
  def self.from_block(block, nonce = SecureRandom.hex(8).to_i(16))
21
19
  h = HeaderAndShortIDs.new(block.header, nonce)
22
- block.transactions[1..-1].each do |tx|
23
- h.short_ids << h.short_id(tx.txid)
24
- end
20
+ block.transactions[1..-1].each { |tx| h.short_ids << h.short_id(tx.txid) }
25
21
  h.prefilled_txn << PrefilledTx.new(0, block.transactions.first)
26
22
  self.new(h)
27
23
  end
@@ -33,8 +29,6 @@ module Tapyrus
33
29
  def to_payload
34
30
  header_and_short_ids.to_payload
35
31
  end
36
-
37
32
  end
38
-
39
33
  end
40
34
  end