以太坊作为智能合约和去中心化应用(DApp)的领先平台,吸引了无数开发者的目光,虽然Solidity是以太坊智能合约开发的主流语言,但当我们希望用PHP这一广泛使用的服务器端语言来与以太坊网络交互、构建基于以太坊的后端服务或DApp前端时,是完全可行的,本文将带你了解如何使用PHP搭建以太坊应用,涵盖环境准备、连接网络、交互智能合约等核心步骤。

为什么选择PHP搭建以太坊应用

在深入技术细节之前,我们先思考一下为何要选择PHP:

  1. 现有技能复用:许多开发者拥有丰富的PHP开发经验,可以快速上手构建以太坊应用的后端逻辑。
  2. 生态系统成熟:PHP拥有庞大的社区和成熟的框架(如Laravel、Symfony),便于快速开发。
  3. Web集成便利:PHP天然适合Web开发,可以轻松将以太坊功能集成到现有的Web应用中。
  4. 降低入门门槛:对于熟悉PHP但不熟悉Node.js或其他语言的开发者来说,PHP提供了一个相对友好的入口。

准备工作:环境与工具

在开始之前,你需要准备以下环境和工具:

  1. PHP环境

    • 安装PHP(建议版本7.4或更高,以确保兼容性)。
    • 安装PHP的包管理器Composer,用于管理项目依赖。
    • 确保PHP开启必要的扩展,如curljsonopenssl等,通常这些在标准安装中都已包含。
  2. 以太坊节点或Infura/Alchemy等服务

    • 本地节点:运行一个以太坊全节点(如Geth或Parity)或轻节点,这需要较多的存储空间和同步时间,但提供完全的控制和隐私。
    • 第三方服务:使用Infura、Alchemy等提供的节点服务,这是更简单快捷的方式,无需自己维护节点,适合开发和测试,你需要注册账号并获取一个项目ID(Endpoint URL)。
  3. 以太坊钱包与测试ETH

    • MetaMask:浏览器插件钱包,方便与DApp交互和测试。
    • 测试ETH:从以太坊测试网(如Ropsten, Goerli, Sepolia)的 Faucet 获取免费的测试ETH,用于支付交易费用。
  4. 智能合约(可选)

    如果你需要与智能合约交互,你需要先有一个编译好的合约ABI(Application Binary Interface)和合约地址,可以使用Solidity语言编写合约,并通过Remix IDE等工具编译部署。

核心步骤:使用PHP与以太坊交互

PHP本身不直接支持以太坊协议,因此我们需要借助第三方库,目前最流行和推荐的是web3.php库,它是Web3.js的PHP端口。

安装web3.php库

使用Composer来安装web3.php

composer require sc0vu/web3.php

连接到以太坊网络

require 'vendor/autoload.php';
use Web3\Web3;
use Web3\Providers\HttpProvider;
use Web3\RequestManagers\HttpRequestManager;
// 替换为你的Infura/Alchemy节点URL或本地节点URL
$nodeUrl = 'https://mainnet.infura.io/v3/YOUR_PROJECT_ID';
// 创建HTTP Provider
$provider = new HttpProvider(new HttpRequestManager($nodeUrl, 5000)); // 5000是超时时间(毫秒)
// 创建Web3实例
$web3 = new Web3($provider);
// 检查连接
$web3->getVersion()->then(function ($version) {
    echo "Ethereum Client Version: " . $version . "\n";
}, function ($error) {
    echo "Error: " . $error->getMessage() . "\n";
});

获取账户信息(如余额)

// 假设我们有一个以太坊地址
$address = '0x742d35Cc6634C0532925a3b844Bc454e4438f44e';
// 获取余额
$web3->eth->getBalance($address, function ($err, $balance) {
    if ($err !== null) {
        echo "Error: " . $err->getMessage() . "\n";
        return;
    }
    // 余额是Wei,转换为ETH
    $ethBalance = $balance->toString();
    $ethBalance = bcdiv($ethBalance, '1000000000000000000', 18);
    echo "Balance of $address: $ethBalance ETH\n";
});随机配图