cover

比特币UTXO扫描PHP开发包

汇智网 / hubwiz.com

扫描跟踪任意比特币地址的可用UTXO集合,支持UTXO事件监听。

1、开发包概述

UtxoScanner 开发包用于扫描监听比特币区块链的 UTXO,特点如下:

  • 扫描监听指定任意比特币地址的Utxo产生与消费事件
  • 本地管理Utxo,便于查询、裸交易构造和余额统计
  • 支持自定义Utxo事件发生时的业务逻辑

UtxoScanner运行于PHP 7.1+环境下,主要接口、类以及相互关系如下图所示:

UtxoScanner的主要代码文件清单如下:

文件路径说明
btc.php/src/UtxoScanner源代码目录
btc.php/src/UtxoScanner.php比特币Utxo扫描器实现类
btc.php/src/IChain.php比特币区块链访问接口
btc.php/src/ChainRpc.php基于RPC API的比特币区块链访问实现类
btc.php/src/IUtxoStore.phpUtxo数据库接口
btc.php/src/UtxoStoreMemory.phpUtxo数据库接口内存实现类
btc.php/src/UtxoStoreSqlite3.phpUtxo数据库接口Sqlite3实现类
btc.php/src/Utxo.phpUtxo封装类
btc.php/src/IEventListener.php事件监听器接口
btc.php/src/Utils.php辅助工具类
demo/UtxoScanner演示代码目录
demo/scanner-demo.phpUtxoScanner使用演示
demo/store-demo.phputxoStore使用演示
demo/rpc-demo.phpRpcClient使用演示
vendor/第三方依赖包
composer.jsoncomposer配置文件

2、基本使用方法

UtxoScanner类是开发包的入口,调用其scan()方法就可以跟踪指定地址(列表) 的utxo。例如,下面的代码创建一个UtxoScanner实例,并扫描最新区块内 指定地址的utxo:

use BtcTool\UtxoScanner;
use BtcTool\ChainRpc;
use BtcTool\UtxoStoreSqlite3;

$scanner = new UtxoScanner(
    new ChainRpc('http://user:123456@127.0.0.1:8332'),
    new UtxoStoreSqlite3('scanner.db')
  );
$addressList = ['1GMsiunopL5sZuTMaPbCjfwXdJEvC62KSG'];
$stats = $scanner->scan($addressList);

scan()方法返回本次扫描的统计信息对象,其结构如下:

  • block:扫描的区块总数
  • tx:扫描的交易总数
  • addEvents:本次扫描发现的新增UTXO总数
  • spendEvents:本次扫描发现的消费UTXO总数

scan()方法的原型如下:

function scan($addressList,$startBlockRef='latest',$endBlockRef='latest');

因此,在没有指定后两个参数时,scan()方法仅扫描最新的区块。当需要扫描多个 区块时,可以指定起止区块号。例如,下面的代码扫描100~1000这901个区块:

$stats = $scanner->scan($addressList,100,1000);

UtxoScanner实例会将扫描到的Utxo记录到本地的sqlite3数据库中,其路径在创建 UtxoStoreSqlite3实例时指定。你可以直接使用SQL访问这个库,也可以使用 UtxoScanner开发包里的UtxoStoreSqlite3。例如,下面的代码提取当前库中所有可用的UTXO:

use BtcTool\UtxoStoreSqlite3;

$store = new UtxoStoreSqlite3('scanner.db');
$utxos = $store->fetch([]);
var_dump($utxos);

调用fetch()方法时可以传入目标地址列表,这时将返回这些地址对应的 可用UTXO集合。例如:

$addressList = [
  '1GMsiunopL5sZuTMaPbCjfwXdJEvC62KSG',
  '3LiJoKm5e3wLbkaAtZ2E15eEVvkQxG9Z7q'
];
$utxos = $store->fetch($addressList);

3、设置Utxo数据库

UtxoScanner内置了两种Utxo数据库:

  • UtxoStoreMemory:内存库
  • UtxoStoreSqlite3:使用Sqlite3

如果要使用其他方式存储utxo,可以参考上述类的实现代码进行扩展。

在创建UtxoScanner实例时,指定store参数为期望的IUtxoStore实例即可。 例如,下面的代码使用MySQL来保存UTXO(假设实现了相应的类):

use BtcTool\UtxoScanner;
use BtcTool\ChainRpc;
use BtcTool\UtxoStoreMySQL;

$scanner = new UtxoScanner(
    new ChainRpc('http://user:123456@127.0.0.1:8332'),
    new UtxoStoreMySQL(...)
  );

4、监听Utxo事件

使用UtxoScanner实例的addEventListener()方法,可以在utxo扫描器 发现新的UTXO时,或者消费已有UTXO时得到通知,如果你需要在发生UTXO事件时 进行额外的处理,可以使用这个方法。

首先需要定义一个实现IEventListener接口的监听类,只需要实现handleEvent() 方法。例如,下面的代码将在屏幕输出每一个监听到的Utxo事件的内容:

use BtcTool\UtxoScanner;
use BtcTool\IEventListener;

$scanner = new UtxoScanner();
$scanner->addEventListener(new class implements IEventListener{
  function handleEvent($event){
    echo "event => " . $event->type . PHP_EOL;
    var_dump($event);
  }
});

handleEvent()方法的参数$event是一个StdClass对象,它包括 一个type字段,以及其他附加的字段。

type的值为add时,表明这是一个UTXO生成事件,附加字段如下:

  • utxo:Utxo对象,结构如下:
    • txid:交易哈希
    • vout:交易输出序号
    • value:交易数量,单位:btc
    • script:目标公钥脚本
    • height:交易所在区块的高度

type的值为spend时,表明这是一个UTXO消费事件,附加字段如下:

  • txid:交易哈希
  • vout:交易输出序号

声 明

本站所提供软件包仅用于学习和研究,请依法合规使用。

本站所提供软件包均提供完整源码,使用前请认真阅读源代码和文档以确保充分理解软件包的设计与功能实现,本站不承担 因不当使用本站所提供软件包而造成的任何法律风险或财产损失责任。

¥1500.00
查看授权信息
  • 付费成功自动开通下载
  • 三个月内代码免费升级
  • 专业人员在线技术支持
  • 支持按需定制(另付费)
下载代码包
版本发布日期地址
1.0.0 2019-11-3
下载最新版
QQ咨询
2860991437
9+