bitwasp/stratum

此包最新版本(v0.3.0)没有可用的许可信息。

用于与stratum服务器交互的库,用于为比特币挖矿和electrum客户端提供服务

v0.3.0 2016-05-18 01:41 UTC

This package is auto-updated.

Last update: 2024-09-23 05:51:01 UTC


README

Build Status Code Coverage Scrutinizer Code Quality

使用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挖矿池实现。它们的方法分别通过ElectrumClientMiningClient暴露。

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();

更多信息