扫描跟踪任意比特币地址的可用UTXO集合,支持UTXO事件监听。
UtxoScanner 开发包用于扫描监听比特币区块链的 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.php | Utxo数据库接口 |
btc.php/src/UtxoStoreMemory.php | Utxo数据库接口内存实现类 |
btc.php/src/UtxoStoreSqlite3.php | Utxo数据库接口Sqlite3实现类 |
btc.php/src/Utxo.php | Utxo封装类 |
btc.php/src/IEventListener.php | 事件监听器接口 |
btc.php/src/Utils.php | 辅助工具类 |
demo/ | UtxoScanner演示代码目录 |
demo/scanner-demo.php | UtxoScanner使用演示 |
demo/store-demo.php | utxoStore使用演示 |
demo/rpc-demo.php | RpcClient使用演示 |
vendor/ | 第三方依赖包 |
composer.json | composer配置文件 |
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()
方法返回本次扫描的统计信息对象,其结构如下:
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);
UtxoScanner内置了两种Utxo数据库:
如果要使用其他方式存储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(...)
);
使用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生成事件,附加字段如下:
当type
的值为spend
时,表明这是一个UTXO消费事件,附加字段如下:
本站所提供软件包仅用于学习和研究,请依法合规使用。
本站所提供软件包均提供完整源码,使用前请认真阅读源代码和文档以确保充分理解软件包的设计与功能实现,本站不承担 因不当使用本站所提供软件包而造成的任何法律风险或财产损失责任。