使用ethers.js向长零地址转账hbar失败,持续出现gas耗尽问题
问题:使用ethers.js向Hedera长零地址转账Hbar时Gas耗尽失败
尝试用ethers.js向Hedera长零地址转账Hbar,将账户ID(0.0.5465603)转换为Solidity地址(0x0000000000000000000000000000000000536603)后,转账持续触发Gas耗尽错误。
问题分析
- 金额解析错误:
ethers.parseEther('2', 'wei')用法不符合API规范,parseEther仅接受金额字符串参数,单位默认为ether,传入第二个参数会导致金额计算异常,进而引发交易错误。 - 变量未定义:代码中
accountWallet未初始化,属于无效变量,会导致运行时错误。 - 硬编码Gas不匹配:Hedera EVM的Gas机制与以太坊存在差异,硬编码
gasLimit:200000可能不符合该转账操作的实际需求,容易触发Gas耗尽。
解决方案
关键修正点
- 替换错误的金额解析方法:使用
ethers.parseUnits指定正确单位,Hedera EVM中Hbar的最小单位是tinybar(对应1e8进制),需根据转账需求调整。 - 修正未定义变量:将
accountWallet替换为已初始化的signer。 - 使用Gas估算:通过provider自动估算所需Gas,避免硬编码导致的Gas不足或浪费。
- 添加错误捕获:便于排查交易失败的具体原因。
修正后的完整代码
import dotenv from 'dotenv'; import { ethers } from 'ethers'; import { Wallet } from '@ethersproject/wallet'; import { JsonRpcProvider } from '@ethersproject/providers'; async function main() { dotenv.config(); const privateKey = process.env.PRIVATE_KEY; const rpcUrl = process.env.RPC_URL; if (!privateKey || !rpcUrl) { console.log('请在.env文件中设置PRIVATE_KEY和RPC_URL'); process.exit(1); } const rpcProvider = new JsonRpcProvider(rpcUrl); const signer = new Wallet(privateKey, rpcProvider); const accountAddress = await signer.getAddress(); console.log({ accountAddress, rpcUrl}); // 示例:转账2 tinybar(Hbar最小单位),若转2 Hbar则改为ethers.parseUnits('2', 8) const txValue = ethers.parseUnits('2', 'wei'); // 自动估算Gas const gasLimit = await rpcProvider.estimateGas({ to: "0x0000000000000000000000000000000000536603", value: txValue }); let tx = { to: "0x0000000000000000000000000000000000536603", gasLimit: gasLimit, value: txValue, }; try { let transaction = await signer.sendTransaction(tx); await transaction.wait(); console.log(`交易成功,哈希:${transaction.hash}`); } catch (error) { console.error('交易失败:', error); } } main().catch(console.error);
.env配置文件
# 创建并资助账户后,复制其私钥 PRIVATE_KEY="" # 默认使用Hashio测试网RPC,可根据偏好更换 RPC_URL="https://testnet.hashio.io/api"
内容的提问来源于stack exchange,提问作者Greg Scullard
相关产品推荐
相关产品推荐

