bitwasp / stratum
用于与stratum服务器交互的库,用于为比特币挖矿和electrum客户端提供服务
Requires
- fguillot/json-rpc: ~1.0
- react/socket-client: ~0.5
Requires (Dev)
- bitwasp/testing-php: ~0.1
This package is auto-updated.
Last update: 2024-09-23 05:51:01 UTC
README
使用ReactPHP实现Stratum协议(用于electrum和挖矿)
客户端
Client类用于连接到主机。它需要一个ConnectorInterface
和一个RequestFactory
。
react/socket-client
提供了一些连接器,可以组合起来产生所需的功能。
use \BitWasp\Stratum\Client; use \BitWasp\Stratum\Connection; use \BitWasp\Stratum\Request\RequestFactory; $loop = \React\EventLoop\Factory::create(); $resolver = new \React\Dns\Resolver\Factory(); // Raw TCP, cannot perform DNS resolution $tcp = new \React\SocketClient\TcpConnector($loop); // TCP Connector with a DNS resolver $dns = new \React\SocketClient\DnsConnector($tcp, $resolver->create('8.8.8.8', $loop)); // Encrypted connection $context_options = []; $tls = new \React\SocketClient\SecureConnector($dns, $loop, $context_options); $requests = new RequestFactory; $client = new Client($tls, $requests); $host = ''; $port = ''; $client->connect($host, $port)->then(function (Connection $conn) { /* success */ }, function (\Exception $e) { /* error */ print_r($e->getMessage()); }); $loop->run();
SecureConnector启动TLS会话以加密您的连接。$context_options是一个可选值,但许多Electrum服务器配置了SSL证书!(CN字段不正确,或为自签名)这些证书在使用默认验证设置时不会被接受,可以通过更改$context_options来禁用。
$context_options = ["verify_name" => false, "allow_self_signed" => true];
连接
Connection
表示与对等方的连接。
可以使用Connection::request($method, $params = [])
向对等方发送请求,该方法返回一个表示待处理结果的Promise。当收到具有相同ID的响应时,Promise将解析为结果。
$conn->request('server.banner')->then(function (Response $response) { print_r($response->getResult()); }, function (\Exception $e) { echo $e->getMessage(); });
可以使用Connection::sendRequest(Request $request)
发送Request
实例,该方法也返回一个Promise。
有关electrum和挖矿客户端的方法列表,请参阅相应的Api类。常量是这些API的方法。
$conn->sendRequest(new Request(null, 'server.banner'))->then(function (Response $response) { print_r($response->getResult()); }, function (\Exception $e) { echo $e->getMessage(); });
可以使用Connection::sendNotify(NotificationInterface $note)
发送NotificationInterface
,通知不是请求,不会收到响应。此方法仅在从服务器端使用Connection
时相关。
$conn->sendNotification(new NumBlocksNotification(123123));
API
Stratum协议由electrum服务器和stratum挖矿池实现。它们的方法分别通过ElectrumClient
和MiningClient
暴露。
API方法会导致发送请求,并返回一个Promise来捕获结果。
use \BitWasp\Stratum\Api\ElectrumClient; use \BitWasp\Stratum\Client; use \BitWasp\Stratum\Connection; use \BitWasp\Stratum\Request\Response; use \BitWasp\Stratum\Request\RequestFactory; $loop = \React\EventLoop\Factory::create(); $tcp = new \React\SocketClient\TcpConnector($loop) ; $resolver = new \React\Dns\Resolver\Factory(); $dns = new \React\SocketClient\DnsConnector($tcp,$resolver->create('8.8.8.8', $loop)); $tls = new \React\SocketClient\SecureConnector($dns, $loop); $requests = new RequestFactory; $client = new Client($tls, $requests); $host = 'anduck.net'; $port = 50002; $client->connect($host, $port)->then(function (Connection $conn) { $electrum = new ElectrumClient($conn); $electrum->addressListUnspent('1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L')->then(function (Response $response) { print_r($response->getResult()); }); }, function (\Exception $e) { echo 'error'; echo $e->getMessage().PHP_EOL; /* error */ }); $loop->run();
事件
当接收到不是由请求发起的消息时,Connection
会发出一个message
事件。这些消息通常是订阅导致的。
以下事件由库在遇到时自动发出。事件名称是用于启用订阅的方法。
- 'blockchain.headers.subscribe'发出一个
HeadersNotification
- 'blockchain.address.subscribe'发出一个
AddressNotification
- 'blockchain.numblocks.subscribe'发出一个
NumBlocksNotification
- 'mining.subscribe'发出一个
MiningNotification
- 'mining.set_difficulty'发出一个
SetDifficultyNotification
use \BitWasp\Stratum\Api\ElectrumClient; use \BitWasp\Stratum\Client; use \BitWasp\Stratum\Connection; use \BitWasp\Stratum\Notification\AddressNotification; use \BitWasp\Stratum\Request\RequestFactory; $loop = React\EventLoop\Factory::create(); $tcp = new \React\SocketClient\TcpConnector($loop); $resolver = new \React\Dns\Resolver\Factory(); $dns = new \React\SocketClient\DnsConnector($tcp, $resolver->create('8.8.8.8', $loop)); $tls = new \React\SocketClient\SecureConnector($dns, $loop); $requests = new RequestFactory; $client = new Client($tls, $requests); $host = 'anduck.net'; $port = 50002; $client->connect($host, $port)->then(function (Connection $conn) { $conn->on('message', function ($message) { echo "Message received: ".PHP_EOL; print_r($message); }); $conn->on(ElectrumClient::ADDRESS_SUBSCRIBE, function (AddressNotification $address) { echo "Received address update\n"; }); $electrum = new ElectrumClient($conn); $electrum->subscribeAddress('1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L')->then(function () { echo "subscribed\n"; }); }, function (\Exception $e) { echo "ERROR: " . $e->getMessage().PHP_EOL; }); $loop->run();