虽然go-ethereum是官方客户端,但是官方文档中提供的都是客户端命令行操作,没有针对签名有具体的描述。
查阅资料时发现下面这个网站,看域名像是官方提供的说明文档,但不确定。
https://goethereumbook.org/zh/signature-generate/
这个网站上的签名代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package main import ( "fmt" "log" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" ) func main() { privateKey, err := crypto.HexToECDSA( "fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19" ) if err != nil { log.Fatal(err) } data := []byte( "hello" ) hash := crypto.Keccak256Hash(data) fmt.Println(hash.Hex()) // 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8 signature, err := crypto.Sign(hash.Bytes(), privateKey) if err != nil { log.Fatal(err) } fmt.Println(hexutil.Encode(signature)) // 0x789a80053e4927d0a898db8e065e948f5cf086e32f9ccaa54c1908e22ac430c62621578113ddbb62d509bf6049b8fb544ab06d36f916685a2eb8e57ffadde02301 } |
这样得到的签名无法通过web3.js/web3.j的验证。
原因是签名数据还需要签名前缀,以及数据的长度。
如下:
1 2 3 4 5 6 7 8 9 10 11 | message := "hello world" message = fmt.Sprintf( "\x19Ethereum Signed Message:\n%d%s" , len(message), message) // 数据签名 data := []byte(message) encodedData := crypto.Keccak256(data) signature, err := crypto.Sign(encodedData, privateKey) if err != nil { return err } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2018-04-13 centos7 安装、使用git