bitcoinrb 1.12.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/bitcoinrb.gemspec +1 -6
  4. data/lib/bitcoin/bip324/fs_chacha20.rb +3 -5
  5. data/lib/bitcoin/bip324/fs_chacha_poly1305.rb +19 -17
  6. data/lib/bitcoin/bip324.rb +1 -1
  7. data/lib/bitcoin/descriptor/expression.rb +2 -2
  8. data/lib/bitcoin/descriptor/sp.rb +219 -0
  9. data/lib/bitcoin/descriptor.rb +20 -0
  10. data/lib/bitcoin/ext_key.rb +3 -3
  11. data/lib/bitcoin/message/ping.rb +4 -2
  12. data/lib/bitcoin/message/version.rb +1 -1
  13. data/lib/bitcoin/message_sign.rb +98 -38
  14. data/lib/bitcoin/rpc.rb +0 -2
  15. data/lib/bitcoin/silent_payment/output.rb +46 -0
  16. data/lib/bitcoin/silent_payment.rb +113 -12
  17. data/lib/bitcoin/util.rb +2 -2
  18. data/lib/bitcoin/version.rb +1 -1
  19. data/lib/bitcoin.rb +0 -6
  20. metadata +18 -108
  21. data/exe/bitcoinrb-cli +0 -5
  22. data/exe/bitcoinrbd +0 -46
  23. data/lib/bitcoin/network/connection.rb +0 -73
  24. data/lib/bitcoin/network/message_handler.rb +0 -243
  25. data/lib/bitcoin/network/peer.rb +0 -228
  26. data/lib/bitcoin/network/peer_discovery.rb +0 -42
  27. data/lib/bitcoin/network/pool.rb +0 -135
  28. data/lib/bitcoin/network.rb +0 -13
  29. data/lib/bitcoin/node/cli.rb +0 -122
  30. data/lib/bitcoin/node/configuration.rb +0 -40
  31. data/lib/bitcoin/node/spv.rb +0 -87
  32. data/lib/bitcoin/node.rb +0 -7
  33. data/lib/bitcoin/rpc/http_server.rb +0 -84
  34. data/lib/bitcoin/rpc/request_handler.rb +0 -150
  35. data/lib/bitcoin/store/chain_entry.rb +0 -68
  36. data/lib/bitcoin/store/db/level_db.rb +0 -98
  37. data/lib/bitcoin/store/db.rb +0 -9
  38. data/lib/bitcoin/store/spv_chain.rb +0 -101
  39. data/lib/bitcoin/store/utxo_db.rb +0 -226
  40. data/lib/bitcoin/store.rb +0 -12
