bitcoinrb 1.11.0 → 1.12.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a617f4bbc9d3523c7de3740050880c5bdaeafb8513eaa04686e39ea70f25673a
4
- data.tar.gz: 1ddcfa267f592c563bf8db07774ff1805dea53d382f9a330e9b1d4f76c5d9eaa
3
+ metadata.gz: 6d7be6093f10fa04e688b7106ecc080066e0ec693af6b23bb1e0ddb0dbc2e586
4
+ data.tar.gz: e3fce6344304e22350cde36a0471d1dd1a0dc5d8c1d8b22309efc20704cd74f5
5
5
  SHA512:
6
- metadata.gz: f984c05b61a1f67cd5374b559730c7f7cae9f2bf1024d00e352bb98237d3258bef72cbf0660c579a0e900e0c3c5bc0d298299cbe7c347e2c8d48009fcc076a91
7
- data.tar.gz: 19195672bcd808e9554558f83d8e7e13513d814e511892d01ddf8c1084cc4e853e8386825c50fea89a44317d36715148848402324070ee56dbd69d13a11fa20f
6
+ metadata.gz: f65b05a052712bf2186543fbae88222b5e8e753aa201ca00c6997ffad364cab62bfa0b47a091eb998343ffacbcd050c05c9def591d90e28c8a04a3c71286a909
7
+ data.tar.gz: 47e7fd6c0cb573723523671b2f0002c2d347e4e8187e08157a72326fb91094631c581290356c29fe25d65d9adb5e420b39e3cf22efcbcff24e9d281cef734f3a
@@ -19,7 +19,7 @@ jobs:
19
19
  runs-on: ubuntu-latest
20
20
  strategy:
21
21
  matrix:
22
- ruby-version: ['3.1', '3.2', '3.3', '3.4']
22
+ ruby-version: ['3.2', '3.3', '3.4', '4.0']
23
23
 
24
24
  steps:
25
25
  - uses: actions/checkout@v4
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-3.4.1
1
+ ruby-4.0.0
@@ -135,6 +135,7 @@ module Bitcoin
135
135
  SCRIPT_ERR_UNKNOWN_ERROR = 1
136
136
  SCRIPT_ERR_EVAL_FALSE = 2
137
137
  SCRIPT_ERR_OP_RETURN = 3
138
+ SCRIPT_ERR_SCRIPTNUM = 4
138
139
 
139
140
  # Max sizes
140
141
  SCRIPT_ERR_SCRIPT_SIZE = 10
@@ -0,0 +1,35 @@
1
+ module Bitcoin
2
+ module Message
3
+ # sendtxrcncl message for BIP-330.
4
+ # https://github.com/bitcoin/bips/blob/master/bip-0330.mediawiki
5
+ class SendTxRcncl < Base
6
+ include Schnorr::Util
7
+ COMMAND = 'sendtxrcncl'
8
+
9
+ attr_reader :version
10
+ attr_reader :salt
11
+
12
+ # @param [Integer] version
13
+ # @param [Integer] salt
14
+ def initialize(version, salt)
15
+ raise ArgumentError, "version must be integer." unless version.is_a?(Integer)
16
+ raise ArgumentError, "salt must be integer." unless salt.is_a?(Integer)
17
+ raise ArgumentError, "version must be positive number." unless version > 0
18
+ raise ArgumentError, "version is out of range." if version < 0 || version > 0xffffffff
19
+ raise ArgumentError, "salt is out of range." if salt < 0 || salt > 0xffffffffffffffff
20
+ @version = version
21
+ @salt = salt
22
+ end
23
+
24
+ def self.parse_from_payload(payload)
25
+ buf = StringIO.new(payload)
26
+ version, salt = buf.read(16).unpack('VQ<')
27
+ SendTxRcncl.new(version, salt)
28
+ end
29
+
30
+ def to_payload
31
+ [version, salt].pack('VQ<')
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,14 @@
1
+ module Bitcoin
2
+ module Message
3
+ # wtxidrelay message for BIP-339
4
+ # https://github.com/bitcoin/bips/blob/master/bip-0339.mediawiki
5
+ class WTXIDRelay < Base
6
+
7
+ COMMAND = 'wtxidrelay'
8
+
9
+ def to_payload
10
+ ''
11
+ end
12
+ end
13
+ end
14
+ end
@@ -48,6 +48,8 @@ module Bitcoin
48
48
  autoload :CFHeaders, 'bitcoin/message/cfheaders'
