Solana交易签名报unexpected type, use Uint8Array错误如何解决?
错误原因
- 该错误由
tweetnacl库的类型校验触发:nacl.sign.detached()方法要求传入的待签名数据和签名私钥两个参数必须是Uint8Array类型,只要其中任意一个参数为Buffer、普通数组、十六进制/Base64字符串等其他类型,就会抛出该异常。 - 结合调用栈判断,问题大概率出在传入
partialSign方法的签名者signer的secretKey不符合类型要求:常见场景包括私钥被存储为字符串格式、使用Node.js独有的Buffer类型未做转换、密钥导入/生成时类型处理错误。
解决方案
- 私钥传入签名方法前强制转换为
Uint8Array类型:- 若私钥当前为十六进制字符串:
const uint8SecretKey = new Uint8Array(Buffer.from(hexPrivateKeyStr, 'hex')) - 若私钥当前为Base64字符串:
const uint8SecretKey = new Uint8Array(Buffer.from(base64PrivateKeyStr, 'base64')) - 若私钥当前为Node.js Buffer类型:
const uint8SecretKey = new Uint8Array(nodeBufferSecretKey)
- 若私钥当前为十六进制字符串:
- 可选校验待签名数据类型,避免
signData异常:const signData = new Uint8Array(message.serialize()) - 如果使用
@solana/web3.js的Keypair生成签名者,keypair.secretKey本身就是Uint8Array类型,无需额外转换,确认传入partialSign的是完整的Keypair实例,而非自行构造的携带错误类型secretKey的对象。
内容的提问来源于stack exchange,提问作者Krishna Satya
相关产品推荐
相关产品推荐

