Skeletor of integrating em-bitcoin with sharpcoin.
The server process actually runs now(!) - although it does nothing useful.
This commit is contained in:
@@ -1,5 +1,2 @@
|
|||||||
require 'sharp-coin/config'
|
|
||||||
require 'sharp-coin/db'
|
|
||||||
require 'sharp-coin/logging'
|
|
||||||
require 'sharp-coin/server'
|
require 'sharp-coin/server'
|
||||||
require 'sharp-coin/interface'
|
|
||||||
|
@@ -45,8 +45,20 @@ module SharpCoin
|
|||||||
[telnet_host, telnet_port]
|
[telnet_host, telnet_port]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def bitcoin_host
|
||||||
|
"localhost"
|
||||||
|
end
|
||||||
|
|
||||||
|
def bitcoin_port
|
||||||
|
8333
|
||||||
|
end
|
||||||
|
|
||||||
|
def bitcoin_bind
|
||||||
|
[bitcoin_host, bitcoin_port]
|
||||||
|
end
|
||||||
|
|
||||||
def db_settings
|
def db_settings
|
||||||
{ :adapter => 'sqlite', :database => 'sharp-coin.sqlite' }
|
{ :adapter => 'sqlite3', :database => 'sharp-coin.sqlite' }
|
||||||
end
|
end
|
||||||
|
|
||||||
def db_automigrate?
|
def db_automigrate?
|
||||||
|
@@ -1,3 +1,6 @@
|
|||||||
|
require 'sharp-coin/logging'
|
||||||
|
require 'sharp-coin/config'
|
||||||
|
|
||||||
begin
|
begin
|
||||||
require 'active_record'
|
require 'active_record'
|
||||||
rescue LoadError => err
|
rescue LoadError => err
|
||||||
@@ -5,23 +8,23 @@ rescue LoadError => err
|
|||||||
retry
|
retry
|
||||||
end
|
end
|
||||||
|
|
||||||
|
require 'sqlite3'
|
||||||
|
|
||||||
module SharpCoin
|
module SharpCoin
|
||||||
module DB
|
module DB
|
||||||
include Logging
|
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def setup!
|
def setup!(logger, config = SharpCoin::Config::db_settings)
|
||||||
ActiveRecord::Base.logger = logger
|
ActiveRecord::Base.logger = logger
|
||||||
ActiveRecord::Base.include_root_in_json = false
|
ActiveRecord::Base.include_root_in_json = false
|
||||||
|
|
||||||
ActiveRecord::Base.establish_connection(Config::db_settings)
|
ActiveRecord::Base.establish_connection(config)
|
||||||
|
|
||||||
if Config::db_automigrate?
|
if Config::db_automigrate?
|
||||||
log(:info, "Performing automigration")
|
logger.info("Performing automigration")
|
||||||
ActiveRecord::Migration.verbose = false
|
ActiveRecord::Migration.verbose = false
|
||||||
ActiveRecord::Migrator.migrate(File.join(File.dirname(__FILE__), 'db', 'migrations'))
|
ActiveRecord::Migrator.migrate(File.join(File.dirname(__FILE__), 'db', 'migrations'))
|
||||||
end
|
end
|
||||||
tup!
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
require 'sharp-coin/interface/bitcoin'
|
||||||
require 'sharp-coin/interface/json-rpc'
|
require 'sharp-coin/interface/json-rpc'
|
||||||
require 'sharp-coin/interface/rest'
|
require 'sharp-coin/interface/rest'
|
||||||
require 'sharp-coin/interface/telnet'
|
require 'sharp-coin/interface/telnet'
|
||||||
|
@@ -1,9 +1,53 @@
|
|||||||
|
require 'em-bitcoin'
|
||||||
|
|
||||||
|
require 'sharp-coin/interface/bitcoin/client_actor'
|
||||||
|
require 'sharp-coin/interface/bitcoin/server_actor'
|
||||||
|
|
||||||
module SharpCoin
|
module SharpCoin
|
||||||
module Interface
|
module Interface
|
||||||
# Handle communications with other BitCoin peers. We rely on
|
|
||||||
# EM::P::BitcoinPeer for much of the heavy lifting.
|
# This is a connection pool for a BitCoin node.
|
||||||
|
# Responsibilities are accepting incoming connections and making outgoing
|
||||||
|
# connections to keep up to date with the block chain and propagate user
|
||||||
|
# transactions.
|
||||||
|
#
|
||||||
# @author Nick Thomas <nick@lupine.me.uk>
|
# @author Nick Thomas <nick@lupine.me.uk>
|
||||||
class Bitcoin
|
class Bitcoin
|
||||||
|
class Connection < Struct.new(:sig, :actor)
|
||||||
|
end
|
||||||
|
|
||||||
|
attr_reader :em, :config, :nonce, :server, :connections
|
||||||
|
|
||||||
|
def self.run(*args)
|
||||||
|
s = new(*args)
|
||||||
|
s.run
|
||||||
|
s
|
||||||
|
end
|
||||||
|
|
||||||
|
# @param[Module] em EventMachine module
|
||||||
|
# @param[SharpCoin::Config] configuration settings
|
||||||
|
def initialize(em, config)
|
||||||
|
@em = em
|
||||||
|
@config = config
|
||||||
|
@nonce = rand(2**32)
|
||||||
|
@clients = []
|
||||||
|
end
|
||||||
|
|
||||||
|
def run
|
||||||
|
actor = ServerActor.new(self, config)
|
||||||
|
sig = em.start_server(
|
||||||
|
config.bitcoin_host, config.bitcoin_port, EM::P::BitcoinServer,
|
||||||
|
lambda { ServerActor.new(self, config) }
|
||||||
|
)
|
||||||
|
@server = Connection.new(sig, actor)
|
||||||
|
end
|
||||||
|
|
||||||
|
def stop
|
||||||
|
em.stop_server(@server.sig)
|
||||||
|
@connections.each {|client| em.close_connection(client.sig) }
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
18
lib/sharp-coin/interface/bitcoin/client_actor.rb
Normal file
18
lib/sharp-coin/interface/bitcoin/client_actor.rb
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
module SharpCoin ; module Interface ; class Bitcoin
|
||||||
|
|
||||||
|
# This actor mediates between SharpCoin & other bitcoin nodes when SharpCoin
|
||||||
|
# is acting as a client.
|
||||||
|
#
|
||||||
|
# @author Nick Thomas <nick@lupine.me.uk>
|
||||||
|
class ClientActor
|
||||||
|
attr_reader :node, :config
|
||||||
|
|
||||||
|
# @param[SharpCoin::BTC::Node] node this actor is working for
|
||||||
|
# @param[SharpCoin::Config] config object
|
||||||
|
def initialize(node, config)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end ; end ; end
|
||||||
|
|
18
lib/sharp-coin/interface/bitcoin/server_actor.rb
Normal file
18
lib/sharp-coin/interface/bitcoin/server_actor.rb
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
module SharpCoin ; module Interface ; class Bitcoin
|
||||||
|
|
||||||
|
# This actor mediates between SharpCoin & other bitcoin nodes when SharpCoin
|
||||||
|
# is acting as a server.
|
||||||
|
#
|
||||||
|
# @author Nick Thomas <nick@lupine.me.uk>
|
||||||
|
class ServerActor
|
||||||
|
attr_reader :node, :config
|
||||||
|
|
||||||
|
# @param[SharpCoin::BTC::Node] node this actor is working for
|
||||||
|
# @param[SharpCoin::Config] config object
|
||||||
|
def initialize(node, config)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end ; end ; end
|
||||||
|
|
@@ -1,8 +1,11 @@
|
|||||||
require 'eventmachine'
|
require 'eventmachine'
|
||||||
require 'thin'
|
require 'thin'
|
||||||
|
|
||||||
|
require 'sharp-coin/logging'
|
||||||
|
require 'sharp-coin/config'
|
||||||
require 'sharp-coin/db'
|
require 'sharp-coin/db'
|
||||||
require 'sharp-coin/interface'
|
require 'sharp-coin/interface'
|
||||||
|
|
||||||
module SharpCoin
|
module SharpCoin
|
||||||
# Beating heart of the SharpCoin application. Sets up all the components
|
# Beating heart of the SharpCoin application. Sets up all the components
|
||||||
# according to the config, handles all the events as needed.
|
# according to the config, handles all the events as needed.
|
||||||
@@ -14,9 +17,9 @@ module SharpCoin
|
|||||||
# of SharpCoin to produce a working application.
|
# of SharpCoin to produce a working application.
|
||||||
# @param[
|
# @param[
|
||||||
def initialize
|
def initialize
|
||||||
DB::setup!
|
DB::setup!(logger)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Start the various services off. This should generally be called inside an
|
# Start the various services off. This should generally be called inside an
|
||||||
# EM::run { ... } block
|
# EM::run { ... } block
|
||||||
def run
|
def run
|
||||||
@@ -30,12 +33,7 @@ module SharpCoin
|
|||||||
Interface::Telnet
|
Interface::Telnet
|
||||||
)
|
)
|
||||||
|
|
||||||
@bitcoin_server = EM::start_server(
|
@bitcoin_node = Interface::Bitcoin.run(EM, Config)
|
||||||
Config::bitcoin_server_host,
|
|
||||||
Config::bitcoin_server_port,
|
|
||||||
EM::P::BitcoinServer,
|
|
||||||
Config
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# @return[Boolean] Is this server instance currently running?
|
# @return[Boolean] Is this server instance currently running?
|
||||||
@@ -45,10 +43,11 @@ module SharpCoin
|
|||||||
|
|
||||||
# Stop the various services.
|
# Stop the various services.
|
||||||
def stop
|
def stop
|
||||||
@bitcoin_server.stop
|
@bitcoin_node.stop
|
||||||
@http_server.stop
|
EM::stop_server(@http_server)
|
||||||
@telnet_server.stop
|
EM::stop_server(@telnet_server)
|
||||||
@running = false
|
@running = false
|
||||||
|
EM::stop
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user