49
49
  autoload :SendAddrV2, 'bitcoin/message/send_addr_v2'
50
50
  autoload :AddrV2, 'bitcoin/message/addr_v2'
51
+ autoload :WTXIDRelay, 'bitcoin/message/wtxid_relay'
52
+ autoload :SendTxRcncl, 'bitcoin/message/send_tx_rcncl'
51
53
 
52
54
  USER_AGENT = "/bitcoinrb:#{Bitcoin::VERSION}/"
53
55
 
@@ -74,7 +76,8 @@ module Bitcoin
74
76
  send_headers: 70012,
75
77
  fee_filter: 70013,
76
78
  compact: 70014,
77
- compact_witness: 70015
79
+ compact_witness: 70015,
80
+ wtxid_relay: 70016
78
81
  }
79
82
 
80
83
  module_function
@@ -82,66 +85,70 @@ module Bitcoin
82
85
  # Decode P2P message.
83
86
  # @param [String] command P2P message command string.
84
87
  # @param [String] payload P2P message payload with hex format..
85
- # @return [Bitcoin::Message::]
88
+ # @return [Bitcoin::Message]
86
89
  def decode(command, payload = nil)
87
90
  payload = payload.htb if payload
88
91
  case command
89
- when Bitcoin::Message::Version::COMMAND
90
- Bitcoin::Message::Version.parse_from_payload(payload)
91
- when Bitcoin::Message::VerAck::COMMAND
92
- Bitcoin::Message::VerAck.new
93
- when Bitcoin::Message::GetAddr::COMMAND
94
- Bitcoin::Message::GetAddr.new
95
- when Bitcoin::Message::Addr::COMMAND
96
- Bitcoin::Message::Addr.parse_from_payload(payload)
97
- when Bitcoin::Message::SendHeaders::COMMAND
98
- Bitcoin::Message::SendHeaders.new
99
- when Bitcoin::Message::FeeFilter::COMMAND
100
- Bitcoin::Message::FeeFilter.parse_from_payload(payload)
101
- when Bitcoin::Message::Ping::COMMAND
102
- Bitcoin::Message::Ping.parse_from_payload(payload)
103
- when Bitcoin::Message::Pong::COMMAND
104
- Bitcoin::Message::Pong.parse_from_payload(payload)
105
- when Bitcoin::Message::GetHeaders::COMMAND
106
- Bitcoin::Message::GetHeaders.parse_from_payload(payload)
107
- when Bitcoin::Message::Headers::COMMAND
108
- Bitcoin::Message::Headers.parse_from_payload(payload)
109
- when Bitcoin::Message::Block::COMMAND
110
- Bitcoin::Message::Block.parse_from_payload(payload)
111
- when Bitcoin::Message::Tx::COMMAND
112
- Bitcoin::Message::Tx.parse_from_payload(payload)
113
- when Bitcoin::Message::NotFound::COMMAND
114
- Bitcoin::Message::NotFound.parse_from_payload(payload)
115
- when Bitcoin::Message::MemPool::COMMAND
116
- Bitcoin::Message::MemPool.new
117
- when Bitcoin::Message::Reject::COMMAND
118
- Bitcoin::Message::Reject.parse_from_payload(payload)
119
- when Bitcoin::Message::SendCmpct::COMMAND
120
- Bitcoin::Message::SendCmpct.parse_from_payload(payload)
121
- when Bitcoin::Message::Inv::COMMAND
122
- Bitcoin::Message::Inv.parse_from_payload(payload)
123
- when Bitcoin::Message::MerkleBlock::COMMAND
124
- Bitcoin::Message::MerkleBlock.parse_from_payload(payload)
125
- when Bitcoin::Message::CmpctBlock::COMMAND
126
- Bitcoin::Message::CmpctBlock.parse_from_payload(payload)
127
- when Bitcoin::Message::GetData::COMMAND
128
- Bitcoin::Message::GetData.parse_from_payload(payload)
129
- when Bitcoin::Message::GetCFHeaders::COMMAND
130
- Bitcoin::Message::GetCFHeaders.parse_from_payload(payload)
131
- when Bitcoin::Message::GetCFilters::COMMAND
132
- Bitcoin::Message::GetCFilters.parse_from_payload(payload)
133
- when Bitcoin::Message::GetCFCheckpt::COMMAND
134
- Bitcoin::Message::GetCFCheckpt.parse_from_payload(payload)
135
- when Bitcoin::Message::CFCheckpt::COMMAND
136
- Bitcoin::Message::CFCheckpt.parse_from_payload(payload)
137
- when Bitcoin::Message::CFHeaders::COMMAND
138
- Bitcoin::Message::CFHeaders.parse_from_payload(payload)
139
- when Bitcoin::Message::CFilter::COMMAND
140
- Bitcoin::Message::CFilter.parse_from_payload(payload)
141
- when Bitcoin::Message::SendAddrV2::COMMAND
142
- Bitcoin::Message::SendAddrV2.new
143
- when Bitcoin::Message::AddrV2::COMMAND
144
- Bitcoin::Message::AddrV2.parse_from_payload(payload)
92
+ when Version::COMMAND
93
+ Version.parse_from_payload(payload)
94
+ when VerAck::COMMAND
95
+ VerAck.new
96
+ when GetAddr::COMMAND
97
+ GetAddr.new
98
+ when Addr::COMMAND
99
+ Addr.parse_from_payload(payload)
100
+ when SendHeaders::COMMAND
101
+ SendHeaders.new
102
+ when FeeFilter::COMMAND
103
+ FeeFilter.parse_from_payload(payload)
104
+ when Ping::COMMAND
105
+ Ping.parse_from_payload(payload)
106
+ when Pong::COMMAND
107
+ Pong.parse_from_payload(payload)
108
+ when GetHeaders::COMMAND
109
+ GetHeaders.parse_from_payload(payload)
110
+ when Headers::COMMAND
111
+ Headers.parse_from_payload(payload)
112
+ when Block::COMMAND
113
+ Block.parse_from_payload(payload)
114
+ when Tx::COMMAND
115
+ Tx.parse_from_payload(payload)
116
+ when NotFound::COMMAND
117
+ NotFound.parse_from_payload(payload)
118
+ when MemPool::COMMAND
119
+ MemPool.new
120
+ when Reject::COMMAND
121
+ Reject.parse_from_payload(payload)
122
+ when SendCmpct::COMMAND
123
+ SendCmpct.parse_from_payload(payload)
124
+ when Inv::COMMAND
125
+ Inv.parse_from_payload(payload)
126
+ when MerkleBlock::COMMAND
127
+ MerkleBlock.parse_from_payload(payload)
128
+ when CmpctBlock::COMMAND
129
+ CmpctBlock.parse_from_payload(payload)
130
+ when GetData::COMMAND
131
+ GetData.parse_from_payload(payload)
132
+ when GetCFHeaders::COMMAND
133
+ GetCFHeaders.parse_from_payload(payload)
134
+ when GetCFilters::COMMAND
135
+ GetCFilters.parse_from_payload(payload)
136
+ when GetCFCheckpt::COMMAND
137
+ GetCFCheckpt.parse_from_payload(payload)
138
+ when CFCheckpt::COMMAND
139
+ CFCheckpt.parse_from_payload(payload)
140
+ when CFHeaders::COMMAND
141
+ CFHeaders.parse_from_payload(payload)
142
+ when CFilter::COMMAND
143
+ CFilter.parse_from_payload(payload)
144
+ when SendAddrV2::COMMAND
145
+ SendAddrV2.new
146
+ when AddrV2::COMMAND
147
+ AddrV2.parse_from_payload(payload)
148
+ when WTXIDRelay::COMMAND
149
+ WTXIDRelay.new
150
+ when SendTxRcncl::COMMAND
151
+ SendTxRcncl.parse_from_payload(payload)
145
152
  end
