EthMon開發包用于監聽以太坊ERC20代币合約的轉賬交易,官方下載下傳位址: http://sc.hubwiz.com/codebag/ethmon-php/。
1、開發包概述
EthMon代币交易監聽開發包特點如下:
- 監聽以太坊合約日志中指定位址發生的代币轉入/轉出交易
- 自定義代币交易發生時的業務邏輯
- 即支援标準的Web3接口(例如Infura),也支援Etherscan非标接口
EthMon運作于PHP 7.1+環境下,主要類以及其關系如下圖所示:

EthMon的主要代碼檔案清單參見官方說明:http://sc.hubwiz.com/codebag/ethmon-php/
2、使用說明
在開始之前,請使用自己的API KEY替換以下檔案的内容
- demo/etherscan-key
- demo/infura-key
EthMon是開發包的入口類,調用其
scanBlocks()
方法可以掃描指定區間的以太坊區塊,提取并解析其中的合約日志,當比對監聽的位址後,調用事件監聽器(IEventListener接口實作對象)的
handleEvent()
方法并傳入解析後的事件對象。
2.1 IEventListener
調用者的程式需要在IeventListener接口的實作類中封裝自己的業務邏輯,例如寫入資料庫等等。下面的代碼實作了一個基本的事件監聽器 —— 隻是簡單地在螢幕顯示輸出事件對象的内容:
class EzListener implements IEventListener{
function handleEvent($event){
var_dump($event);
}
}
複制
handleEvent()
方法的參數是一個StdClass對象,結構如下:
- block:交易所在區塊号
- txhash:交易哈希
- contract:觸發事件的合約位址
- name:事件名稱,例如:Transfer
- flow:資金流向,可能值:inbound - 轉入 , outbound - 轉出
- params:事件參數數組,成員依次為:
- 轉出位址,字元串
- 轉入位址,字元串
- 代币數量,BigInteger,可以調用
方法将其轉換為字元串toString()
一旦定義好事件監聽器,就可以按如下步驟設定并啟動監聽:
2.2 建立EthMon對象
建立EthMon執行個體需要傳入一個EthApi對象,例如使用EthApiWeb3對象:
$ethApi = new EthApiWeb3('https://mainnet.infura.io/v3/<your-api-key>');
$em = new EthMon($ethApi);
複制
2.3 設定要監聽的代币合約
建立了EthMon執行個體後,需要調用
watchToken()
方法設定要監聽的代币合約,例如監聽BNB代币合約:
$em->watchToken('0xb8c77482e45f1f44de1745f52c74426c631bdd52');
複制
2.4 添加要監聽的代币交易相關位址
使用EthMon執行個體的
watchAddress()
方法添加要監聽的代币交易相關位址。例如下面的代碼監聽位址
0xd3705916ce7e2c43806e0e0707c4b9d6f27e9ab2
收到代币 的事件:
$em->watchAddress('0xd3705916ce7e2c43806e0e0707c4b9d6f27e9ab2',EthMon::FLOW_IN);
複制
而下面的代碼監聽位址
0x6c6cbbb3ef3d690de7aa0525b5e6c2ffe7aed6a5
轉出代币的事件:
$em->watchAddress('0x6c6cbbb3ef3d690de7aa0525b5e6c2ffe7aed6a5',EthMon::FLOW_OUT);
複制
當希望監聽一個位址的轉入/轉出代币事件時,使用
EthMon::FLOW_INOUT
标志:
$em->watchAddress('0xd3705916ce7e2c43806e0e0707c4b9d6f27e9ab2',EthMon::FLOW_INOUT);
複制
2.5 添加事件監聽器
調用EthMon執行個體的
addEventListener()
方法添加一個事件監聽器對象,當EthMon的
scanBlocks()
掃描區塊時,将在滿足條件時調用這些事件監聽器。
例如,下面的代碼添加我們之前定義的EzListener類的執行個體對象:
$em->addEventListener(new EzListener);
複制
2.6 掃描區塊鍊
需要周期性地調用EthMon的
scanBlocks()
方法來掃描區塊鍊以便跟蹤新的代币交易日志,
scanBlocks()
的兩個參數分别用來指定掃描的起始區塊号和結束區塊号,當使用特殊的
latest
字元串時,表示使用最新的區塊。
例如,下面的代碼每隔5秒鐘掃描一次最新的區塊:
while(true){
$em->scanBlocks('latest','latest');
sleep(5);
}
複制
雖然起止區塊号都可以使用任意整數值,但由于Etherscan和Web3的傳回記錄數量都有限制,是以不建議一次掃描多個區塊。例如下面的代碼試圖掃描從8500000到8500404的405個區塊:
$em->scanBlocks(8500000,8500404); //不建議,可能失敗
複制
建議逐塊掃描,同時考慮到第三方服務的通路頻次限制,在兩次掃描期間進行适當的延時處理。
EthMon官方下載下傳位址:http://sc.hubwiz.com/codebag/ethmon-php/