:2026-05-29 17:54 点击:6
区块链技术的浪潮席卷全球,以太坊作为最具代表性的智能合约平台,为去中心化应用(DApps)的开发提供了强大的基础设施,谈及区块链开发,许多开发者可能会首先想到Solidity(以太坊智能合约编程语言)和JavaScript(前端交互),PHP作为一门历史悠久、应用广泛的服务器端编程语言,同样可以在以太坊生态中扮演重要角色,本文将探讨以太坊与PHP编程的结合点,介绍如何使用PHP与以太坊区块链进行交互,包括连接网络、查询信息、发送交易以及与智能合约交互等。
PHP以其易学易用、丰富的框架生态(如Laravel、Symfony)和成熟的Web开发能力而闻名,对于已经精通PHP的开发者而言,利用现有技能进入区块链领域无疑降低了学习曲线,PHP在以太坊开发中的主要应用场景包括:
要在PHP中与以太坊交互,最常用的库是 Web3.php,这是一个用PHP编写的以太坊JSON-RPC库,它封装了与以太坊节点通信的底层细节,使得PHP开发者可以方便地调用以太坊的各种功能。
Web3.php的主要功能包括:
在开始PHP以太坊编程之前,需要准备以下环境:
通过Composer安装Web3.php库:
composer require sc0vu/web3.php
require 'vendor/autoload.php';
use Web3\Web3;
use Web3\Providers\HttpProvider;
use Web3\RequestManagers\HttpRequestManager;
// 替换为你的以太坊节点URL,例如Infura提供的URL
$nodeUrl = 'https://mainnet.infura.io/v3/YOUR_PROJECT_ID';
$provider = new HttpProvider(new HttpRequestManager($nodeUrl, 5)); // 5为超时时间(秒)
$web3 = new Web3($provider);
// 检查连接
$web3->getVersion()->then(function ($version) {
echo "Ethereum Node Version: " . $version . PHP_EOL;
}, function ($error) {
echo "Error: " . $error->getMessage() . PHP_EOL;
});
$accountAddress = '0x742d35Cc6634C0532925a3b844Bc9e7595f8bE8'; // 替换为要查询的地址
$web3->eth->getBalance($accountAddress, function ($err, $balance) {
if ($err !== null) {
echo "Error: " . $err->getMessage() . PHP_EOL;
return;
}
// 余额是Wei,转换为ETH
$ethBalance = $balance->toString();
$ethBalanceInEth = bcdiv($ethBalance, '1000000000000000000', 18);
echo "Balance of " . $accountAddress . " is: " . $ethBalanceInEth . " ETH" . PHP_EOL;
});
发送交易需要私钥进行签名。注意:私钥极度敏感,切勿在代码中硬编码或在非安全环境中使用!
use Web3\Utils;
use Web3\Contract;
$privateKey = 'YOUR_PRIVATE_KEY'; // 替换为发送方私钥
$fromAddress = '0xYourFromAddress'; // 发送方地址
$toAddress = '0xRecipientAddress'; // 接收方地址
$value = '0.01'; // 发送的ETH数量
$gasLimit = '21000'; // 通常转账的gas limit
$gasPrice = '20000000000'; // gas price,例如20 Gwei
// 1. 获取nonce
$web3->eth->getTransactionCount($fromAddress, 'latest', function ($err, $nonce) use ($privateKey, $toAddress, $value, $gasLimit, $gasPrice) {
if ($err !== null) {
echo "Error getting nonce: " . $err->getMessage() . PHP_EOL;
return;
}
$nonceHex = '0x' . dechex($nonce->toString());
// 2. 构建交易
$transaction = [
'to' => $toAddress,
'value' => Utils::toWei($value, 'ether')->toHex(),
'gas' => Utils::toHex($gasLimit),
'gasPrice' => Utils::toHex($gasPrice),
'nonce' => $nonceHex,
'chainId' => Utils::toHex(1) // 主网为1,测试网如Ropsten为3
];
// 3. 签名交易
$web3->eth->accounts->signTransaction($transaction, $privateKey, function ($err, $signedTx) use ($web3) {
if ($err !== null) {
echo "Error signing transaction:
" . $err->getMessage() . PHP_EOL;
return;
}
// 4. 发送交易
$web3->eth->sendRawTransaction($signedTx->rawTransaction, function ($err, $txHash) {
if ($err !== null) {
echo "Error sending transaction: " . $err->getMessage() . PHP_EOL;
return;
}
echo "Transaction sent: " . $txHash . PHP_EOL;
});
});
});
假设我们有一个简单的ERC-20代币合约,我们想要调用其balanceOf()方法(读操作)和transfer()方法(写操作)。
你需要合约的ABI(Application Binary Interface)和合约地址。
$contractAddress = '0xYourContractAddress';
$abi = '[...你的合约ABI JSON数组...]'; // 这通常是一个JSON字符串,解码为数组
$contract = new Contract($web3->provider, $abi);
// 调用balanceOf(address)方法 (读操作)
$accountToCheck = '0xAddressToCheckBalance';
$contract->at($contractAddress)->call('balanceOf', $accountToCheck, function ($err, $balance) {
if ($err !== null) {
echo "Error calling balanceOf: " . $err->getMessage() . PHP_EOL;
return;
}
echo "Token balance: " . $balance->toString() . PHP_EOL;
});
// 调用transfer(address,uint256)方法 (写操作)
$recipient = '0xRecipientAddress';
$amount = '1000000000000000000'; // 代币数量,根据decimals调整
$fromAddress = '0xYourFromAddress'; // 调用者地址
$privateKey = 'YOUR_PRIVATE_KEY';
// 需要先估算gas,然后构建并发送交易
// 这部分逻辑比单纯调用读方法复杂,需要获取nonce,估算gas,签名等,类似于发送ETH交易
// 以下是简化示意,实际实现需要更细致的错误处理和步骤
$contract->at($contractAddress)->send('transfer', $recipient, $amount, [
'from' => $fromAddress,
'gas' => '0x100000', //
本文由用户投稿上传,若侵权请提供版权资料并联系删除!