Ethers.js在XinFin链发交易时地址转换触发无效地址错误求助
解决Ethers.js v5.7.2在XinFin区块链上的地址格式错误问题
问题根源
Ethers.js v5会根据链的chainId自动适配地址格式,XinFin主网(chainId=50)/测试网(chainId=51)的地址兼容0x和xdc前缀,但Ethers.js内部的地址校验逻辑会强制转换为xdc前缀,导致交易提交时触发地址无效错误。
解决方案
1. 手动归一化地址格式
在构造交易前,统一将地址转换为0x前缀格式,避免Ethers.js自动转换:
// 地址归一化函数:确保输出为0x开头的地址 const normalizeXinFinAddress = (address) => { if (address.startsWith('xdc')) { return '0x' + address.slice(3); } return address.startsWith('0x') ? address : '0x' + address; }; // 构造交易时使用归一化后的地址 const tx = { to: normalizeXinFinAddress(transaction.to), value: ethers.utils.parseEther(transaction.amount.toString()).toHexString(), nonce: txCount, }; try { await ethersWallet.sendTransaction(tx); // 后续逻辑 } catch (err) { console.error(err); }
2. 确保Provider配置正确的Chain ID
创建Provider时明确指定XinFin的Chain ID,让Ethers.js正确识别链的地址规则:
// XinFin主网Chain ID=50,测试网=51 const provider = new ethers.providers.JsonRpcProvider('https://rpc.xinfin.network', 50); const ethersWallet = new ethers.Wallet(privateKey, provider);
指定Chain ID后,Ethers.js会适配该链的地址格式逻辑,减少自动转换导致的冲突。
3. 禁用地址自动格式化(可选)
如果上述方法无效,可以通过修改Ethers.js的地址模块配置,强制使用0x前缀校验:
// 覆盖Ethers.js的地址格式校验逻辑 ethers.utils.Address.prototype.getAddress = function(address) { const normalized = ethers.utils.getAddress(address.startsWith('xdc') ? '0x' + address.slice(3) : address); return normalized; };
注意:此方法属于 hack 式修改,可能影响其他功能,仅在必要时使用。
内容的提问来源于stack exchange,提问作者xfscrypt
相关产品推荐
相关产品推荐

