溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP比特幣utxo跟蹤怎么實現(xiàn)

發(fā)布時間:2021-11-30 11:27:02 來源:億速云 閱讀:151 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“PHP比特幣utxo跟蹤怎么實現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PHP比特幣utxo跟蹤怎么實現(xiàn)”吧!

UtxoScanner 開發(fā)包用于掃描監(jiān)聽比特幣區(qū)塊鏈的 UTXO

1、開發(fā)包概述

UtxoScanner開發(fā)包特點如下:

  • 掃描監(jiān)聽指定任意比特幣地址的Utxo產(chǎn)生與消費事件

  • 本地管理Utxo,便于查詢、裸交易構(gòu)造和余額統(tǒng)計

  • 支持自定義Utxo事件發(fā)生時的業(yè)務邏輯

UtxoScanner運行于PHP 7.1+環(huán)境下,主要接口、類以及相互關系如下圖所示:

PHP比特幣utxo跟蹤怎么實現(xiàn)

UtxoScanner的主要代碼文件清單參見:http://sc.hubwiz.com/codebag/btx-utxo-scanner/

2、基本使用方法

UtxoScanner類是開發(fā)包的入口,調(diào)用其scan()方法就可以跟蹤指定地址(列表)的utxo。例如,下面的代碼創(chuàng)建一個UtxoScanner實例,并掃描最新區(qū)塊內(nèi)指定地址的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()方法返回本次掃描的統(tǒng)計信息對象,其結(jié)構(gòu)如下:

  • block:掃描的區(qū)塊總數(shù)

  • tx:掃描的交易總數(shù)

  • addEvents:本次掃描發(fā)現(xiàn)的新增UTXO總數(shù)

  • spendEvents:本次掃描發(fā)現(xiàn)的消費UTXO總數(shù)

scan()方法的原型如下:

function scan($addressList,$startBlockRef='latest',$endBlockRef='latest');

因此,在沒有指定后兩個參數(shù)時,scan()方法僅掃描最新的區(qū)塊。當需要掃描多個區(qū)塊時,可以指定起止區(qū)塊號。例如,下面的代碼掃描100~1000這901個區(qū)塊:

$stats = $scanner->scan($addressList,100,1000);

UtxoScanner實例會將掃描到的Utxo記錄到本地的sqlite3數(shù)據(jù)庫中,其路徑在創(chuàng)建UtxoStoreSqlite3實例時指定。你可以直接使用SQL訪問這個庫,也可以使用UtxoScanner開發(fā)包里的UtxoStoreSqlite3。例如,下面的代碼提取當前庫中所有可用的UTXO:

use BtcTool\UtxoStoreSqlite3;

$store = new UtxoStoreSqlite3('scanner.db');
$utxos = $store->fetch([]);
var_dump($utxos);

調(diào)用fetch()方法時可以傳入目標地址列表,這時將返回這些地址對應的可用UTXO集合。例如:

$addressList = [
  '1GMsiunopL5sZuTMaPbCjfwXdJEvC62KSG',
  '3LiJoKm5e3wLbkaAtZ2E15eEVvkQxG9Z7q'
];
$utxos = $store->fetch($addressList);

3、設置Utxo數(shù)據(jù)庫

UtxoScanner內(nèi)置了兩種Utxo數(shù)據(jù)庫:

  • UtxoStoreMemory:內(nèi)存庫

  • UtxoStoreSqlite3:使用Sqlite3

如果要使用其他方式存儲utxo,可以參考上述類的實現(xiàn)代碼進行擴展。

在創(chuàng)建UtxoScanner實例時,指定store參數(shù)為期望的IUtxoStore實例即可。例如,下面的代碼使用MySQL來保存UTXO(假設實現(xiàn)了相應的類):

use BtcTool\UtxoScanner;
use BtcTool\ChainRpc;
use BtcTool\UtxoStoreMySQL;

$scanner = new UtxoScanner(
    new ChainRpc('http://user:123456@127.0.0.1:8332'),
    new UtxoStoreMySQL(...)
  );

4、監(jiān)聽Utxo事件

使用UtxoScanner實例的addEventListener()方法,可以在utxo掃描器發(fā)現(xiàn)新的UTXO時,或者消費已有UTXO時得到通知,如果你需要在發(fā)生UTXO事件時進行額外的處理,可以使用這個方法。

首先需要定義一個實現(xiàn)IEventListener接口的監(jiān)聽類,只需要實現(xiàn)handleEvent()方法。例如,下面的代碼將在屏幕輸出每一個監(jiān)聽到的Utxo事件的內(nèi)容:

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()方法的參數(shù)$event是一個StdClass對象,它包括一個type字段,以及其他附加的字段。

type的值為add時,表明這是一個UTXO生成事件,附加字段如下:

  • utxo:Utxo對象,結(jié)構(gòu)如下:

    • txid:交易哈希

    • vout:交易輸出序號

    • value:交易數(shù)量,單位:btc

    • script:目標公鑰腳本

    • height:交易所在區(qū)塊的高度

type的值為spend時,表明這是一個UTXO消費事件,附加字段如下:

  • txid:交易哈希

  • vout:交易輸出序號

到此,相信大家對“PHP比特幣utxo跟蹤怎么實現(xiàn)”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI