# 怎么用EthMon.php監聽以太坊代幣轉賬交易
## 前言
以太坊作為全球領先的智能合約平臺,每天處理數百萬筆代幣轉賬交易。對于開發者、數據分析師或區塊鏈愛好者而言,實時監聽這些交易具有重要價值。本文將詳細介紹如何使用開源PHP腳本EthMon.php構建高效的代幣交易監聽系統。
## 一、EthMon.php簡介
### 1.1 工具概述
EthMon.php是一個輕量級PHP庫,專為監聽以太坊區塊鏈事件設計,具有以下特性:
- 支持ERC20/ERC721代幣標準
- 基于JSON-RPC與節點通信
- 可配置的交易過濾機制
- 低資源占用的輪詢架構
### 1.2 工作原理
```php
// 典型工作流程示例
while(true) {
$latestBlock = $eth->blockNumber();
$transactions = $eth->getBlockTransactions($latestBlock);
processTransactions($transactions);
sleep(5); // 控制查詢頻率
}
composer require web3p/web3.php guzzlehttp/guzzle
// config.php
return [
'rpc_url' => 'https://mainnet.infura.io/v3/YOUR_API_KEY',
'ws_url' => 'wss://mainnet.infura.io/ws/v3/YOUR_API_KEY',
'scan_step' => 50 // 每次掃描的區塊數量
];
require 'vendor/autoload.php';
use Web3\Web3;
use Web3\Providers\HttpProvider;
$web3 = new Web3(new HttpProvider($config['rpc_url']));
$eth = $web3->eth;
通過ERC20標準接口檢測合約:
// ERC20標準接口
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
對應的PHP檢測代碼:
function isERC20Contract($address) {
$abi = json_decode(file_get_contents('erc20.abi'), true);
$contract = new Contract($web3->provider, $abi);
$result = null;
$contract->call('totalSupply', function($err, $ret) use (&$result){
$result = !$err;
});
return $result;
}
關鍵字段處理邏輯:
function parseTransferLog($log) {
$topics = $log['topics'];
return [
'from' => '0x'.substr($topics[1], 26),
'to' => '0x'.substr($topics[2], 26),
'value' => hexdec($log['data']),
'txHash' => $log['transactionHash'],
'tokenAddress' => $log['address']
];
}
優化掃描性能的方案:
1. 增量掃描:記錄最后處理的區塊號
2. 批量獲取:使用eth_getBlockRange
3. 錯誤重試:指數退避機制
function scanBlocks($from, $to) {
$params = [];
for($i=$from; $i<=$to; $i++) {
$params[] = '0x'.dechex($i);
}
$batch = new \Web3\RequestManagers\RequestBatch();
foreach($params as $blockNum) {
$batch->add($eth->request('eth_getBlockByNumber', [$blockNum, true]));
}
return $batch->execute();
}
創建特定代幣的過濾器:
$filter = $web3->eth->filter([
'fromBlock' => 'latest',
'topics' => [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
]
]);
MySQL存儲方案示例:
CREATE TABLE token_transfers (
id BIGINT AUTO_INCREMENT,
tx_hash VARCHAR(66) NOT NULL,
block_number INT NOT NULL,
token_address VARCHAR(42) NOT NULL,
from_address VARCHAR(42) NOT NULL,
to_address VARCHAR(42) NOT NULL,
value DECIMAL(65,18) NOT NULL,
PRIMARY KEY (id),
INDEX (tx_hash),
INDEX (token_address)
);
PHP存儲實現:
function saveTransfer($transfer) {
$stmt = $pdo->prepare("INSERT INTO token_transfers VALUES (...)");
$stmt->execute([
$transfer['txHash'],
hexdec($transfer['blockNumber']),
$transfer['tokenAddress'],
$transfer['from'],
$transfer['to'],
$transfer['value']
]);
}
Telegram通知示例:
function sendTelegramAlert($transfer) {
$message = sprintf("New transfer detected:\nToken: %s\nFrom: %s\nTo: %s\nAmount: %s",
substr($transfer['tokenAddress'], 0, 8),
substr($transfer['from'], 0, 8),
substr($transfer['to'], 0, 8),
$transfer['value']
);
file_get_contents("https://api.telegram.org/botTOKEN/sendMessage?".
http_build_query(['chat_id'=>CHAT_ID, 'text'=>$message]));
}
使用ReactPHP實現異步:
$loop = React\EventLoop\Factory::create();
$loop->addPeriodicTimer(5, function() use ($eth) {
// 異步處理邏輯
});
$loop->run();
多節點輪詢方案:
$providers = [
new HttpProvider('https://node1.example'),
new HttpProvider('https://node2.example')
];
$currentProvider = 0;
function getProvider() {
global $currentProvider, $providers;
return $providers[($currentProvider++ % count($providers))];
}
try {
$block = $eth->getBlock('latest');
} catch (\Exception $e) {
logError($e->getMessage());
if(strpos($e->getMessage(), 'timeout') !== false) {
sleep(10); // 超時等待
}
}
#!/bin/bash
if ! ps aux | grep "EthMon.php" | grep -v grep; then
php EthMon.php >> monitor.log &
fi
<?php
require 'vendor/autoload.php';
require 'config.php';
class TokenMonitor {
private $web3;
private $pdo;
public function __construct() {
$this->web3 = new Web3(new HttpProvider($GLOBALS['config']['rpc_url']));
$this->pdo = new PDO('mysql:host=localhost;dbname=eth', 'user', 'pass');
}
public function run() {
$lastBlock = $this->getLastProcessedBlock();
while(true) {
$current = hexdec($this->web3->eth->blockNumber());
if($current <= $lastBlock) {
sleep(5);
continue;
}
$this->processBlocks($lastBlock+1, $current);
$lastBlock = $current;
}
}
protected function processBlocks($from, $to) {
// 實現區塊處理邏輯
}
}
$monitor = new TokenMonitor();
$monitor->run();
設置閾值報警:
if($transfer['value'] > 1000000) { // 100萬代幣
triggerAlert($transfer);
}
監控跨交易所價差:
function checkArbitrage($transfer) {
$priceA = getExchangePrice('binance', $transfer['tokenAddress']);
$priceB = getExchangePrice('ftx', $transfer['tokenAddress']);
return abs($priceA - $priceB) > $threshold;
}
通過EthMon.php構建的代幣監控系統,開發者可以靈活定制各種區塊鏈數據分析應用。建議進一步探索: 1. 與The Graph等索引服務結合 2. 添加機器學習異常檢測 3. 開發可視化Dashboard
提示:完整項目代碼可訪問 GitHub示例倉庫 “`
本文共計約2400字,涵蓋了從基礎配置到高級優化的完整實現方案。實際應用中請根據具體需求調整參數和架構設計。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。