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 +4 -4
- data/.github/workflows/ruby.yml +1 -1
- data/.ruby-version +1 -1
- data/lib/bitcoin/constants.rb +1 -0
- data/lib/bitcoin/message/send_tx_rcncl.rb +35 -0
- data/lib/bitcoin/message/wtxid_relay.rb +14 -0
- data/lib/bitcoin/message.rb +65 -58
- data/lib/bitcoin/rpc/http_server.rb +19 -0
- data/lib/bitcoin/script/script_error.rb +5 -0
- data/lib/bitcoin/script/script_interpreter.rb +5 -3
- data/lib/bitcoin/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6d7be6093f10fa04e688b7106ecc080066e0ec693af6b23bb1e0ddb0dbc2e586
|
|
4
|
+
data.tar.gz: e3fce6344304e22350cde36a0471d1dd1a0dc5d8c1d8b22309efc20704cd74f5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f65b05a052712bf2186543fbae88222b5e8e753aa201ca00c6997ffad364cab62bfa0b47a091eb998343ffacbcd050c05c9def591d90e28c8a04a3c71286a909
|
|
7
|
+
data.tar.gz: 47e7fd6c0cb573723523671b2f0002c2d347e4e8187e08157a72326fb91094631c581290356c29fe25d65d9adb5e420b39e3cf22efcbcff24e9d281cef734f3a
|
data/.github/workflows/ruby.yml
CHANGED
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
ruby-
|
|
1
|
+
ruby-4.0.0
|
data/lib/bitcoin/constants.rb
CHANGED
|
@@ -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
|
data/lib/bitcoin/message.rb
CHANGED
|
@@ -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
|
|
90
|
-
|
|
91
|
-
when
|
|
92
|
-
|
|
93
|
-
when
|
|
94
|
-
|
|
95
|
-
when
|
|
96
|
-
|
|
97
|
-
when
|
|
98
|
-
|
|
99
|
-
when
|
|
100
|
-
|
|
101
|
-
when
|
|
102
|
-
|
|
103
|
-
when
|
|
104
|
-
|
|
105
|
-
when
|
|
106
|
-
|
|
107
|
-
when
|
|
108
|
-
|
|
109
|
-
when
|
|
110
|
-
|
|
111
|
-
when
|
|
112
|
-
|
|
113
|
-
when
|
|
114
|
-
|
|
115
|
-
when
|
|
116
|
-
|
|
117
|
-
when
|
|
118
|
-
|
|
119
|
-
when
|
|
120
|
-
|
|
121
|
-
when
|
|
122
|
-
|
|
123
|
-
when
|
|
124
|
-
|
|
125
|
-
when
|
|
126
|
-
|
|
127
|
-
when
|
|
128
|
-
|
|
129
|
-
when
|
|
130
|
-
|
|
131
|
-
when
|
|
132
|
-
|
|
133
|
-
when
|
|
134
|
-
|
|
135
|
-
when
|
|
136
|
-
|
|
137
|
-
when
|
|
138
|
-
|
|
139
|
-
when
|
|
140
|
-
|
|
141
|
-
when
|
|
142
|
-
|
|
143
|
-
when
|
|
144
|
-
|
|
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(
|
|
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)
|
data/lib/bitcoin/version.rb
CHANGED
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.
|
|
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:
|
|
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: []
|