以太坊私钥需32字节报错求助:签名交易时如何修正?
解决以太坊签名交易时的「Private key must be 32 bytes in length」错误
错误原因
以太坊私钥本质是32字节的二进制数据,对应64个十六进制字符(1字节=2个十六进制字符)。你当前的问题是转成十六进制字符串时,可能因为原始Buffer包含前导零被省略,导致字符串长度不足64位,触发了web3.js的参数校验错误。
另外需要明确:以太坊地址是42字符(0x前缀+20字节的十六进制表示),和私钥的32字节长度没有关联,不要混淆两者的规格。
解决方案
方案1:直接传递Buffer类型的私钥(推荐)
web3.js的signTransaction方法支持直接传入Buffer类型的私钥,无需转成十六进制字符串,从根源避免长度问题:
var signed = await this.web3.eth.accounts.signTransaction(rawData, this.wallet.privateKey);
方案2:确保十六进制字符串为64位长度
如果必须使用十六进制字符串,需要补全前导零保证长度为64位:
// 补全前导零,确保十六进制字符串长度为64 var privateKeyHex = this.wallet.privateKey.toString("Hex").padStart(64, '0'); var signed = await this.web3.eth.accounts.signTransaction(rawData, privateKeyHex);
内容的提问来源于stack exchange,提问作者Arrakasta Lasai
相关产品推荐
相关产品推荐

