UtxoScanner 開發包用於掃描監聽比特幣區塊鏈的 UTXO,官方下載地址:http://sc.hubwiz.com/codebag/btx-utxo-scanner/。
1、開發包概述
UtxoScanner開發包特點如下:
- 掃描監聽指定任意比特幣地址的Utxo產生與消費事件
- 本地管理Utxo,便於查詢、裸交易構造和餘額統計
- 支持自定義Utxo事件發生時的業務邏輯
UtxoScanner運行於PHP 7.1+環境下,主要接口、類以及相互關係如下圖所示:
UtxoScanner的主要代碼文件清單參見:http://sc.hubwiz.com/codebag/btx-utxo-scanner/
2、基本使用方法
UtxoScanner類是開發包的入口,調用其scan()
方法就可以跟蹤指定地址(列表)的utxo。例如,下面的代碼創建一個UtxoScanner實例,並掃描最新區塊內指定地址的utxo:
use BtcTool\UtxoScanner;
use BtcTool\ChainRpc;
use BtcTool\UtxoStoreSqlite3;
$scanner = new UtxoScanner(
new ChainRpc('http://user:[email protected]: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:[email protected]: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:交易輸出序號
官方下載地址:比特幣UTXO跟蹤掃描PHP開發包 - 匯智網