您好,登錄后才能下訂單哦!
怎么用EthMon.php監(jiān)聽以太坊代幣轉(zhuǎn)賬交易,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
EthMon開發(fā)包用于監(jiān)聽以太坊ERC20代幣合約的轉(zhuǎn)賬交易。
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的主要代碼文件清單參見官方說明:http://sc.hubwiz.com/codebag/ethmon-php/
在開始之前,請使用自己的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()
方法并傳入解析后的事件對象。
調(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)聽:
創(chuàng)建EthMon實例需要傳入一個EthApi對象,例如使用EthApiWeb3對象:
$ethApi = new EthApiWeb3('https://mainnet.infura.io/v3/<your-api-key>'); $em = new EthMon($ethApi);
創(chuàng)建了EthMon實例后,需要調(diào)用watchToken()
方法設(shè)置要監(jiān)聽的代幣合約,例如監(jiān)聽BNB代幣合約:
$em->watchToken('0xb8c77482e45f1f44de1745f52c74426c631bdd52');
使用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);
調(diào)用EthMon實例的addEventListener()
方法添加一個事件監(jiān)聽器對象,當(dāng)EthMon的scanBlocks()
掃描區(qū)塊時,將在滿足條件時調(diào)用這些事件監(jiān)聽器。
例如,下面的代碼添加我們之前定義的EzListener類的實例對象:
$em->addEventListener(new EzListener);
需要周期性地調(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è)資訊頻道,感謝各位的閱讀!
免責(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)容。