You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHP调用Rinkeby测试网的智能合约函数

问题排查与解决方法

一、关于/var/www/html路径下PHP文件引用Composer依赖的说明

  • 只要满足两个条件就可以正常引用:
    • 代码中填写的autoload.php绝对路径完全正确
    • Apache运行的默认用户www-data对依赖所在目录及所有子文件、子目录拥有可读权限,否则会抛出权限拒绝错误
  • 你当前抛出的错误不属于权限/路径加载失败类问题,核心是代码本身存在写法错误。
  • 如果嫌跨目录配置权限麻烦,最稳妥的方式是直接在/var/www/html目录下执行Composer安装ethereum-php依赖,自动加载文件路径就可以写为require __DIR__ . '/vendor/autoload.php';,完全避免路径和权限问题。

二、Class "SmartContract" not found报错的直接原因

你只在代码头部导入了Ethereum类,没有导入SmartContract类,该类属于Ethereum命名空间下,需要补充对应的导入语句。

三、代码中存在的其他会导致运行失败的问题

  • ABI写法错误:你直接把JSON格式的ABI内容写在了PHP数组赋值语句里,PHP无法直接识别这种JS风格的对象写法,需要要么把ABI转为纯PHP数组,要么用json_decode()解析JSON格式的ABI字符串。
  • 节点地址失效:Rinkeby测试网已于2023年正式停止运行,你当前填写的Rinkeby节点无法正常连接,需要替换为可用的节点地址(比如Sepolia测试网节点、ETH主网节点)。
  • 合约地址写法错误:你代码里写的<contract-address>是HTML转义后的字符,实际使用时需要替换为你部署的合约真实0x开头地址,去掉转义符。

四、修正后的参考代码

<?php
  // 加载Composer自动加载文件,确认路径正确且www-data有读权限
  require '/home/ubuntu/php-ether/vendor/autoload.php';
  // 补充导入SmartContract类
  use Ethereum\Ethereum;
  use Ethereum\SmartContract;

  // ABI改为JSON字符串后解析为PHP可识别的格式
  $abiStr = '[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAmount","outputs":[],"stateMutability":"payable","type":"function"}]';
  $abi = json_decode($abiStr);

  // 替换为你自己的可用节点RPC地址
  $eth = new Ethereum('可用节点RPC地址');
  // 替换为真实的合约0x地址
  $schemaContract = new SmartContract($abi, '0x_你的合约实际地址', $eth);

  $result = $schemaContract->TOTAL_SUPPLY()->Val();
  echo $result;
?>

权限问题修复命令

如果运行时出现文件加载权限错误,执行以下命令给www-data用户授予依赖目录的读权限即可:

sudo chmod -R 755 /home/ubuntu/php-ether

内容的提问来源于stack exchange,提问作者Joe Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:54:28