React Native Expo对接Infura sendTransaction报missing response错误
问题根因
missing response 是ethers.js发起RPC请求时未拿到合法返回值时抛出的通用错误,对应这个场景的触发原因按概率从高到低排序:
- 环境适配问题:Expo/React Native运行时的全局网络请求实现和ethers.js v5默认的请求逻辑不兼容,RPC请求发出后无法被正确解析响应,是该类场景下的最高发诱因。
- 网络配置失效:代码中指定的
ropsten测试网已于2022年底正式关停,Infura已全面停止该网络的节点服务,所有发往ropsten节点的请求都会被直接拒绝,无法返回合法响应。 - 代码逻辑错误:对SecureStore读取到的私钥做了无意义的
JSON.parse操作,如果私钥存储时没有做JSON序列化包装,解析后会得到null/非法值,导致签名、发交易流程异常,连带抛出响应缺失错误。 - 服务/网络限制:Infura项目ID填写错误、控制台未开启对应测试网访问权限,或设备网络存在拦截导致RPC请求无法抵达Infura节点。
修复方案
按以下步骤逐次调整即可解决问题:
- 替换废弃测试网:将网络参数从
ropsten替换为当前官方支持的sepolia测试网。 - 补全请求polyfill:显式给ethers传入适配Expo环境的fetch实现,绕过全局请求的兼容问题。
- 修正私钥读取逻辑:移除不必要的
JSON.parse处理,SecureStore默认存取字符串类型值,不需要额外序列化解析。 - 补全错误捕获:给所有异步逻辑包裹try/catch,避免未处理的Promise拒绝异常。
- 校验服务配置:登录Infura控制台确认Sepolia网络已启用,项目ID填写正确,设备网络可正常访问RPC服务。
修复后的可运行代码参考:
import * as SecureStore from 'expo-secure-store'; import { ethers } from 'ethers'; // 导入适配Expo的fetch实现,若未安装先执行 expo install cross-fetch import fetch from 'cross-fetch'; const sendTx = async (to, INFURA_PROJECT_ID) => { try { // 读取私钥,移除多余JSON.parse const SIGNER_PRIVATE_KEY = await SecureStore.getItemAsync('Ethereum.privatekey'); if (!SIGNER_PRIVATE_KEY) throw new Error('私钥不存在'); // 初始化provider,替换为sepolia网络,显式传入fetch实现 const provider = new ethers.providers.InfuraProvider( 'sepolia', INFURA_PROJECT_ID, { fetch } ); // 初始化签名钱包 const signer = new ethers.Wallet(SIGNER_PRIVATE_KEY, provider); // 发交易 const tx = await signer.sendTransaction({ to, value: ethers.utils.parseEther("0.001"), }); console.log("Mining transaction..."); console.log(`Transaction hash: ${tx.hash}`); // 等待上链 const receipt = await tx.wait(); console.log(`Mined in block ${receipt.blockNumber}`); return tx; } catch (err) { // 统一捕获错误 console.error('交易发送失败:', err); throw err; } }
补充说明:如果使用的是ethers.js v6版本,初始化InfuraProvider时传入自定义fetch的参数位置有调整,需要放到provider构造函数的第三个option参数的staticNetwork配置同级位置,兼容逻辑一致。
内容的提问来源于stack exchange,提问作者Amin
相关产品推荐
相关产品推荐

