如何在Golang中验证Sui signMessage签名?
在Golang中验证Sui钱包signMessage的签名结果
Sui钱包的signMessage功能基于Ed25519椭圆曲线签名算法,和JS端tweetnacl的实现完全兼容。在Golang中可直接用标准库crypto/ed25519完成验证,以下是具体实现步骤和示例代码:
核心验证步骤
- 解码Base64格式的签名、原始消息字节(
messageBytes)和用户公钥 - 调用
ed25519.Verify完成签名有效性校验
完整示例代码
package main import ( "crypto/ed25519" "encoding/base64" "fmt" ) func main() { // JS端返回的示例数据 signatureBase64 := "APr0hJEXc9s9FKHeubNzLkiOJd03thIJs9dnvL4M5dzEfPmzUXWrV57AM1w2k4xHdk6+R+GebKyK30Ob5oFMJQQv/sC0XycR6VEJ+JMYVNj00LdzN2XnylAv6rLwUDov/g==" messageBytesBase64 := "SGVsbG8gd29ybGQh" // 替换为实际从钱包获取的用户公钥(Base64格式,32字节) publicKeyBase64 := "替换为你的用户公钥Base64字符串" // 解码Base64数据 signature, err := base64.StdEncoding.DecodeString(signatureBase64) if err != nil { fmt.Printf("解码签名失败: %v\n", err) return } msgBytes, err := base64.StdEncoding.DecodeString(messageBytesBase64) if err != nil { fmt.Printf("解码消息字节失败: %v\n", err) return } publicKey, err := base64.StdEncoding.DecodeString(publicKeyBase64) if err != nil { fmt.Printf("解码公钥失败: %v\n", err) return } // 验证签名 valid := ed25519.Verify(publicKey, msgBytes, signature) if valid { fmt.Println("签名验证通过") } else { fmt.Println("签名验证失败") } }
关键注意事项
- 公钥格式:Sui钱包返回的公钥是Base64编码的32字节Ed25519公钥,解码后长度必须为32字节,否则验证会失败
- 消息匹配:必须使用签名对应的
messageBytes解码后的字节数组,不能直接用原始字符串——JS端是通过TextEncoder将字符串转为UTF-8字节,Golang解码messageBytesBase64即可得到完全一致的字节序列 - 签名格式:JS端返回的签名是Base64编码的64字节Ed25519签名,解码后可直接传入验证函数
内容的提问来源于stack exchange,提问作者jiahao liu
相关产品推荐
相关产品推荐

