bitcoinrb 1.11.0 → 1.12.1
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 +2 -2
- data/.ruby-version +1 -1
- data/bitcoinrb.gemspec +1 -6
- data/lib/bitcoin/bip324/fs_chacha20.rb +3 -5
- data/lib/bitcoin/bip324/fs_chacha_poly1305.rb +19 -17
- data/lib/bitcoin/bip324.rb +1 -1
- data/lib/bitcoin/constants.rb +1 -0
- data/lib/bitcoin/descriptor/expression.rb +2 -2
- data/lib/bitcoin/descriptor/sp.rb +219 -0
- data/lib/bitcoin/descriptor.rb +20 -0
- data/lib/bitcoin/ext_key.rb +3 -3
- data/lib/bitcoin/message/ping.rb +4 -2
- data/lib/bitcoin/message/send_tx_rcncl.rb +35 -0
- data/lib/bitcoin/message/version.rb +1 -1
- data/lib/bitcoin/message/wtxid_relay.rb +14 -0
- data/lib/bitcoin/message.rb +65 -58
- data/lib/bitcoin/message_sign.rb +98 -38
- data/lib/bitcoin/rpc.rb +0 -2
- data/lib/bitcoin/script/script_error.rb +5 -0
- data/lib/bitcoin/script/script_interpreter.rb +5 -3
- data/lib/bitcoin/silent_payment/output.rb +46 -0
- data/lib/bitcoin/silent_payment.rb +113 -12
- data/lib/bitcoin/util.rb +2 -2
- data/lib/bitcoin/version.rb +1 -1
- data/lib/bitcoin.rb +0 -6
- metadata +21 -109
- data/exe/bitcoinrb-cli +0 -5
- data/exe/bitcoinrbd +0 -46
- data/lib/bitcoin/network/connection.rb +0 -73
- data/lib/bitcoin/network/message_handler.rb +0 -243
- data/lib/bitcoin/network/peer.rb +0 -228
- data/lib/bitcoin/network/peer_discovery.rb +0 -42
- data/lib/bitcoin/network/pool.rb +0 -135
- data/lib/bitcoin/network.rb +0 -13
- data/lib/bitcoin/node/cli.rb +0 -122
- data/lib/bitcoin/node/configuration.rb +0 -40
- data/lib/bitcoin/node/spv.rb +0 -87
- data/lib/bitcoin/node.rb +0 -7
- data/lib/bitcoin/rpc/http_server.rb +0 -65
- data/lib/bitcoin/rpc/request_handler.rb +0 -150
- data/lib/bitcoin/store/chain_entry.rb +0 -68
- data/lib/bitcoin/store/db/level_db.rb +0 -98
- data/lib/bitcoin/store/db.rb +0 -9
- data/lib/bitcoin/store/spv_chain.rb +0 -101
- data/lib/bitcoin/store/utxo_db.rb +0 -226
- data/lib/bitcoin/store.rb +0 -12
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.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- azuchi
|
|
@@ -23,20 +23,6 @@ dependencies:
|
|
|
23
23
|
- - "~>"
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
25
|
version: 0.5.1
|
|
26
|
-
- !ruby/object:Gem::Dependency
|
|
27
|
-
name: eventmachine
|
|
28
|
-
requirement: !ruby/object:Gem::Requirement
|
|
29
|
-
requirements:
|
|
30
|
-
- - ">="
|
|
31
|
-
- !ruby/object:Gem::Version
|
|
32
|
-
version: '0'
|
|
33
|
-
type: :runtime
|
|
34
|
-
prerelease: false
|
|
35
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
-
requirements:
|
|
37
|
-
- - ">="
|
|
38
|
-
- !ruby/object:Gem::Version
|
|
39
|
-
version: '0'
|
|
40
26
|
- !ruby/object:Gem::Dependency
|
|
41
27
|
name: murmurhash3
|
|
42
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -65,62 +51,6 @@ dependencies:
|
|
|
65
51
|
- - ">="
|
|
66
52
|
- !ruby/object:Gem::Version
|
|
67
53
|
version: 1.5.0
|
|
68
|
-
- !ruby/object:Gem::Dependency
|
|
69
|
-
name: daemon-spawn
|
|
70
|
-
requirement: !ruby/object:Gem::Requirement
|
|
71
|
-
requirements:
|
|
72
|
-
- - ">="
|
|
73
|
-
- !ruby/object:Gem::Version
|
|
74
|
-
version: '0'
|
|
75
|
-
type: :runtime
|
|
76
|
-
prerelease: false
|
|
77
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
-
requirements:
|
|
79
|
-
- - ">="
|
|
80
|
-
- !ruby/object:Gem::Version
|
|
81
|
-
version: '0'
|
|
82
|
-
- !ruby/object:Gem::Dependency
|
|
83
|
-
name: thor
|
|
84
|
-
requirement: !ruby/object:Gem::Requirement
|
|
85
|
-
requirements:
|
|
86
|
-
- - ">="
|
|
87
|
-
- !ruby/object:Gem::Version
|
|
88
|
-
version: '0'
|
|
89
|
-
type: :runtime
|
|
90
|
-
prerelease: false
|
|
91
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
-
requirements:
|
|
93
|
-
- - ">="
|
|
94
|
-
- !ruby/object:Gem::Version
|
|
95
|
-
version: '0'
|
|
96
|
-
- !ruby/object:Gem::Dependency
|
|
97
|
-
name: eventmachine_httpserver
|
|
98
|
-
requirement: !ruby/object:Gem::Requirement
|
|
99
|
-
requirements:
|
|
100
|
-
- - ">="
|
|
101
|
-
- !ruby/object:Gem::Version
|
|
102
|
-
version: '0'
|
|
103
|
-
type: :runtime
|
|
104
|
-
prerelease: false
|
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
-
requirements:
|
|
107
|
-
- - ">="
|
|
108
|
-
- !ruby/object:Gem::Version
|
|
109
|
-
version: '0'
|
|
110
|
-
- !ruby/object:Gem::Dependency
|
|
111
|
-
name: iniparse
|
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
|
113
|
-
requirements:
|
|
114
|
-
- - ">="
|
|
115
|
-
- !ruby/object:Gem::Version
|
|
116
|
-
version: '0'
|
|
117
|
-
type: :runtime
|
|
118
|
-
prerelease: false
|
|
119
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
120
|
-
requirements:
|
|
121
|
-
- - ">="
|
|
122
|
-
- !ruby/object:Gem::Version
|
|
123
|
-
version: '0'
|
|
124
54
|
- !ruby/object:Gem::Dependency
|
|
125
55
|
name: siphash
|
|
126
56
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -177,20 +107,6 @@ dependencies:
|
|
|
177
107
|
- - "~>"
|
|
178
108
|
- !ruby/object:Gem::Version
|
|
179
109
|
version: 0.2.0
|
|
180
|
-
- !ruby/object:Gem::Dependency
|
|
181
|
-
name: observer
|
|
182
|
-
requirement: !ruby/object:Gem::Requirement
|
|
183
|
-
requirements:
|
|
184
|
-
- - "~>"
|
|
185
|
-
- !ruby/object:Gem::Version
|
|
186
|
-
version: 0.1.2
|
|
187
|
-
type: :runtime
|
|
188
|
-
prerelease: false
|
|
189
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
190
|
-
requirements:
|
|
191
|
-
- - "~>"
|
|
192
|
-
- !ruby/object:Gem::Version
|
|
193
|
-
version: 0.1.2
|
|
194
110
|
- !ruby/object:Gem::Dependency
|
|
195
111
|
name: secp256k1rb
|
|
196
112
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -233,12 +149,24 @@ dependencies:
|
|
|
233
149
|
- - '='
|
|
234
150
|
- !ruby/object:Gem::Version
|
|
235
151
|
version: 0.3.0
|
|
152
|
+
- !ruby/object:Gem::Dependency
|
|
153
|
+
name: dnsruby
|
|
154
|
+
requirement: !ruby/object:Gem::Requirement
|
|
155
|
+
requirements:
|
|
156
|
+
- - '='
|
|
157
|
+
- !ruby/object:Gem::Version
|
|
158
|
+
version: 1.73.0
|
|
159
|
+
type: :runtime
|
|
160
|
+
prerelease: false
|
|
161
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
162
|
+
requirements:
|
|
163
|
+
- - '='
|
|
164
|
+
- !ruby/object:Gem::Version
|
|
165
|
+
version: 1.73.0
|
|
236
166
|
description: The implementation of Bitcoin Protocol for Ruby.
|
|
237
167
|
email:
|
|
238
168
|
- azuchi@chaintope.com
|
|
239
|
-
executables:
|
|
240
|
-
- bitcoinrb-cli
|
|
241
|
-
- bitcoinrbd
|
|
169
|
+
executables: []
|
|
242
170
|
extensions: []
|
|
243
171
|
extra_rdoc_files: []
|
|
244
172
|
files:
|
|
@@ -257,8 +185,6 @@ files:
|
|
|
257
185
|
- bin/setup
|
|
258
186
|
- bitcoinrb.conf.sample
|
|
259
187
|
- bitcoinrb.gemspec
|
|
260
|
-
- exe/bitcoinrb-cli
|
|
261
|
-
- exe/bitcoinrbd
|
|
262
188
|
- lib/bitcoin.rb
|
|
263
189
|
- lib/bitcoin/base58.rb
|
|
264
190
|
- lib/bitcoin/bip321_uri.rb
|
|
@@ -297,6 +223,7 @@ files:
|
|
|
297
223
|
- lib/bitcoin/descriptor/sh.rb
|
|
298
224
|
- lib/bitcoin/descriptor/sorted_multi.rb
|
|
299
225
|
- lib/bitcoin/descriptor/sorted_multi_a.rb
|
|
226
|
+
- lib/bitcoin/descriptor/sp.rb
|
|
300
227
|
- lib/bitcoin/descriptor/tr.rb
|
|
301
228
|
- lib/bitcoin/descriptor/wpkh.rb
|
|
302
229
|
- lib/bitcoin/descriptor/wsh.rb
|
|
@@ -353,9 +280,11 @@ files:
|
|
|
353
280
|
- lib/bitcoin/message/send_addr_v2.rb
|
|
354
281
|
- lib/bitcoin/message/send_cmpct.rb
|
|
355
282
|
- lib/bitcoin/message/send_headers.rb
|
|
283
|
+
- lib/bitcoin/message/send_tx_rcncl.rb
|
|
356
284
|
- lib/bitcoin/message/tx.rb
|
|
357
285
|
- lib/bitcoin/message/ver_ack.rb
|
|
358
286
|
- lib/bitcoin/message/version.rb
|
|
287
|
+
- lib/bitcoin/message/wtxid_relay.rb
|
|
359
288
|
- lib/bitcoin/message_sign.rb
|
|
360
289
|
- lib/bitcoin/mnemonic.rb
|
|
361
290
|
- lib/bitcoin/mnemonic/wordlist/chinese_simplified.txt
|
|
@@ -365,16 +294,6 @@ files:
|
|
|
365
294
|
- lib/bitcoin/mnemonic/wordlist/italian.txt
|
|
366
295
|
- lib/bitcoin/mnemonic/wordlist/japanese.txt
|
|
367
296
|
- lib/bitcoin/mnemonic/wordlist/spanish.txt
|
|
368
|
-
- lib/bitcoin/network.rb
|
|
369
|
-
- lib/bitcoin/network/connection.rb
|
|
370
|
-
- lib/bitcoin/network/message_handler.rb
|
|
371
|
-
- lib/bitcoin/network/peer.rb
|
|
372
|
-
- lib/bitcoin/network/peer_discovery.rb
|
|
373
|
-
- lib/bitcoin/network/pool.rb
|
|
374
|
-
- lib/bitcoin/node.rb
|
|
375
|
-
- lib/bitcoin/node/cli.rb
|
|
376
|
-
- lib/bitcoin/node/configuration.rb
|
|
377
|
-
- lib/bitcoin/node/spv.rb
|
|
378
297
|
- lib/bitcoin/opcodes.rb
|
|
379
298
|
- lib/bitcoin/out_point.rb
|
|
380
299
|
- lib/bitcoin/partial_tree.rb
|
|
@@ -388,8 +307,6 @@ files:
|
|
|
388
307
|
- lib/bitcoin/psbt/tx.rb
|
|
389
308
|
- lib/bitcoin/rpc.rb
|
|
390
309
|
- lib/bitcoin/rpc/bitcoin_core_client.rb
|
|
391
|
-
- lib/bitcoin/rpc/http_server.rb
|
|
392
|
-
- lib/bitcoin/rpc/request_handler.rb
|
|
393
310
|
- lib/bitcoin/script/multisig.rb
|
|
394
311
|
- lib/bitcoin/script/script.rb
|
|
395
312
|
- lib/bitcoin/script/script_error.rb
|
|
@@ -402,16 +319,11 @@ files:
|
|
|
402
319
|
- lib/bitcoin/secp256k1/ruby.rb
|
|
403
320
|
- lib/bitcoin/sighash_generator.rb
|
|
404
321
|
- lib/bitcoin/silent_payment.rb
|
|
322
|
+
- lib/bitcoin/silent_payment/output.rb
|
|
405
323
|
- lib/bitcoin/slip39.rb
|
|
406
324
|
- lib/bitcoin/slip39/share.rb
|
|
407
325
|
- lib/bitcoin/slip39/sss.rb
|
|
408
326
|
- lib/bitcoin/slip39/wordlist/english.txt
|
|
409
|
-
- lib/bitcoin/store.rb
|
|
410
|
-
- lib/bitcoin/store/chain_entry.rb
|
|
411
|
-
- lib/bitcoin/store/db.rb
|
|
412
|
-
- lib/bitcoin/store/db/level_db.rb
|
|
413
|
-
- lib/bitcoin/store/spv_chain.rb
|
|
414
|
-
- lib/bitcoin/store/utxo_db.rb
|
|
415
327
|
- lib/bitcoin/taproot.rb
|
|
416
328
|
- lib/bitcoin/taproot/control_block.rb
|
|
417
329
|
- lib/bitcoin/taproot/custom_depth_builder.rb
|
|
@@ -447,7 +359,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
447
359
|
- !ruby/object:Gem::Version
|
|
448
360
|
version: '0'
|
|
449
361
|
requirements: []
|
|
450
|
-
rubygems_version:
|
|
362
|
+
rubygems_version: 4.0.3
|
|
451
363
|
specification_version: 4
|
|
452
364
|
summary: The implementation of Bitcoin Protocol for Ruby.
|
|
453
365
|
test_files: []
|
data/exe/bitcoinrb-cli
DELETED
data/exe/bitcoinrbd
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
require 'thor'
|
|
3
|
-
require 'bitcoin'
|
|
4
|
-
require 'daemon_spawn'
|
|
5
|
-
|
|
6
|
-
class BitcoinDaemon < DaemonSpawn::Base
|
|
7
|
-
|
|
8
|
-
def start(args)
|
|
9
|
-
puts "Bitcoinrb daemon start : #{Time.now}"
|
|
10
|
-
conf = Bitcoin::Node::Configuration.new(network: args.first[:network])
|
|
11
|
-
node = Bitcoin::Node::SPV.new(conf)
|
|
12
|
-
node.run
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def stop
|
|
16
|
-
puts "Stopping Bitcoinrb daemon : #{Time.now}"
|
|
17
|
-
node.shutdown
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
class Bitcoinrbd < Thor
|
|
23
|
-
|
|
24
|
-
class_option :network, aliases: '-n', default: :mainnet
|
|
25
|
-
|
|
26
|
-
desc 'start', 'start bitcoinrb daemon.'
|
|
27
|
-
def start
|
|
28
|
-
network = options['network'] ? options['network'].to_sym : :mainnet
|
|
29
|
-
Bitcoin.chain_params = network
|
|
30
|
-
FileUtils.mkdir_p(Bitcoin.base_dir)
|
|
31
|
-
execute_daemon(['start', network: network])
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
private
|
|
35
|
-
|
|
36
|
-
def execute_daemon(cmd_args)
|
|
37
|
-
BitcoinDaemon.spawn!({working_dir: Bitcoin.base_dir,
|
|
38
|
-
log_file: "#{Bitcoin.base_dir}/log/bitcoinrbd.log",
|
|
39
|
-
pid_file: "#{Bitcoin.base_dir}/bitcoinrbd.pid",
|
|
40
|
-
sync_log: true,
|
|
41
|
-
singleton: true}, cmd_args)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
Bitcoinrbd.start(ARGV)
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
module Bitcoin
|
|
2
|
-
|
|
3
|
-
module Network
|
|
4
|
-
|
|
5
|
-
# Basic Bitcoin P2P connection class
|
|
6
|
-
class Connection < EM::Connection
|
|
7
|
-
|
|
8
|
-
include MessageHandler
|
|
9
|
-
|
|
10
|
-
attr_reader :peer, :logger
|
|
11
|
-
|
|
12
|
-
# remote peer version.
|
|
13
|
-
attr_accessor :version
|
|
14
|
-
|
|
15
|
-
# if true, this peer send new block announcements using a headers message rather than an inv message.
|
|
16
|
-
attr_accessor :sendheaders
|
|
17
|
-
|
|
18
|
-
# minimum fee(in satoshis per kilobyte) for relay tx
|
|
19
|
-
attr_accessor :fee_rate
|
|
20
|
-
|
|
21
|
-
def initialize(peer)
|
|
22
|
-
@peer = peer
|
|
23
|
-
@logger = peer.logger
|
|
24
|
-
@sendheaders = false
|
|
25
|
-
@attr_accessor = 0
|
|
26
|
-
@message = ''
|
|
27
|
-
self.pending_connect_timeout = 5.0
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def post_init
|
|
31
|
-
logger.info "connected. #{addr}"
|
|
32
|
-
peer.conn_time = Time.now.to_i
|
|
33
|
-
begin_handshake
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# handle receiving data from remote node.
|
|
37
|
-
def receive_data(data)
|
|
38
|
-
handle(data)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def post_handshake
|
|
42
|
-
peer.post_handshake
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def addr
|
|
46
|
-
peer.addr
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# close network connection.
|
|
50
|
-
def close(msg = '')
|
|
51
|
-
logger.info "close connection with #{addr}. #{msg}"
|
|
52
|
-
close_connection_after_writing
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def handle_error(e)
|
|
56
|
-
peer.handle_error(e)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def unbind
|
|
60
|
-
logger.info "unbind. #{addr}"
|
|
61
|
-
peer.unbind
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
private
|
|
65
|
-
|
|
66
|
-
# start handshake
|
|
67
|
-
def begin_handshake
|
|
68
|
-
logger.info "begin handshake with #{addr}"
|
|
69
|
-
send_message(peer.local_version)
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
module Bitcoin
|
|
2
|
-
module Network
|
|
3
|
-
|
|
4
|
-
# P2P message handler used by peer connection class.
|
|
5
|
-
module MessageHandler
|
|
6
|
-
|
|
7
|
-
using Bitcoin::Ext::ObjectExt
|
|
8
|
-
|
|
9
|
-
# handle p2p message.
|
|
10
|
-
def handle(message)
|
|
11
|
-
peer.last_recv = Time.now.to_i
|
|
12
|
-
peer.bytes_recv += message.bytesize
|
|
13
|
-
begin
|
|
14
|
-
parse(message)
|
|
15
|
-
rescue Bitcoin::Message::Error => e
|
|
16
|
-
logger.error("invalid header magic. #{e.message}")
|
|
17
|
-
close
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def parse(message)
|
|
22
|
-
@message += message
|
|
23
|
-
command, payload, rest = parse_header
|
|
24
|
-
return unless command
|
|
25
|
-
|
|
26
|
-
defer_handle_command(command, payload)
|
|
27
|
-
@message = ""
|
|
28
|
-
parse(rest) if rest && rest.bytesize > 0
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def parse_header
|
|
32
|
-
head_magic = Bitcoin.chain_params.magic_head
|
|
33
|
-
return if @message.nil? || @message.size < MESSAGE_HEADER_SIZE
|
|
34
|
-
|
|
35
|
-
magic, command, length, checksum = @message.unpack('a4A12Va4')
|
|
36
|
-
raise Bitcoin::Message::Error, "invalid header magic. #{magic.bth}" unless magic.bth == head_magic
|
|
37
|
-
|
|
38
|
-
payload = @message[MESSAGE_HEADER_SIZE...(MESSAGE_HEADER_SIZE + length)]
|
|
39
|
-
return if payload.size < length
|
|
40
|
-
raise Bitcoin::Message::Error, "header checksum mismatch. #{checksum.bth}" unless Bitcoin.double_sha256(payload)[0...4] == checksum
|
|
41
|
-
|
|
42
|
-
rest = @message[(MESSAGE_HEADER_SIZE + length)..-1]
|
|
43
|
-
[command, payload, rest]
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# handle command with EM#defer
|
|
47
|
-
def defer_handle_command(command, payload)
|
|
48
|
-
operation = proc {handle_command(command, payload)}
|
|
49
|
-
callback = proc{|result|}
|
|
50
|
-
errback = proc{|e|
|
|
51
|
-
logger.error("error occurred. #{e.message}")
|
|
52
|
-
logger.error(e.backtrace)
|
|
53
|
-
peer.handle_error(e)
|
|
54
|
-
}
|
|
55
|
-
EM.defer(operation, callback, errback)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def handle_command(command, payload)
|
|
59
|
-
logger.info("[#{addr}] process command #{command}.")
|
|
60
|
-
case command
|
|
61
|
-
when Bitcoin::Message::Version::COMMAND
|
|
62
|
-
on_version(Bitcoin::Message::Version.parse_from_payload(payload))
|
|
63
|
-
when Bitcoin::Message::VerAck::COMMAND
|
|
64
|
-
on_ver_ack
|
|
65
|
-
when Bitcoin::Message::GetAddr::COMMAND
|
|
66
|
-
on_get_addr
|
|
67
|
-
when Bitcoin::Message::Addr::COMMAND
|
|
68
|
-
on_addr(Bitcoin::Message::Addr.parse_from_payload(payload))
|
|
69
|
-
when Bitcoin::Message::SendHeaders::COMMAND
|
|
70
|
-
on_send_headers
|
|
71
|
-
when Bitcoin::Message::FeeFilter::COMMAND
|
|
72
|
-
on_fee_filter(Bitcoin::Message::FeeFilter.parse_from_payload(payload))
|
|
73
|
-
when Bitcoin::Message::Ping::COMMAND
|
|
74
|
-
on_ping(Bitcoin::Message::Ping.parse_from_payload(payload))
|
|
75
|
-
when Bitcoin::Message::Pong::COMMAND
|
|
76
|
-
on_pong(Bitcoin::Message::Pong.parse_from_payload(payload))
|
|
77
|
-
when Bitcoin::Message::GetHeaders::COMMAND
|
|
78
|
-
on_get_headers(Bitcoin::Message::GetHeaders.parse_from_payload(payload))
|
|
79
|
-
when Bitcoin::Message::Headers::COMMAND
|
|
80
|
-
on_headers(Bitcoin::Message::Headers.parse_from_payload(payload))
|
|
81
|
-
when Bitcoin::Message::Block::COMMAND
|
|
82
|
-
on_block(Bitcoin::Message::Block.parse_from_payload(payload))
|
|
83
|
-
when Bitcoin::Message::Tx::COMMAND
|
|
84
|
-
on_tx(Bitcoin::Message::Tx.parse_from_payload(payload))
|
|
85
|
-
when Bitcoin::Message::NotFound::COMMAND
|
|
86
|
-
on_not_found(Bitcoin::Message::NotFound.parse_from_payload(payload))
|
|
87
|
-
when Bitcoin::Message::MemPool::COMMAND
|
|
88
|
-
on_mem_pool
|
|
89
|
-
when Bitcoin::Message::Reject::COMMAND
|
|
90
|
-
on_reject(Bitcoin::Message::Reject.parse_from_payload(payload))
|
|
91
|
-
when Bitcoin::Message::SendCmpct::COMMAND
|
|
92
|
-
on_send_cmpct(Bitcoin::Message::SendCmpct.parse_from_payload(payload))
|
|
93
|
-
when Bitcoin::Message::Inv::COMMAND
|
|
94
|
-
on_inv(Bitcoin::Message::Inv.parse_from_payload(payload))
|
|
95
|
-
when Bitcoin::Message::MerkleBlock::COMMAND
|
|
96
|
-
on_merkle_block(Bitcoin::Message::MerkleBlock.parse_from_payload(payload))
|
|
97
|
-
when Bitcoin::Message::CmpctBlock::COMMAND
|
|
98
|
-
on_cmpct_block(Bitcoin::Message::CmpctBlock.parse_from_payload(payload))
|
|
99
|
-
when Bitcoin::Message::GetData::COMMAND
|
|
100
|
-
on_get_data(Bitcoin::Message::GetData.parse_from_payload(payload))
|
|
101
|
-
else
|
|
102
|
-
logger.warn("unsupported command received. command: #{command}, payload: #{payload.bth}")
|
|
103
|
-
close("with command #{command}")
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def send_message(msg)
|
|
108
|
-
logger.info "send message #{msg.class::COMMAND}"
|
|
109
|
-
pkt = msg.to_pkt
|
|
110
|
-
peer.last_send = Time.now.to_i
|
|
111
|
-
peer.bytes_sent = pkt.bytesize
|
|
112
|
-
send_data(pkt)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def handshake_done
|
|
116
|
-
return unless @incomming_handshake && @outgoing_handshake
|
|
117
|
-
logger.info 'handshake finished.'
|
|
118
|
-
@connected = true
|
|
119
|
-
post_handshake
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def on_version(version)
|
|
123
|
-
logger.info("receive version message. #{version.build_json}")
|
|
124
|
-
@version = version
|
|
125
|
-
send_message(Bitcoin::Message::VerAck.new)
|
|
126
|
-
@incomming_handshake = true
|
|
127
|
-
handshake_done
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def on_ver_ack
|
|
131
|
-
logger.info('receive verack message.')
|
|
132
|
-
@outgoing_handshake = true
|
|
133
|
-
handshake_done
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
def on_get_addr
|
|
137
|
-
logger.info('receive getaddr message.')
|
|
138
|
-
peer.send_addrs
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def on_addr(addr)
|
|
142
|
-
logger.info("receive addr message. #{addr.build_json}")
|
|
143
|
-
# TODO
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def on_send_headers
|
|
147
|
-
logger.info('receive sendheaders message.')
|
|
148
|
-
@sendheaders = true
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
def on_fee_filter(fee_filter)
|
|
152
|
-
logger.info("receive feefilter message. #{fee_filter.build_json}")
|
|
153
|
-
@fee_rate = fee_filter.fee_rate
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def on_ping(ping)
|
|
157
|
-
logger.info("receive ping message. #{ping.build_json}")
|
|
158
|
-
send_message(ping.to_response)
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def on_pong(pong)
|
|
162
|
-
logger.info("receive pong message. #{pong.build_json}")
|
|
163
|
-
if pong.nonce == peer.last_ping_nonce
|
|
164
|
-
peer.last_ping_nonce = nil
|
|
165
|
-
peer.last_pong = Time.now.to_i
|
|
166
|
-
else
|
|
167
|
-
logger.debug "The remote peer sent the wrong nonce (#{pong.nonce})."
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
def on_get_headers(headers)
|
|
172
|
-
logger.info('receive getheaders message.')
|
|
173
|
-
# TODO
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
def on_headers(headers)
|
|
177
|
-
logger.info('receive headers message.')
|
|
178
|
-
peer.handle_headers(headers)
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
def on_block(block)
|
|
182
|
-
logger.info('receive block message.')
|
|
183
|
-
# TODO
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
def on_tx(tx)
|
|
187
|
-
logger.info("receive tx message. #{tx.build_json}")
|
|
188
|
-
peer.handle_tx(tx)
|
|
189
|
-
end
|
|
190
|
-
|
|
191
|
-
def on_not_found(not_found)
|
|
192
|
-
logger.info("receive notfound message. #{not_found.build_json}")
|
|
193
|
-
# TODO
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
def on_mem_pool
|
|
197
|
-
logger.info('receive mempool message.')
|
|
198
|
-
# TODO return mempool tx
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
def on_reject(reject)
|
|
202
|
-
logger.warn("receive reject message. #{reject.build_json}")
|
|
203
|
-
# TODO
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def on_send_cmpct(cmpct)
|
|
207
|
-
logger.info("receive sendcmpct message. #{cmpct.build_json}")
|
|
208
|
-
# TODO if mode is high and version is 1, relay block with cmpctblock message
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
def on_inv(inv)
|
|
212
|
-
logger.info('receive inv message.')
|
|
213
|
-
blocks = []
|
|
214
|
-
txs = []
|
|
215
|
-
inv.inventories.each do |i|
|
|
216
|
-
case i.identifier
|
|
217
|
-
when Bitcoin::Message::Inventory::MSG_TX
|
|
218
|
-
txs << i.hash
|
|
219
|
-
when Bitcoin::Message::Inventory::MSG_BLOCK
|
|
220
|
-
blocks << i.hash
|
|
221
|
-
else
|
|
222
|
-
logger.warn("[#{addr}] peer sent unknown inv type: #{i.identifier}")
|
|
223
|
-
end
|
|
224
|
-
end
|
|
225
|
-
logger.info("receive block= #{blocks.size}, txs: #{txs.size}")
|
|
226
|
-
peer.handle_block_inv(blocks) unless blocks.empty?
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
def on_merkle_block(merkle_block)
|
|
230
|
-
logger.info("receive merkle block message. #{merkle_block.build_json}")
|
|
231
|
-
peer.handle_merkle_block(merkle_block)
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
def on_cmpct_block(cmpct_block)
|
|
235
|
-
logger.info("receive cmpct_block message. #{cmpct_block.build_json}")
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
def on_get_data(get_data)
|
|
239
|
-
logger.info("receive get data message. #{get_data.build_json}")
|
|
240
|
-
end
|
|
241
|
-
end
|
|
242
|
-
end
|
|
243
|
-
end
|