天天看點

UtxoScanner - UTXO跟蹤監視php開發包

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