@@ -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
@@ -1,228 +0,0 @@
1
- module Bitcoin
2
- module Network
3
-
4
- # remote peer class.
5
- class Peer
6
-
7
- # Interval for pinging peers.
8
- PING_INTERVAL = 2 * 60
9
-
10
- attr_reader :logger
11
- attr_accessor :id
12
- attr_accessor :local_version
13
- attr_accessor :last_send
14
- attr_accessor :last_recv
15
- attr_accessor :bytes_sent
16
- attr_accessor :bytes_recv
17
- attr_accessor :conn_time
18
- attr_accessor :last_ping
19
- attr_accessor :last_ping_nonce
20
- attr_accessor :last_pong
21
- attr_accessor :min_ping
22
- attr_accessor :outbound # TODO need implements to accept inbound connection
23
- attr_accessor :best_hash
24
- attr_accessor :best_height
25
- # remote peer info
26
- attr_reader :host
27
- attr_reader :port
28
- # remote peer connection
29
- attr_accessor :conn
30
- attr_accessor :connected
31
- attr_accessor :primary
32
- # parent pool
33
- attr_reader :pool
34
- attr_reader :chain
35
- attr_accessor :fee_rate
36
-
37
- def initialize(host, port, pool, configuration)
38
- @host = host
39
- @port = port
40
- @pool = pool
41
- @chain = pool.chain
42
- @connected = false
43
- @primary = false
44
- @logger = Bitcoin::Logger.create(:debug)
45
- @outbound = true
46
- @best_hash = -1
47
- @best_height = -1
48
- @min_ping = -1
49
- @bytes_sent = 0
50
- @bytes_recv = 0
51
- @relay = configuration.conf[:relay]
52
- current_height = @chain.latest_block.height
53
- remote_addr = Bitcoin::Message::NetworkAddr.new(ip: host, port: port, time: nil)
54
- @local_version = Bitcoin::Message::Version.new(remote_addr: remote_addr, start_height: current_height, relay: @relay)
55
- end
56
-
57
- def connect
58
- self.conn ||= EM.connect(host, port, Bitcoin::Network::Connection, self)
59
- end
60
-
61
- def connected?
62
- @connected
63
- end
64
-
65
- def outbound?
66
- @outbound
67
- end
68
-
69
- def addr
70
- "#{host}:#{port}"
71
- end
72
-
73
- # calculate ping-pong time.
74
- def ping_time
75
- last_pong ? (last_pong - last_ping) / 1e6 : -1
76
- end
77
-
78
- # set last pong
79
- def last_pong=(time)
80
- @last_pong = time
81
- @min_ping = ping_time if min_ping == -1 || ping_time < min_ping
82
- end
83
-
84
- def post_handshake
85
- @connected = true
86
- if remote_version.support?(Bitcoin::Message::SERVICE_FLAGS[:bloom])
87
- pool.handle_new_peer(self)
88
- # require remote peer to use headers message instead fo inv message.
89
- conn.send_message(Bitcoin::Message::SendHeaders.new)
90
- EM.add_periodic_timer(PING_INTERVAL) {send_ping}
91
- else
92
- close("peer does not support NODE_BLOOM.")
93
- pool.pending_peers.delete(self)
94
- end
95
- end
96
-
97
- # start block header download
98
- def start_block_header_download
99
- logger.info("[#{addr}] start block header download.")
100
- get_headers = Bitcoin::Message::GetHeaders.new(
101
- Bitcoin.chain_params.protocol_version, [chain.latest_block.block_hash])
102
- conn.send_message(get_headers)
103
- end
104
-
105
- # broadcast tx.
106
- def broadcast_tx(tx)
107
- conn.send_message(Bitcoin::Message::Tx.new(tx, support_witness?))
108
- end
109
-
110
- # check the remote peer support witness.
111
- def support_witness?
112
- return false unless remote_version
113
- remote_version.services & Bitcoin::Message::SERVICE_FLAGS[:witness] > 0
114
- end
115
-
116
- # check the remote peer supports compact block.
117
- def support_cmpct?
118
- return false if remote_version.version < Bitcoin::Message::VERSION[:compact]
119
- return true unless local_version.services & Bitcoin::Message::SERVICE_FLAGS[:witness] > 0
120
- return false unless support_witness?
121
- remote_version.version >= Bitcoin::Message::VERSION[:compact_witness]
122
- end
123
-
124
- # get peer's block type.
125
- def block_type
126
- Bitcoin::Message::Inventory::MSG_FILTERED_BLOCK # TODO need other implementation
127
- end
128
-
129
- # get remote peer's version message.
130
- # @return [Bitcoin::Message::Version]
131
- def remote_version
132
- conn.version
133
- end
134
-
135
- # Whether to try and download blocks and transactions from this peer.
136
- def primary?
137
- primary
138
- end
139
-
140
- # handle headers message
141
- # @params [Bitcoin::Message::Headers]
142
- def handle_headers(headers)
143
- headers.headers.each do |header|
144
- break unless header.valid?
145
- entry = chain.append_header(header)
146
- next unless entry
147
- @best_hash = entry.block_hash
148
- @best_height = entry.height
149
- end
150
- pool.changed
151
- pool.notify_observers(:header, {hash: @best_hash, height: @best_height})
152
- start_block_header_download if headers.headers.size > 0 # next header download
153
- end
154
-
155
- # handle error
156
- def handle_error(e)
157
- pool.handle_error(e)
158
- end
159
-
160
- def unbind
161
- pool.handle_close_peer(self)
162
- end
163
-
164
- # close peer connection.
165
- def close(msg = '')
166
- conn.close(msg)
167
- end
168
-
169
- # generate Bitcoin::Message::NetworkAddr object from this peer info.
170
- # @return [Bitcoin::Message::NetworkAddr]
171
- def to_network_addr
172
- v = remote_version
173
- Bitcoin::Message::NetworkAddr.new(ip: host, port: port, services: v.services, time: v.timestamp)
174
- end
175
-
176
- # send +addr+ message to remote peer
177
- def send_addrs
178
- addrs = pool.peers.select{|p|p != self}.map(&:to_network_addr)
179
- conn.send_message(Bitcoin::Message::Addr.new(addrs))
180
- end
181
-
182
- # handle block inv message.
183
- def handle_block_inv(hashes)
184
- getdata = Bitcoin::Message::GetData.new(
185
- hashes.map{|h|Bitcoin::Message::Inventory.new(block_type, h)})
186
- conn.send_message(getdata)
187
- end
188
-
189
- def handle_tx(tx)
190
- pool.changed
191
- pool.notify_observers(:tx, tx)
192
- end
193
-
194
- def handle_merkle_block(merkle_block)
195
- pool.changed
196
- pool.notify_observers(:merkleblock, merkle_block)
197
- end
198
-
199
- # send ping message.
200
- def send_ping
201
- ping = Bitcoin::Message::Ping.new
202
- @last_ping = Time.now.to_i
203
- @last_pong = -1
204
- @last_ping_nonce = ping.nonce
205
- conn.send_message(ping)
206
- end
207
-
208
- # send filterload message.
209
- def send_filter_load(bloom)
210
- filter_load = Bitcoin::Message::FilterLoad.new(
211
- bloom, Bitcoin::Message::FilterLoad::BLOOM_UPDATE_ALL)
212
- conn.send_message(filter_load)
213
- end
214
-
215
- # send filteradd message.
216
- def send_filter_add(element)
217
- filter_add = Bitcoin::Message::FilterAdd.new(element)
218
- conn.send_message(filter_add)
219
- end
220
-
221
- # send filterclear message.
222
- def send_filter_clear
223
- filter_clear = Bitcoin::Message::FilterClear.new
224
- conn.send_message(filter_clear)
225
- end
226
- end
227
- end
228
- end
@@ -1,42 +0,0 @@
1
- module Bitcoin
2
- module Network
3
-
4
- class PeerDiscovery
5
-
6
- attr_reader :logger, :configuration
7
-
8
- def initialize(configuration)
9
- @logger = Bitcoin::Logger.create(:debug)
10
- @configuration = configuration
11
- end
12
-
13
- # get peer addresses, from DNS seeds.
14
- def peers
15
- # TODO add find from previous connected peer at first.
16
- (find_from_dns_seeds + seeds).uniq
17
- end
18
-
19
- private
20
-
21
- def dns_seeds
22
- Bitcoin.chain_params.dns_seeds || []
23
- end
24
-
25
- def seeds
26
- [*configuration.conf[:connect]]
27
- end
28
-
29
- def find_from_dns_seeds
30
- logger.debug 'discover peer address from DNS seeds.'
31
- dns_seeds.map { |seed|
32
- begin
33
- Socket.getaddrinfo("#{seed}", Bitcoin.chain_params.default_port).map{|a|a[2]}.uniq
34
- rescue SocketError => e
35
- logger.error "SocketError occurred when load DNS seed: #{seed}, error: #{e.message}"
36
- nil
37
- end
38
- }.flatten.compact
39
- end
40
- end
41
- end
42
- end
@@ -1,135 +0,0 @@
1
- module Bitcoin
2
-
3
- module Network
4
-
5
- # Time between pings automatically sent out for latency probing and keepalive (in seconds).
6
- PING_INTERVAL = 2 * 60
7
- # Time after which to disconnect, after waiting for a ping response (or inactivity).
8
- TIMEOUT_INTERVAL = 20 * 60
9
- # Maximum number of automatic outgoing nodes
10
- MAX_OUTBOUND_CONNECTIONS = 4
11
-
12
- # peer pool class.
13
- class Pool
14
- include Observable
15
-
16
- attr_reader :peers # active peers
17
- attr_reader :pending_peers # currently connecting peer
18
- attr_reader :node
19
- attr_reader :chain
20
- attr_reader :max_outbound
21
- attr_reader :logger
22
- attr_reader :peer_discovery
23
- attr_accessor :started
24
- attr_reader :mutex
25
-
26
- def initialize(node, chain, configuration)
27
- @node = node
28
- @peers = []
29
- @pending_peers = []
30
- @max_outbound = MAX_OUTBOUND_CONNECTIONS
31
- @chain = chain
32
- @logger = Bitcoin::Logger.create(:debug)
33
- @configuration = configuration
34
- @peer_discovery = PeerDiscovery.new(configuration)
35
- @started = false
36
- @mutex = Mutex.new
37
- end
38
-
39
- # connecting other peers and begin network activity.
40
- def start
41
- raise 'Cannot start a peer pool twice.' if started
42
- logger.debug 'Start connecting other pears.'
43
- addr_list = peer_discovery.peers
44
-
45
- connect(addr_list)
46
-
47
- @started = true
48
- end
49
-
50
- # detect new peer connection.
51
- def handle_new_peer(peer)
52
- logger.debug "connected new peer #{peer.addr}."
53
- mutex.synchronize do
54
- peer.id = allocate_peer_id
55
- unless peers.find(&:primary?)
56
- peer.primary = true
57
- peer.start_block_header_download
58
- end
59
- peers << peer
60
- end
61
- pending_peers.delete(peer)
62
- filter_load(peer) if node.wallet
63
- end
64
-
65
- def handle_close_peer(peer)
66
- return unless started
67
- peers.delete(peer)
68
- pending_peers.delete(peer)
69
- addr_list = peer_discovery.peers - peers.map(&:host) - pending_peers.map(&:host) - [peer.host]
70
- connect(addr_list)
71
- end
72
-
73
- # terminate peers.
74
- def terminate
75
- peers.each { |peer| peer.close('terminate') }
76
- pending_peers.each { |peer| peer.close('terminate') }
77
- @peers = []
78
- @started = false
79
- end
80
-
81
- # broadcast tx to connecting peer.
82
- def broadcast(tx)
83
- peers.each { |peer| peer.broadcast_tx(tx) }
84
- end
85
-
86
- # new bloom filter.
87
- def filter_load(peer)
88
- peer.send_filter_load(node.bloom)
89
- end
90
-
91
- # add element to bloom filter.
92
- def filter_add(element)
93
- peers.each { |peer| peer.send_filter_add(element) }
94
- end
95
-
96
- # clear bloom filter.
97
- def filter_clear
98
- peers.each { |peer| peer.send_filter_clear }
99
- end
100
-
101
- def handle_error(e)
102
- terminate
103
- end
104
-
105
- private
106
-
107
- # get primary peer
108
- def primary_peer
109
- peers.find(&:primary?)
110
- end
111
-
112
- # allocate new peer id
113
- def allocate_peer_id
114
- id = 0
115
- until peers.empty? || peers.find{|p|p.id == id}.nil?
116
- id += 1
117
- end
118
- id
119
- end
120
-
121
- def connect(addr_list)
122
- port = Bitcoin.chain_params.default_port
123
-
124
- EM::Iterator.new(addr_list, Bitcoin::PARALLEL_THREAD).each do |ip, iter|
125
- if pending_peers.size + peers.size < MAX_OUTBOUND_CONNECTIONS
126
- peer = Peer.new(ip, port, self, @configuration)
127
- pending_peers << peer
128
- peer.connect
129
- iter.next
130
- end
131
- end
132
- end
133
- end
134
- end
135
- end
@@ -1,13 +0,0 @@
1
- require 'eventmachine'
2
-
3
- module Bitcoin
4
- module Network
5
-
6
- autoload :MessageHandler, 'bitcoin/network/message_handler'
7
- autoload :Connection, 'bitcoin/network/connection'
8
- autoload :Pool, 'bitcoin/network/pool'
9
- autoload :Peer, 'bitcoin/network/peer'
10
- autoload :PeerDiscovery, 'bitcoin/network/peer_discovery'
11
-
12
- end
13
- end