You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:52:36