随着区块链技术的飞速发展,以太坊作为领先的智能合约平台,其应用日益广泛,对于许多基于 PHP 开发的 Web 应用而言,能够与以太坊网络进行交互(如查询余额、发送交易、调用智能合约等)已成为一项重要需求,本文将详细介绍如何使用 PHP 与以太坊 Web3 接口进行通信,并提供核心代码示例,帮助开发者快速上手。
理解 Web3 接口与 PHP 交互方式
以太坊本身没有直接为 PHP 设计的原生 API,PHP 与以太坊的交互通常通过以下几种方式实现:
- JSON-RPC 接口:这是最常用和推荐的方式,以太坊节点(如 Geth, Parity)或第三方服务(如 Infura, Alchemy)提供 JSON-RPC API,PHP 作为客户端,通过 HTTP 请求向这些端点发送符合 JSON-RPC 2.0 规范的请求,并接收响应。
- Web3.js 的 PHP 封装库:社区存在一些将 JavaScript 的 Web3.js 库功能封装成 PHP 可用库的尝试,但不如直接调用 JSON-RPC 流行和稳定。
- 以太坊 PHP 客户端库:一些专门为 PHP 开发的库,如
web3php(原php-ethereum),它们内部也是通过调用 JSON-RPC 接口来简化操作,提供了更友好的 PHP 风格 API。
我们将重点介绍使用 JSON-RPC 直接调用 和使用成熟的 PHP Web3 库(如 web3p/web3.php) 这两种主流方法。
环境准备
在开始编码之前,确保你的开发环境满足以下条件:
- PHP 环境:PHP 7.4 或更高版本。
- Composer:PHP 的依赖管理工具,用于安装第三方库。
- 以太坊节点访问:
- 本地节点:运行自己的以太坊节点(如 Geth),并开启 JSON-RPC 服务(默认端口 8545)。
- 第三方服务:注册 Infura、Alchemy 等服务,获取一个 HTTP 或 WebSocket URL,对于初学者,第三方服务更为便捷,无需同步整个区块链。
- 以太坊钱包:用于测试的账户,包含私钥(注意:私钥需妥善保管,切勿泄露)。
方法一:直接通过 cURL 调用 JSON-RPC 接口
这种方式不依赖额外库,适合理解底层交互原理。
示例代码:获取以太坊最新区块号
<?php
$rpcUrl = 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'; // 替换为你的 Infura URL 或本地节点地址
$data = [
'jsonrpc' => '2.0',
'method' => 'eth_blockNumber',
'params' => [],
'id' => 1
];
$ch = curl_init($rpcUrl);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen(json_encode($data))
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
curl_close($ch);
exit;
}
curl_close($ch);
$result = json_decode($response, true);
if (isset($result['result'])) {
$blockNumberHex = $result['result'];
$blockNumber = hexdec($blockNumberHex);
echo "Latest Block Number: " . $blockNumber . PHP_EOL;
} else {
echo "Error: " . ($result['error']['message'] ?? 'Unknown error') . PHP_EOL;
}
?>
代码说明:
$rpcUrl:替换为你的以太坊节点 JSON-RPC 端点。$data:构建 JSON-RPC 请求体,包含jsonrpc版本、method(要调用的方法,如eth_blockNumber,eth_getBalance等)、params(方法参数,若无则为空数组)和id(请求标识符)。- 使用 cURL 发送 POST 请求,并设置请求头和请求体。
- 解析响应 JSON,获取结果或错误信息。
方法二:使用 web3p/web3.php 库(推荐)
为了简化开发,我们可以使用成熟的 PHP Web3 库,如 web3p/web3.php,它提供了更面向对象的接口,封装了底层 JSON-RPC 的细节。
安装库
composer require web3p/web3.php
示例代码:获取账户余额并发送交易
