PHP 通过 JSON-RPC 调用实现以太坊交互

·

自去年以来,开发区块链业务的需求逐渐增长。以太坊作为主流平台之一,与 PHP 的集成成为许多开发者关注的焦点。本文将介绍如何使用 PHP 通过 JSON-RPC 调用与以太坊节点进行交互,涵盖环境搭建、节点配置及实际调用示例。

开发环境设置

推荐使用 Ubuntu 14.04 LTS 系统。安装完成后,先更新系统包:

sudo apt-get update
sudo apt-get upgrade

随后设置 SSH、iptables 和 ntp 等基础服务。接着安装 Apache 和 PHP 5.5:

sudo apt-get install php5 libapache2-mod-php5 php5-curl

以太坊节点搭建

本次使用 Go 语言编写的以太坊节点 go-ethereum(简称 geth)。首先添加以太坊官方存储库:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev

更新并安装 geth:

sudo apt-get update
sudo apt-get install ethereum

启动私有网络

创建数据目录并定义创世区块配置:

mkdir ~/eth_private_net
vim ~/eth_private_net/my_genesis.json

my_genesis.json 文件中写入以下内容:

{
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x0",
  "gasLimit": "0xffffffff",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}

初始化创世区块并启动节点:

geth --datadir "/home/yoshida/eth_private_net" init /home/yoshida/eth_private_net/my_genesis.json
geth --networkid 57598955 --port 8955 --nodiscover --datadir "/home/yoshida/eth_private_net" console 2>> /home/yoshida/eth_private_net/geth_err.log

常用启动参数说明:

配置 JSON-RPC 接口

创建以太坊账户

在 geth 控制台中执行以下命令:

eth.accounts
personal.newAccount("password")
eth.accounts
miner.setEtherbase(eth.accounts[0])

第一个命令显示现有账户(初始为空数组),第二个命令创建新账户并返回地址,第三个命令再次查看账户列表,第四个命令设置挖矿奖励地址。

启用 RPC 接口

退出控制台后重新启动 geth,添加 RPC 相关参数:

geth --networkid 57598955 --port 8955 --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8956" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" --datadir "/home/yoshida/eth_private_net" console 2>> /home/yoshida/eth_private_net/geth_err.log

新增参数说明:

PHP 调用实践

推荐使用开源库 ethereum-php 简化开发。将类文件下载到项目目录后,即可进行调用:

<?php
require_once 'ethereum.php';
$eth = new Ethereum('localhost', '8956');
print_r($eth->eth_accounts());
?>

运行脚本将返回已创建的账户列表:

php test.php
Array
(
    [0] => 0xb83fa0d1c6b34a42f900cca5a32400c3b6f69f4b
)

若连接失败,请检查端口设置和防火墙配置。👉 查看实时交互工具 获取更多开发支持。

常见问题

如何选择以太坊客户端?
除了 geth,还有 Parity、Hyperledger Besu 等客户端可选。geth 是最常用的官方客户端,适合大多数场景。

PHP 库是否支持其他区块链?
ethereum-php 专为以太坊设计,但其他兼容 EVM 的区块链(如 BSC、Polygon)也可通过调整节点配置使用。

遇到连接拒绝怎么办?
检查节点 RPC 端口是否开放、防火墙设置是否正确,以及是否使用了正确的网络 ID 和端口号。

如何提高交互安全性?
建议使用内网环境部署节点,限制 RPC 访问 IP,并为敏感操作添加身份验证机制。

智能合约交互是否复杂?
基础调用与账户操作类似,但合约开发需要掌握 Solidity 语言和 ABI 编码等知识。

除了 JSON-RPC 还有哪些交互方式?
还可使用 Web3.js 库前端集成,或通过 Infura 等节点服务商提供的 API 进行交互。

通过本文介绍的方法,开发者可以快速建立 PHP 与以太坊的交互通道,为区块链应用开发奠定基础。随着技术发展,更多高效的工具和库不断涌现,持续学习将帮助您保持竞争力。