You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golang中验证Sui signMessage签名?

在Golang中验证Sui钱包signMessage的签名结果

Sui钱包的signMessage功能基于Ed25519椭圆曲线签名算法,和JS端tweetnacl的实现完全兼容。在Golang中可直接用标准库crypto/ed25519完成验证,以下是具体实现步骤和示例代码:

核心验证步骤

  1. 解码Base64格式的签名、原始消息字节(messageBytes)和用户公钥
  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:07:36