EthMon開發包用於監聽以太坊ERC20代幣合約的轉帳交易,官方下載地址: http://sc.hubwiz.com/codebag/ethmon-php/。php
EthMon代幣交易監聽開發包特色以下:數據庫
EthMon運行於PHP 7.1+環境下,主要類以及其關係以下圖所示:api
EthMon的主要代碼文件清單參見官方說明:http://sc.hubwiz.com/codebag/ethmon-php/數組
在開始以前,請使用本身的API KEY替換如下文件的內容區塊鏈
- demo/etherscan-key
- demo/infura-key
EthMon是開發包的入口類,調用其scanBlocks()
方法能夠掃描指定區間的以太坊區塊,提取並解析其中的合約日誌,當匹配監聽的地址後,調用事件監聽器(IEventListener接口實現對象)的handleEvent()
方法並傳入解析後的事件對象。3d
調用者的程序須要在IeventListener接口的實現類中封裝本身的業務邏輯,例如寫入數據庫等等。下面的代碼實現了一個基本的事件監聽器 —— 只是簡單地在屏幕顯示輸出事件對象的內容:日誌
class EzListener implements IEventListener{ function handleEvent($event){ var_dump($event); } }
handleEvent()
方法的參數是一個StdClass對象,結構以下:code
toString()
方法將其轉換爲字符串一旦定義好事件監聽器,就能夠按以下步驟設置並啓動監聽:對象
建立EthMon實例須要傳入一個EthApi對象,例如使用EthApiWeb3對象:blog
$ethApi = new EthApiWeb3('https://mainnet.infura.io/v3/<your-api-key>'); $em = new EthMon($ethApi);
建立了EthMon實例後,須要調用watchToken()
方法設置要監聽的代幣合約,例如監聽BNB代幣合約:
$em->watchToken('0xb8c77482e45f1f44de1745f52c74426c631bdd52');
使用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);
調用EthMon實例的addEventListener()
方法添加一個事件監聽器對象,當EthMon的scanBlocks()
掃描區塊時,將在知足條件時調用這些事件監聽器。
例如,下面的代碼添加咱們以前定義的EzListener類的實例對象:
$em->addEventListener(new EzListener);
須要週期性地調用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/