双节点以太坊私有链sendTransaction()返回invalid sender报错问题
以太坊私有链
invalid sender 报错排查与解决 报错核心诱因
- 签名校验逻辑不匹配:
eth.sendTransaction方法本身不会完成交易签名,只有当节点本地存储了from字段对应地址的密钥、且账户处于解锁状态时,节点才会在内部自动完成签名填充。如果找不到对应密钥,就会直接抛出invalid sender错误。 - 创世块链配置缺失关键字段:当前使用的Geth客户端为Ubuntu 20.04官方PPA源的新版本,创世块配置的
config段仅声明了chainId=813,未明确标记EIP-155、伦敦升级等硬分叉激活参数。客户端在硬分叉激活规则校验阶段,会将所有不符合EIP-155格式的交易判定为无效发件人。 - 操作场景与节点身份不匹配:如果执行转账命令时,当前连接的控制台并非发送方账户所在的节点,本地没有对应密钥文件,自然无法完成签名流程。
是否需要手动签名操作
无需强制手动签名。满足两个条件即可正常使用节点自动签名流程完成转账:一是执行交易的节点本地存储了发送方地址的密钥文件;二是对应账户处于有效解锁状态。仅在跨节点RPC调用、高安全要求的场景下,推荐使用离线签名方式降低私钥暴露风险。
正确实现步骤
- 修正创世块配置,补全硬分叉参数,避免新旧版本交易格式不兼容。将原有
genesis.json的config段修改为如下内容,所有硬分叉块高度设为0,代表创世块阶段即激活全部规则:
注意:修改创世块配置后,需要清空对应datadir下的全部旧链数据,重新执行"config":{ "chainId": 813, "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 0, "constantinopleBlock": 0, "petersburgBlock": 0, "istanbulBlock": 0, "berlinBlock": 0, "londonBlock": 0 }geth --datadir=/root/datadir/ init /root/mygenesis.json完成初始化,原有链数据不会自动适配新的配置规则。 - 校验当前节点的账户列表:在节点控制台执行
eth.accounts,确认返回的地址列表中包含发送方地址0xd4b49495ea94285b0a8af7d813e089fc6c87311c,排除连错节点导致找不到密钥的问题。 - 重新执行账户解锁操作,明确指定解锁时长:
命令执行成功会返回布尔值personal.unlockAccount("0xd4b49495ea94285b0a8af7d813e089fc6c87311c", "你的账户登录密码", 300)true,其中300代表解锁有效期为300秒,避免默认解锁时长过短导致签名失败。 - 修正转账命令的参数格式,使用Web3内置方法完成单位转换,减少手动计算的误差:
eth.sendTransaction({ from: "0xd4b49495ea94285b0a8af7d813e089fc6c87311c", to: "0x45f42febec0ba6127ec1c7ce33d6f2afd0b9b24e", value: web3.toWei(0.8, "ether") }) - 若自动签名流程仍报错,可使用离线签名方式构造交易,不依赖节点的自动签名能力:
// 拉取发送方账户的当前交易计数作为nonce值 const txParams = { nonce: eth.getTransactionCount("0xd4b49495ea94285b0a8af7d813e089fc6c87311c"), gasPrice: eth.gasPrice, gas: 21000, to: "0x45f42febec0ba6127ec1c7ce33d6f2afd0b9b24e", value: web3.toWei(0.8, "ether"), chainId: 813 } // 用本地存储的私钥完成交易签名,过程中会提示输入账户密码 const signedTx = personal.signTransaction(txParams, "0xd4b49495ea94285b0a8af7d813e089fc6c87311c", "") // 将签名完成的交易广播到链上完成转账 eth.sendRawTransaction(signedTx.rawTransaction)
额外配置修正
启动节点2的命令中,-rpc参数缺少一个横杠,无法被Geth识别,会导致RPC接口无法正常开启。需修正为--rpc,否则后续跨节点RPC调用会出现连接失败的问题。
内容的提问来源于stack exchange,提问作者benjamin
相关产品推荐
相关产品推荐