146
153
  end
147
154
 
@@ -9,6 +9,22 @@ module Bitcoin
9
9
  include EM::HttpServer
10
10
  include RequestHandler
11
11
 
12
+ SUPPORTED_COMMANDS = %w[
13
+ getblockchaininfo
14
+ stop
15
+ getblockheader
16
+ getpeerinfo
17
+ sendrawtransaction
18
+ decoderawtransaction
19
+ decodescript
20
+ createwallet
21
+ listwallets
22
+ getwalletinfo
23
+ listaccounts
24
+ encryptwallet
25
+ getnewaddress
26
+ ].freeze
27
+
12
28
  attr_reader :node
13
29
  attr_accessor :logger
14
30
 
@@ -31,6 +47,9 @@ module Bitcoin
31
47
  operation = proc {
32
48
  command, args = parse_json_params
33
49
  logger.debug("process http request. command = #{command}")
50
+ unless SUPPORTED_COMMANDS.include?(command)
51
+ raise ArgumentError, "Unsupported method: #{command}"
52
+ end
34
53
  begin
35
54
  send(command, *args).to_json
36
55
  rescue Exception => e
@@ -1,5 +1,8 @@
1
1
  module Bitcoin
2
2
 
3
+ class ScriptNumError < StandardError
4
+ end
5
+
3
6
  # bitcoin script error
4
7
  class ScriptError < Exception
5
8
 
@@ -122,6 +125,8 @@ module Bitcoin
122
125
  'Signature is found in scriptCode'
123
126
  when SCRIPT_ERR_UNKNOWN_ERROR, SCRIPT_ERR_ERROR_COUNT
124
127
  'unknown error'
128
+ when SCRIPT_ERR_SCRIPTNUM
129
+ 'Script number overflowed or is non-minimally encoded'
125
130
  else
126
131
  extra_msg ? extra_msg : 'unknown error'
127
132
  end
@@ -258,7 +258,7 @@ module Bitcoin
258
258
  when OP_IF, OP_NOTIF
259
259
  result = false
260
260
  if need_exec
261
- return set_error(SCRIPT_ERR_UNBALANCED_CONDITIONAL) if stack.size < 1
261
+ return set_error(SCRIPT_ERR_INVALID_STACK_OPERATION) if stack.size < 1
262
262
  value = pop_string.htb
263
263
  if sig_version == :witness_v0 && flag?(SCRIPT_VERIFY_MINIMALIF) || sig_version == :tapscript
264
264
  # Under witness v0 rules it is only a policy rule, enabled through SCRIPT_VERIFY_MINIMALIF.
@@ -566,6 +566,8 @@ module Bitcoin
566
566
  # max stack size check
567
567
  return set_error(SCRIPT_ERR_STACK_SIZE) if stack.size + alt_stack.size > MAX_STACK_SIZE
568
568
  end
569
+ rescue ScriptNumError => e
570
+ return set_error(SCRIPT_ERR_SCRIPTNUM, e.message)
569
571
  rescue Exception => e
570
572
  return set_error(SCRIPT_ERR_UNKNOWN_ERROR, e.message)
571
573
  end
@@ -591,10 +593,10 @@ module Bitcoin
591
593
  # cast item to int value.
592
594
  def cast_to_int(s, max_num_size = DEFAULT_MAX_NUM_SIZE)
593
595
  data = s.htb
594
- raise '"script number overflow"' if data.bytesize > max_num_size
596
+ raise ScriptNumError, '"script number overflow"' if data.bytesize > max_num_size
595
597
  if require_minimal && data.bytesize > 0
596
598
  if data.bytes[-1] & 0x7f == 0 && (data.bytesize <= 1 || data.bytes[data.bytesize - 2] & 0x80 == 0)
597
- raise 'non-minimally encoded script number'
599
+ raise ScriptNumError, 'non-minimally encoded script number'
598
600
  end
599
601
  end
600
602
  Script.decode_number(s)
@@ -1,3 +1,3 @@
1
1
  module Bitcoin
2
- VERSION = "1.11.0"
2
+ VERSION = "1.12.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitcoinrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.0
4
+ version: 1.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
@@ -353,9 +353,11 @@ files:
353
353
  - lib/bitcoin/message/send_addr_v2.rb
354
354
  - lib/bitcoin/message/send_cmpct.rb
355
355
  - lib/bitcoin/message/send_headers.rb
356
+ - lib/bitcoin/message/send_tx_rcncl.rb
356
357
  - lib/bitcoin/message/tx.rb
357
358
  - lib/bitcoin/message/ver_ack.rb
358
359
  - lib/bitcoin/message/version.rb
360
+ - lib/bitcoin/message/wtxid_relay.rb
359
361
  - lib/bitcoin/message_sign.rb
360
362
  - lib/bitcoin/mnemonic.rb
361
363
  - lib/bitcoin/mnemonic/wordlist/chinese_simplified.txt
@@ -447,7 +449,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
447
449
  - !ruby/object:Gem::Version
448
450
  version: '0'
449
451
  requirements: []
450
- rubygems_version: 3.6.9
452
+ rubygems_version: 4.0.3
451
453
  specification_version: 4
452
454
  summary: The implementation of Bitcoin Protocol for Ruby.
453
455
  test_files: []