使用Web3及Ankr API转账BEP20代币时出现Invalid Sender错误如何解决
报错原因&修复方案
私钥与发件地址不匹配
先验证你传入的req.params.privatekey对应的钱包地址是否和req.params.fromaddress完全一致,地址填错、私钥截取错误都会触发该报错。可加一行代码校验:const { address } = require('ethereumjs-util').privateToAddress(privateKey); console.log('私钥对应地址:', '0x'+address.toString('hex'), '传入的发件地址:', fromAddress);两者不一致直接修正传参即可。
EthereumTx 初始化参数错误
ethereumjs-tx库默认按以太坊主网参数签名,BSC链需要明确传入完整的链配置,尤其是高版本库必须指定hardfork,否则签名的v值不符合BSC链要求,节点校验发送方就会失败。修改初始化代码:// 适配ethereumjs-tx@1.x版本 const EthereumTx = require('ethereumjs-tx').Transaction; let transaction = new EthereumTx(rawTransaction, { chain: 'bsc', hardfork: 'london', chainId: 56 })如果使用的是新版
@ethereumjs/tx库,调整为如下写法:const { Transaction } = require('@ethereumjs/tx'); const Common = require('@ethereumjs/common').default; const common = Common.forCustomChain( 'mainnet', { name: 'bsc', chainId: 56, }, 'london' ); let transaction = Transaction.fromTxData(rawTransaction, { common });金额计算精度错误
直接用amount1*1000000000000000000会存在JS浮点数精度溢出问题,导致转账data编码错误,也可能间接触发校验失败,改成用web3自带的单位转换方法:let amount = web32.utils.toBN(web32.utils.toWei(amount1.toString(), 'ether'))Web3实例RPC配置错误
确认你初始化web32实例的时候,传入的RPC是Ankr提供的BSC主网节点地址,不是以太坊主网或者BSC测试网的地址,链ID不匹配也会触发Invalid Sender报错。
内容的提问来源于stack exchange,提问作者Dharmesh
相关产品推荐
相关产品推荐

