在Web3时代,区块链应用的开发离不开与链上数据的交互,而转账是最基础的功能之一,本文将介绍如何使用PHP实现以太坊链上的Web3转账,涵盖环境准备、核心代码实现及常见问题处理,帮助开发者快速上手这一技术。
环境准备:安装必要工具与库
PHP实现Web3转账的核心是连接以太坊节点并调用智能合约方法,目前主流方案是通过Web3.php库(基于Ethereum JSON-RPC API)与节点通信,首先需要安装Composer(PHP依赖管理工具),然后在项目中引入Web3.php库:
composer require sc0vu/web3.php
需确保有一个可访问的以太坊节点,开发者可选择公共节点(如Infura、Alchemy)或本地节点(如Geth、Parity),以Infura为例,注册后获取项目ID,节点URL格式为https://mainnet.infura.io/v3/YOUR_PROJECT_ID。
转账核心代码实现
转账的本质是调用以太坊的eth_sendTransaction方法,构造包含发送者、接收者、转账金额等数据的交易,并用私钥签名,以下是完整代码示例:
require 'vendor/autoload.php';
use Web3\Web3;
use Web3\Contract;
use Web3\Providers\HttpProvider;
use Web3\Utils;
// 1. 初始化Web3实例,连接节点
$web3 = new Web3(new HttpProvider('https://mainnet.infura.io/v3/YOUR_PROJECT_ID'));
// 2. 定义转账参数
$privateKey = 'YOUR_SENDER_PRIVATE_KEY'; // 发送者私钥(需妥善保管,勿硬编码)
$fromAddress = '0xSenderAddress'; // 发送者地址(需与私钥匹配)
$toAddress = '0xReceiverAddress'; // 接收者地址
$amount = '0.01'; // 转账金额(ETH)
$gasLimit = '21000'; // Gas限制(标准转账通常21000)
$gasPrice = '20000000000'; // Gas价格(单位:wei,示例为20 Gwei)
// 3. 获取nonce(防止交易重放)
$web3->eth->getTransactionCount($fromAddress, 'pending', function ($err, $nonce) use (
$web3, $privateKey, $toAddress, $amount, $gasLimit, $gasPrice
) {
if ($err) {
echo '获取Nonce失败: ' . $err->getMessage();
return;
}
// 4. 构造交易数据
$transaction = [
'from' => $fromAddress,
'to' => $toAddress,
'value' => Utils::toWei($amount, 'ether'), // 将ETH转换为wei
'gas' => $gasLimit,
'gasPrice' => $gasPrice,
'nonce' => $nonce,
];
// 5. 使用私钥签名并发送交易
$web3->eth->sendRawTransaction(
$web3->eth->accounts->signTransaction($transaction, $privateKey)->raw,
function ($err, $txHash) {
if ($err) {
echo '交易发送失败: ' . $err->getMessage();
return;
}
echo '交易哈希: ' . $txHash . PHP_EOL;
echo '请等待区块确认...';
}
);
});
