天天看點

用EthMon.php監聽以太坊代币轉賬交易

EthMon開發包用于監聽以太坊ERC20代币合約的轉賬交易,官方下載下傳位址: http://sc.hubwiz.com/codebag/ethmon-php/。

1、開發包概述

EthMon代币交易監聽開發包特點如下:

  • 監聽以太坊合約日志中指定位址發生的代币轉入/轉出交易
  • 自定義代币交易發生時的業務邏輯
  • 即支援标準的Web3接口(例如Infura),也支援Etherscan非标接口

EthMon運作于PHP 7.1+環境下,主要類以及其關系如下圖所示:

用EthMon.php監聽以太坊代币轉賬交易

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/