如何使用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
相关产品推荐
相关产品推荐

