em-bitcoin 0.01

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 536aed261caeaa49ca733e2bffb4b7dc985deaca
4
+ data.tar.gz: 8c42ad8cfa3df4c383cae0d74665ff5a4f6dfefd
5
+ SHA512:
6
+ metadata.gz: 2b93a8252b849a2f402cc5e13b1541ed79b94dd1890a7b7fd5e30e144402fbcae81ca64546a081395b5d1c92e0cd448107cad384cb36e3a8d5f281621dc17e04
7
+ data.tar.gz: ae4c80b187fe2dc0f2830c20cd5982571d74094696500088e0e289ccff4e3cf50e919bdb55f89bb79410cf1641a9d8c2dc7215417bb57d7a1851801654dbfc18
@@ -0,0 +1,18 @@
1
+ Copyright (c) 2016 David H. Hoover <dave.hoover@gmail.com>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to
5
+ deal in the Software without restriction, including without limitation the
6
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ sell copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16
+ THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,60 @@
1
+ # EM-Bitcoin
2
+
3
+ The [Bitcoin protocol](https://en.bitcoin.it/wiki/Protocol_documentation) implemented using Ruby's [EventMachine](https://github.com/eventmachine/eventmachine). Initially extracted from [bitcoin-ruby](https://github.com/lian/bitcoin-ruby).
4
+
5
+ ## Using `EventMachine::Bitcoin::Connection` to connect to the Bitcoin network
6
+
7
+ ```ruby
8
+ require 'em_bitcoin'
9
+ ```
10
+
11
+ ```ruby
12
+ gem 'em-bitcoin'
13
+ ```
14
+
15
+ Remember that you always need to start the EventMachine event loop. You can't just do this:
16
+
17
+ ```ruby
18
+ EventMachine::Bitcoin::Connection.connect_random_from_dns
19
+ ```
20
+
21
+ You'll need to do this:
22
+
23
+ ```ruby
24
+ EventMachine.run do
25
+ EventMachine::Bitcoin::Connection.connect_random_from_dns
26
+ end
27
+ ```
28
+
29
+ You can override the [EventMachine::Connection](http://www.rubydoc.info/github/eventmachine/eventmachine/EventMachine/Connection) methods to provide your application-specific logic. Such as:
30
+
31
+ ```ruby
32
+ class TxCounter < EventMachine::Bitcoin::Connection
33
+ def post_init
34
+ super
35
+ @tx_count = 0
36
+ end
37
+
38
+ def receive_data(data)
39
+ super
40
+ @tx_count += 1
41
+ end
42
+
43
+ def unbind
44
+ puts "Total transactions were: #{@tx_count}!"
45
+ end
46
+ end
47
+
48
+ EM.run { TxCounter.connect_random_from_dns }
49
+ ```
50
+
51
+ ## TODO
52
+
53
+ * Put lisence in gemspec
54
+ * Rework the integration points to both EM and the Bitcoin parser
55
+ * Write some tests
56
+ * Write some examples
57
+
58
+ ## License
59
+
60
+ Available here: [COPYING](COPYING.txt)
@@ -0,0 +1,19 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "em-bitcoin"
5
+ s.version = "0.01"
6
+ s.authors = ["redsquirrel"]
7
+ s.email = ["dave.hoover@gmail.com"]
8
+ s.summary = %q{Bitcoin Protocol using EventMachine}
9
+ s.description = %q{Combining Ruby's popular EventMachine library with the ruby-bitcoin implementation to provide an extensible connector to the Bitcoin network.}
10
+ s.homepage = "https://github.com/redsquirrel/em-bitcoin"
11
+
12
+ s.rubyforge_project = "em-bitcoin"
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.require_paths = ["lib"]
17
+
18
+ s.required_rubygems_version = ">= 1.3.6"
19
+ end
@@ -0,0 +1,113 @@
1
+ require 'eventmachine'
2
+ require 'bitcoin'
3
+ require 'resolv'
4
+
5
+ module EventMachine::Bitcoin
6
+ module ConnectionHandler
7
+ def on_inv_transaction(hash)
8
+ p ['inv transaction', hash.hth]
9
+ pkt = Bitcoin::Protocol.getdata_pkt(:tx, [hash])
10
+ send_data(pkt)
11
+ end
12
+
13
+ def on_inv_block(hash)
14
+ p ['inv block', hash.hth]
15
+ pkt = Bitcoin::Protocol.getdata_pkt(:block, [hash])
16
+ send_data(pkt)
17
+ end
18
+
19
+ def on_get_transaction(hash)
20
+ p ['get transaction', hash.hth]
21
+ end
22
+
23
+ def on_get_block(hash)
24
+ p ['get block', hash.hth]
25
+ end
26
+
27
+ def on_addr(addr)
28
+ p ['addr', addr, addr.alive?]
29
+ end
30
+
31
+ def on_tx(tx)
32
+ p ['tx', tx.hash]
33
+ end
34
+
35
+ def on_ping(nonce)
36
+ send_data(Bitcoin::Protocol.pong_pkt(nonce))
37
+ end
38
+
39
+ def on_block(block)
40
+ p ['block', block.hash]
41
+ end
42
+
43
+ def on_version(version)
44
+ p [@sockaddr, 'version', version, version.time - Time.now.to_i]
45
+ send_data(Bitcoin::Protocol.verack_pkt)
46
+ end
47
+
48
+ def on_verack
49
+ on_handshake_complete
50
+ end
51
+
52
+ def on_handshake_complete
53
+ p [@sockaddr, 'handshake complete']
54
+ @connected = true
55
+
56
+ query_blocks
57
+ end
58
+
59
+ def query_blocks
60
+ start = ("\x00"*32)
61
+ stop = ("\x00"*32)
62
+ pkt = Bitcoin::Protocol.pkt("getblocks", "\x00" + start + stop )
63
+ send_data(pkt)
64
+ end
65
+
66
+ def on_handshake_begin
67
+ pkt = Bitcoin::Protocol::Version.new(
68
+ from: "127.0.0.1:8333",
69
+ to: @sockaddr.join(":"),
70
+ ).to_pkt
71
+ p ['sending version pkt', pkt]
72
+ send_data(pkt)
73
+ end
74
+ end
75
+
76
+
77
+ class Connection < EM::Connection
78
+ include ConnectionHandler
79
+
80
+ def initialize(host, port)
81
+ @sockaddr = [host, port]
82
+ @parser = Bitcoin::Protocol::Parser.new( self )
83
+ end
84
+
85
+ def post_init
86
+ p ['connected', @sockaddr]
87
+ EM.schedule{ on_handshake_begin }
88
+ end
89
+
90
+ def receive_data(data)
91
+ @parser.parse(data)
92
+ end
93
+
94
+ def unbind
95
+ p ['disconnected', @sockaddr]
96
+ self.class.connect_random_from_dns
97
+ end
98
+
99
+ def self.connect(host, port)
100
+ EM.connect(host, port, self, host, port)
101
+ end
102
+
103
+ def self.connect_random_from_dns
104
+ seeds = Bitcoin.network[:dns_seeds]
105
+ if seeds.any?
106
+ host = Resolv::DNS.new.getaddresses(seeds.sample).map {|a| a.to_s}.sample
107
+ connect(host, Bitcoin::network[:default_port])
108
+ else
109
+ raise "No DNS seeds available. Provide IP, configure seeds, or use different network."
110
+ end
111
+ end
112
+ end
113
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: em-bitcoin
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.01'
5
+ platform: ruby
6
+ authors:
7
+ - redsquirrel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-08 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Combining Ruby's popular EventMachine library with the ruby-bitcoin implementation
14
+ to provide an extensible connector to the Bitcoin network.
15
+ email:
16
+ - dave.hoover@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - COPYING.txt
22
+ - README.md
23
+ - em-bitcoin.gemspec
24
+ - lib/em_bitcoin.rb
25
+ homepage: https://github.com/redsquirrel/em-bitcoin
26
+ licenses: []
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 1.3.6
42
+ requirements: []
43
+ rubyforge_project: em-bitcoin
44
+ rubygems_version: 2.4.5.1
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Bitcoin Protocol using EventMachine
48
+ test_files: []