Web3.js + MetaMask移动端合约调用失败(桌面正常)[错误码-32603]
Web3.js + MetaMask 移动端调用合约函数失败(桌面端正常)
使用Web3.js与MetaMask进行区块链交互时,桌面端调用合约tokenWeight函数正常,但移动端调用失败,报错显示执行回退。
代码实现
import Web3 from 'web3'; import detectEthereumProvider from '@metamask/detect-provider'; const provider = await detectEthereumProvider(); const web3 = new Web3(provider); const accounts = await provider.request({ method: 'eth_requestAccounts', }); const query = (new web3.eth.Contract(ContractAbi, ContractAddress)).methods.tokenWeight(10); try { let result = await query.call(); console.log(result); } catch (e) { console.log(e); }
报错信息
{"name":"Qe","code": 100,"message":"Returned error: Internal JSON-RPC error.","innerError": {"code":-32603,"message":"Internal JSON-RPC error.","data": {"code":-32000,"message":"execution reverted"}},"data": {"code":-32000,"message":"execution reverted"}}
{"code":-32603,"data":{"request": {"method":"eth_call","params": [{"to":"0x47061C8a71274Ea7245B84fEA63cBac957d8a1cF","input":"0x70a082310000000000000000000000364d8ea5e7a4ce97e89f7b2cb7198d6d5dfe0ace"},"latest"],"jsonrpc":"2.0","id": 9330414}}}
问题排查与解决方向
链ID一致性检查
确认移动端MetaMask当前连接的链ID,与合约部署的链ID完全一致。执行await web3.eth.getChainId()对比桌面端与移动端的返回值,若不一致则切换到对应链。合约地址与ABI正确性验证
打印移动端环境中的ContractAddress和ContractAbi,与桌面端的配置逐行对比。重点检查ContractAbi中tokenWeight函数的参数定义(比如是否为uint256类型),确保和调用时传入的参数类型匹配。参数编码异常排查
从报错的input字段可以看到,参数编码结果异常:正确传入10(十六进制为0xa)的编码应该是000000000000000000000000000000000000000000000000000000000000000a,但报错中的参数是一个地址格式的长串。可以手动编码参数验证:const encoded = web3.eth.abi.encodeFunctionCall( { name: 'tokenWeight', type: 'function', inputs: [{ type: 'uint256', name: 'id' }] }, [10] ); console.log(encoded);若输出与报错中的
input不一致,说明ABI定义错误或Web3.js在移动端存在类型转换bug。MetaMask版本与网络问题
- 尝试将移动端MetaMask更新至最新版本,旧版本可能存在Web3兼容性问题;
- 切换到稳定的Wi-Fi网络,或更换MetaMask中的RPC节点(比如官方节点),排除网络不稳定导致的节点响应异常。
内容的提问来源于stack exchange,提问作者Syamsoul Azrien
相关产品推荐
相关产品推荐

