mirror of https://github.com/GOSTSec/poolserver
Intel
11 years ago
16 changed files with 278 additions and 58 deletions
@ -0,0 +1,65 @@ |
|||||||
|
#ifndef STRATUM_CLIENT_H_ |
||||||
|
#define STRATUM_CLIENT_H_ |
||||||
|
|
||||||
|
#include "Common.h" |
||||||
|
#include "Log.h" |
||||||
|
#include "JSON.h" |
||||||
|
|
||||||
|
#include <boost/asio.hpp> |
||||||
|
#include <boost/bind.hpp> |
||||||
|
|
||||||
|
#define MAX_PACKET 2048 |
||||||
|
|
||||||
|
using namespace boost; |
||||||
|
using namespace boost::asio::ip; |
||||||
|
|
||||||
|
namespace Stratum |
||||||
|
{ |
||||||
|
class Client |
||||||
|
{ |
||||||
|
public: |
||||||
|
Client(asio::io_service& io_service) : _socket(io_service) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
tcp::socket& GetSocket() |
||||||
|
{ |
||||||
|
return _socket; |
||||||
|
} |
||||||
|
|
||||||
|
void Start() |
||||||
|
{ |
||||||
|
boost::asio::async_read_until( |
||||||
|
_socket, |
||||||
|
_recvBuffer, |
||||||
|
'\n', |
||||||
|
boost::bind(&Client::_OnReceive, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); |
||||||
|
} |
||||||
|
|
||||||
|
void SendMessage(JSON msg) |
||||||
|
{ |
||||||
|
std::string data = msg.ToString(); |
||||||
|
_socket.send(boost::asio::buffer(data.c_str(), data.length())); |
||||||
|
} |
||||||
|
|
||||||
|
void OnMessage(JSON msg) |
||||||
|
{ |
||||||
|
std::string method = msg.Get<std::string>("method"); |
||||||
|
sLog.Debug(LOG_SERVER, "Method: %s", method.c_str()); |
||||||
|
} |
||||||
|
public: |
||||||
|
void _OnReceive(const boost::system::error_code& error, size_t bytes_transferred) |
||||||
|
{ |
||||||
|
std::istream is(&_recvBuffer); |
||||||
|
std::stringstream iss; |
||||||
|
iss << is.rdbuf(); |
||||||
|
sLog.Debug(LOG_SERVER, "Received: %s", iss.str().c_str()); |
||||||
|
OnMessage(JSON::FromString(iss.str())); |
||||||
|
} |
||||||
|
private: |
||||||
|
asio::streambuf _recvBuffer; |
||||||
|
tcp::socket _socket; |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,122 @@ |
|||||||
|
#ifndef STRATUM_SERVER_H_ |
||||||
|
#define STRATUM_SERVER_H_ |
||||||
|
|
||||||
|
#include "Common.h" |
||||||
|
#include "Client.h" |
||||||
|
#include "Config.h" |
||||||
|
#include "Log.h" |
||||||
|
#include "JSON.h" |
||||||
|
#include "JSONRPC.h" |
||||||
|
|
||||||
|
#include <boost/asio.hpp> |
||||||
|
#include <boost/bind.hpp> |
||||||
|
#include <list> |
||||||
|
|
||||||
|
using namespace boost; |
||||||
|
using namespace boost::asio::ip; |
||||||
|
|
||||||
|
namespace Stratum |
||||||
|
{ |
||||||
|
struct ListenInfo |
||||||
|
{ |
||||||
|
std::string Host; |
||||||
|
uint16 Port; |
||||||
|
}; |
||||||
|
|
||||||
|
class Server |
||||||
|
{ |
||||||
|
public: |
||||||
|
Server(asio::io_service& io_service) : _io_service(io_service), _acceptor(io_service), _blockCheckTimer(io_service), _blockHeight(0) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
~Server() |
||||||
|
{ |
||||||
|
std::list<Client*>::iterator it; |
||||||
|
for (it = _clients.begin(); it != _clients.end(); ++it) |
||||||
|
delete *it; |
||||||
|
} |
||||||
|
|
||||||
|
void Start(tcp::endpoint endpoint) |
||||||
|
{ |
||||||
|
_CheckBlocks(); |
||||||
|
|
||||||
|
_acceptor.open(endpoint.protocol()); |
||||||
|
_acceptor.set_option(tcp::acceptor::reuse_address(true)); |
||||||
|
_acceptor.bind(endpoint); |
||||||
|
_acceptor.listen(); |
||||||
|
|
||||||
|
_StartAccept(); |
||||||
|
|
||||||
|
sLog.Debug(LOG_STRATUM, "Stratum server started"); |
||||||
|
} |
||||||
|
|
||||||
|
void SetBitcoinRPC(JSONRPC* bitcoinrpc) |
||||||
|
{ |
||||||
|
_bitcoinrpc = bitcoinrpc; |
||||||
|
} |
||||||
|
|
||||||
|
void SendToAll(JSON msg) |
||||||
|
{ |
||||||
|
std::list<Client*>::iterator it; |
||||||
|
for (it = _clients.begin(); it != _clients.end(); ++it) |
||||||
|
(*it)->SendMessage(msg); |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
void _StartAccept() |
||||||
|
{ |
||||||
|
Client* client = new Client(_io_service); |
||||||
|
|
||||||
|
_acceptor.async_accept(client->GetSocket(), boost::bind(&Server::_OnAccept, this, client, asio::placeholders::error)); |
||||||
|
} |
||||||
|
|
||||||
|
void _OnAccept(Client* client, const boost::system::error_code& error) |
||||||
|
{ |
||||||
|
if (!error) { |
||||||
|
sLog.Debug(LOG_STRATUM, "New stratum client accepted"); |
||||||
|
client->Start(); |
||||||
|
_clients.push_back(client); |
||||||
|
} else { |
||||||
|
sLog.Debug(LOG_STRATUM, "Failed to accept stratum client"); |
||||||
|
delete client; |
||||||
|
} |
||||||
|
|
||||||
|
_StartAccept(); |
||||||
|
} |
||||||
|
|
||||||
|
void _CheckBlocks() |
||||||
|
{ |
||||||
|
sLog.Debug(LOG_STRATUM, "Checking for new blocks..."); |
||||||
|
|
||||||
|
JSON response = _bitcoinrpc->Query("getinfo"); |
||||||
|
uint32 curBlock = response.Get<uint32>("blocks"); |
||||||
|
|
||||||
|
// Initializing server
|
||||||
|
if (_blockHeight == 0) { |
||||||
|
_blockHeight = curBlock; |
||||||
|
} else if (curBlock > _blockHeight) { |
||||||
|
sLog.Debug(LOG_STRATUM, "New block on network! Height: %u", curBlock); |
||||||
|
_blockHeight = curBlock; |
||||||
|
// do some crazy stuff
|
||||||
|
} |
||||||
|
|
||||||
|
_blockCheckTimer.expires_from_now(boost::posix_time::milliseconds(sConfig.Get<uint32>("StratumBlockCheckTime"))); |
||||||
|
_blockCheckTimer.async_wait(boost::bind(&Server::_CheckBlocks, this)); |
||||||
|
} |
||||||
|
private: |
||||||
|
// Network
|
||||||
|
std::list<Client*> _clients; |
||||||
|
asio::io_service& _io_service; |
||||||
|
tcp::acceptor _acceptor; |
||||||
|
|
||||||
|
// RPC
|
||||||
|
JSONRPC* _bitcoinrpc; |
||||||
|
|
||||||
|
// Bitcoin info
|
||||||
|
asio::deadline_timer _blockCheckTimer; |
||||||
|
uint32 _blockHeight; |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
#endif |
@ -1,11 +0,0 @@ |
|||||||
#ifndef BITCOINRPC_H_ |
|
||||||
#define BITCOINRPC_H_ |
|
||||||
|
|
||||||
#include "JSONRPC.h" |
|
||||||
|
|
||||||
class BitCoinRPC: public JSONRPC |
|
||||||
{ |
|
||||||
|
|
||||||
}; |
|
||||||
|
|
||||||
#endif |
|
@ -0,0 +1,40 @@ |
|||||||
|
#ifndef BITCOIN_H_ |
||||||
|
#define BITCOIN_H_ |
||||||
|
|
||||||
|
namespace Bitcoin |
||||||
|
{ |
||||||
|
class TxIn |
||||||
|
{ |
||||||
|
}; |
||||||
|
|
||||||
|
class TxOut |
||||||
|
{ |
||||||
|
}; |
||||||
|
|
||||||
|
class Transaction |
||||||
|
{ |
||||||
|
uint32 Version; |
||||||
|
std::vector<TxIn> in; |
||||||
|
std::vector<TxOut> out; |
||||||
|
uint32 LockTime; |
||||||
|
}; |
||||||
|
|
||||||
|
class BlockHeader |
||||||
|
{ |
||||||
|
uint32 Version; |
||||||
|
std::array<char, 32> PrevBlockHash; |
||||||
|
std::array<char, 32> MerkleRootHash; |
||||||
|
uint32 Time; |
||||||
|
uint32 Bits; |
||||||
|
uint32 Nonce; |
||||||
|
}; |
||||||
|
|
||||||
|
class Block : public BlockHeader |
||||||
|
{ |
||||||
|
std::vector<Transaction> tx; |
||||||
|
}; |
||||||
|
|
||||||
|
class BlockTemplate |
||||||
|
} |
||||||
|
|
||||||
|
#endif |
@ -1,6 +0,0 @@ |
|||||||
#include "Server.h" |
|
||||||
|
|
||||||
Stratum::Server::Server(std::string ip, uint32_t port) |
|
||||||
{ |
|
||||||
|
|
||||||
} |
|
@ -1,20 +0,0 @@ |
|||||||
#ifndef STRATUM_SERVER_H_ |
|
||||||
#define STRATUM_SERVER_H_ |
|
||||||
|
|
||||||
#include <boost/cstdint.hpp> |
|
||||||
#include <string> |
|
||||||
|
|
||||||
namespace Stratum |
|
||||||
{ |
|
||||||
class Server |
|
||||||
{ |
|
||||||
public: |
|
||||||
Server(std::string ip, uint32_t port); |
|
||||||
~Server(); |
|
||||||
|
|
||||||
private: |
|
||||||
|
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
#endif |
|
Loading…
Reference in new issue