脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go-ethereum 解析ethersjs中产生的签名信息思路详解

Go-ethereum 解析ethersjs中产生的签名信息思路详解

2022-08-31 15:32Shanshan yuan Golang

这篇文章主要介绍了Go-ethereum 解析ethersjs中产生的签名信息,我们解析签名的需要知道,签名的消息,签名,和公钥,按照这个思路,我们可以通过ethers实现消息的签名,也可以通过go-ethereum实现,需要的朋友可以参考下

Go-ethereum 解析ethersjs中产生的签名信息

在签名验证的过程中,我们判断签名正确的前提是,签名解析后的公钥,和发起这次动作的人是同一个公钥。
我们解析签名的需要知道,签名的消息,签名,和公钥

按照这个思路,我们可以通过ethers实现消息的签名,也可以通过go-ethereum实现。

在签名的解析过程中,通常是由前端将上述的的已知道信息发送到后端,后端然后针对信息进行解析工作。
后端的服务中可以使用node或者golang进行编写。本文将讲述这两种解析形式。

1. ethers 消息签名

Ethers 能够通过简单的编程语句实现Metamask对某个消息进行签名
其实现的语句为:

Go-ethereum 解析ethersjs中产生的签名信息思路详解

?
1
2
3
4
5
6
7
8
9
10
11
12
import { ethers } from 'ethers'; // 导入ethers package
 const provider = new ethers.providers.Web3Provider(window.ethereum);
 console.log(provider) // 获取provider,也就是rpc服务
// 请求访问钱包
 await provider.send("eth_requestAccounts", [])
 
 const signer = provider.getSigner(); //获取签名者信息
 this.userPk = await signer.getAddress(); // 获取签名者公钥
 console.log(this.userPk)
 let signature = await signer.signMessage("登录网站") // metamask 对“登录网站进行签名”
 this.loginWithWeb3(this.userPk) // 其他业务模块
 console.log(signature) // 打印签名

1.1 ethers 对签名消息进行解析

Go-ethereum 解析ethersjs中产生的签名信息思路详解

?
1
console.log("verifyMessage:",ethers.utils.verifyMessage("登录网站" , signature))

简单的一句语句就可以验证签名。

2. Golang 签名解析

golang 中也可以针对签名进行解析,原理和ethers中的verifyMessage 类似,但是在解析的过程中,需要转化:因为签名死按照EIP-191标准,需要针对签名的消息添加前缀:“\x19Ethereum Signed Message:\n”

以下是完整的代码,其中的参数全部为string类型,返回签名中的公钥。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func VerifyMessage(ctx context.Context, message string, signedMessage string) (string, error) {
    // Hash the unsigned message using EIP-191
    hashedMessage := []byte("\x19Ethereum Signed Message:\n" + strconv.Itoa(len(message)) + message)
    hash := crypto.Keccak256Hash(hashedMessage)
 
    // Get the bytes of the signed message
    decodedMessage := hexutil.MustDecode(signedMessage)
 
    // Handles cases where EIP-115 is not implemented (most wallets don't implement it)
    if decodedMessage[64] == 27 || decodedMessage[64] == 28 {
        decodedMessage[64] -= 27
    }
 
    // Recover a public key from the signed message
    sigPublicKeyECDSA, err := crypto.SigToPub(hash.Bytes(), decodedMessage)
    if sigPublicKeyECDSA == nil {
        err = errors.New("Could not get a public get from the message signature")
    }
    if err != nil {
        return "", err
    }
 
    return crypto.PubkeyToAddress(*sigPublicKeyECDSA).String(), nil
}

运行测试代码验证代码的正确性

?
1
2
3
4
5
6
7
8
9
func TestVerifySignature(t *testing.T) {
    var signature Signature
    initdata := "登录网站"
    sign := "0x5321f24a057500605f1d894c2be7cb7f196ba2444e8f6815af261efbcb9d272f70d327f146553c3d51cf1816823dba6254d5500a69b4197e9f4839e0971cf89d1b"
    publicKey := "0x0bDCC0C6eAc88439fb57b90977714b7430c3c623"
 
    publicKey2, err := signature.VerifyMessage(context.Background(), initdata, sign)
    fmt.Println(publicKey == publicKey2, err)
}

Go-ethereum 解析ethersjs中产生的签名信息思路详解

验证结果正确。

3. 总结

在golang 中针对签名的解析需要考虑到签名消息的前缀问题,否则不能够正确将解析。

到此这篇关于Go-ethereum 解析ethersjs中产生的签名信息的文章就介绍到这了,更多相关Go-ethereum签名内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/YSS_33521/article/details/126539987

延伸 · 阅读

精彩推荐
  • GolangGo Plugins插件的实现方式

    Go Plugins插件的实现方式

    目前 Plugins 仅在 Linux、FreeBSD 和 macOS 上受支持,且只支持 golang 调用,今天通过本文给大家介绍Go Plugins插件的实现方式,感兴趣的朋友一起看看吧...

    togettoyou6652021-09-15
  • Golang教你一招完美解决vscode安装go插件失败问题

    教你一招完美解决vscode安装go插件失败问题

    VSCode是我们开发go程序的常用工具,但是安装VSCode成功后,创建一个.go文件居然提示错误了,所以下面下面这篇文章主要给大家介绍了如何通过一招完美解决v...

    defer哈哈3802022-07-20
  • GolangGo语言基础switch条件语句基本用法及示例详解

    Go语言基础switch条件语句基本用法及示例详解

    这篇文章主要为大家介绍了Go语言基础switch条件语句基本用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...

    枫少文7872021-12-07
  • GolangGolang 运算符及位运算详解

    Golang 运算符及位运算详解

    这篇文章主要介绍了Golang 运算符及位运算详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Payne-Wu13662021-03-03
  • Golang减少 golang 二进制文件大小操作

    减少 golang 二进制文件大小操作

    这篇文章主要介绍了减少 golang 二进制文件大小操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    疯疯癫癫6372021-03-04
  • Golanggolang 自旋锁的实现

    golang 自旋锁的实现

    这篇文章主要介绍了golang 自旋锁的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    one_zheng5112020-05-21
  • Golanggolang高性能的http请求 fasthttp详解

    golang高性能的http请求 fasthttp详解

    fasthttp 是 Go 的快速 HTTP 实现,当前在 1M 并发的生产环境使用非常成功,可以从单个服务器进行 100K qps 的持续连接,总而言之,fasthttp 比 net/http 快 10 倍,...

    pebblecome10942021-11-13
  • Golanggolang解析yaml文件操作

    golang解析yaml文件操作

    这篇文章主要介绍了golang解析yaml文件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    思维的深度16302021-03-20