溫馨提示×

溫馨提示×

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

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

怎么用EthMon.php監(jiān)聽以太坊代幣轉(zhuǎn)賬交易

發(fā)布時間:2021-10-23 09:26:24 來源:億速云 閱讀:350 作者:柒染 欄目:互聯(lián)網(wǎng)科技

怎么用EthMon.php監(jiān)聽以太坊代幣轉(zhuǎn)賬交易,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

EthMon開發(fā)包用于監(jiān)聽以太坊ERC20代幣合約的轉(zhuǎn)賬交易。

1、開發(fā)包概述

EthMon代幣交易監(jiān)聽開發(fā)包特點如下:

  • 監(jiān)聽以太坊合約日志中指定地址發(fā)生的代幣轉(zhuǎn)入/轉(zhuǎn)出交易

  • 自定義代幣交易發(fā)生時的業(yè)務(wù)邏輯

  • 即支持標(biāo)準(zhǔn)的Web3接口(例如Infura),也支持Etherscan非標(biāo)接口

EthMon運行于PHP 7.1+環(huán)境下,主要類以及其關(guān)系如下圖所示:

怎么用EthMon.php監(jiān)聽以太坊代幣轉(zhuǎn)賬交易

EthMon的主要代碼文件清單參見官方說明:http://sc.hubwiz.com/codebag/ethmon-php/

2、使用說明

在開始之前,請使用自己的API KEY替換以下文件的內(nèi)容

  • demo/etherscan-key

  • demo/infura-key

EthMon是開發(fā)包的入口類,調(diào)用其scanBlocks()方法可以掃描指定區(qū)間的以太坊區(qū)塊,提取并解析其中的合約日志,當(dāng)匹配監(jiān)聽的地址后,調(diào)用事件監(jiān)聽器(IEventListener接口實現(xiàn)對象)的handleEvent()方法并傳入解析后的事件對象。

2.1 IEventListener

調(diào)用者的程序需要在IeventListener接口的實現(xiàn)類中封裝自己的業(yè)務(wù)邏輯,例如寫入數(shù)據(jù)庫等等。下面的代碼實現(xiàn)了一個基本的事件監(jiān)聽器 —— 只是簡單地在屏幕顯示輸出事件對象的內(nèi)容:

class EzListener implements IEventListener{
  function handleEvent($event){
    var_dump($event);
  }
}

handleEvent()方法的參數(shù)是一個StdClass對象,結(jié)構(gòu)如下:

  • block:交易所在區(qū)塊號

  • txhash:交易哈希

  • contract:觸發(fā)事件的合約地址

  • name:事件名稱,例如:Transfer

  • flow:資金流向,可能值:inbound - 轉(zhuǎn)入 , outbound - 轉(zhuǎn)出

  • params:事件參數(shù)數(shù)組,成員依次為:

    • 轉(zhuǎn)出地址,字符串

    • 轉(zhuǎn)入地址,字符串

    • 代幣數(shù)量,BigInteger,可以調(diào)用toString()方法將其轉(zhuǎn)換為字符串

一旦定義好事件監(jiān)聽器,就可以按如下步驟設(shè)置并啟動監(jiān)聽:

2.2 創(chuàng)建EthMon對象

創(chuàng)建EthMon實例需要傳入一個EthApi對象,例如使用EthApiWeb3對象:

$ethApi = new EthApiWeb3('https://mainnet.infura.io/v3/<your-api-key>');
$em = new EthMon($ethApi);

2.3 設(shè)置要監(jiān)聽的代幣合約

創(chuàng)建了EthMon實例后,需要調(diào)用watchToken()方法設(shè)置要監(jiān)聽的代幣合約,例如監(jiān)聽BNB代幣合約:

$em->watchToken('0xb8c77482e45f1f44de1745f52c74426c631bdd52');

2.4 添加要監(jiān)聽的代幣交易相關(guān)地址

使用EthMon實例的watchAddress()方法添加要監(jiān)聽的代幣交易相關(guān)地址。例如下面的代碼監(jiān)聽地址0xd3705916ce7e2c43806e0e0707c4b9d6f27e9ab2收到代幣 的事件:

$em->watchAddress('0xd3705916ce7e2c43806e0e0707c4b9d6f27e9ab2',EthMon::FLOW_IN);

而下面的代碼監(jiān)聽地址0x6c6cbbb3ef3d690de7aa0525b5e6c2ffe7aed6a5轉(zhuǎn)出代幣的事件:

$em->watchAddress('0x6c6cbbb3ef3d690de7aa0525b5e6c2ffe7aed6a5',EthMon::FLOW_OUT);

當(dāng)希望監(jiān)聽一個地址的轉(zhuǎn)入/轉(zhuǎn)出代幣事件時,使用EthMon::FLOW_INOUT標(biāo)志:

$em->watchAddress('0xd3705916ce7e2c43806e0e0707c4b9d6f27e9ab2',EthMon::FLOW_INOUT);

2.5 添加事件監(jiān)聽器

調(diào)用EthMon實例的addEventListener()方法添加一個事件監(jiān)聽器對象,當(dāng)EthMon的scanBlocks()掃描區(qū)塊時,將在滿足條件時調(diào)用這些事件監(jiān)聽器。

例如,下面的代碼添加我們之前定義的EzListener類的實例對象:

$em->addEventListener(new EzListener);

2.6 掃描區(qū)塊鏈

需要周期性地調(diào)用EthMon的scanBlocks()方法來掃描區(qū)塊鏈以便跟蹤新的代幣交易日志,scanBlocks()的兩個參數(shù)分別用來指定掃描的起始區(qū)塊號和結(jié)束區(qū)塊號,當(dāng)使用特殊的latest字符串時,表示使用最新的區(qū)塊。

例如,下面的代碼每隔5秒鐘掃描一次最新的區(qū)塊:

while(true){
  $em->scanBlocks('latest','latest');
  sleep(5);
}

雖然起止區(qū)塊號都可以使用任意整數(shù)值,但由于Etherscan和Web3的返回記錄數(shù)量都有限制,因此不建議一次掃描多個區(qū)塊。例如下面的代碼試圖掃描從8500000到8500404的405個區(qū)塊:

$em->scanBlocks(8500000,8500404);    //不建議,可能失敗

建議逐塊掃描,同時考慮到第三方服務(wù)的訪問頻次限制,在兩次掃描期間進(jìn)行適當(dāng)?shù)难訒r處理。


看完上述內(nèi)容,你們掌握怎么用EthMon.php監(jiān)聽以太坊代幣轉(zhuǎn)賬交易的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

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

php
AI