UtxoScanner 開發包用于掃描監聽比特币區塊鍊的 UTXO,官方下載下傳位址: http://sc.hubwiz.com/codebag/btx-utxo-scanner/ 。
1、開發包概述
UtxoScanner開發包特點如下:
- 掃描監聽指定任意比特币位址的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.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配置檔案 |
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消費事件,附加字段如下:
官方下載下傳位址:
比特币UTXO跟蹤掃描PHP開發包 - 彙智網