UtxoScanner - 用php掃描btc utxo的開發包

UtxoScanner 開發包用於掃描監聽比特幣區塊鏈的 UTXO,官方下載地址:http://sc.hubwiz.com/codebag/btx-utxo-scanner/

1、開發包概述

UtxoScanner開發包特點如下:

  • 掃描監聽指定任意比特幣地址的Utxo產生與消費事件
  • 本地管理Utxo,便於查詢、裸交易構造和餘額統計
  • 支持自定義Utxo事件發生時的業務邏輯

UtxoScanner運行於PHP 7.1+環境下,主要接口、類以及相互關係如下圖所示:

UtxoScanner - 用php掃描btc utxo的開發包

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開發包 - 匯智網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章