Go-ethereum 解析ethersjs中产生的签名信息思路详解
作者:Shanshan yuan 发布时间:2023-08-05 21:34:49
标签:Go-ethereum,签名
Go-ethereum 解析ethersjs中产生的签名信息
在签名验证的过程中,我们判断签名正确的前提是,签名解析后的公钥,和发起这次动作的人是同一个公钥。
我们解析签名的需要知道,签名的消息,签名,和公钥。
按照这个思路,我们可以通过ethers实现消息的签名,也可以通过go-ethereum实现。
在签名的解析过程中,通常是由前端将上述的的已知道信息发送到后端,后端然后针对信息进行解析工作。
后端的服务中可以使用node或者golang进行编写。本文将讲述这两种解析形式。
1. ethers 消息签名
Ethers 能够通过简单的编程语句实现Metamask对某个消息进行签名
其实现的语句为:
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 对签名消息进行解析
console.log("verifyMessage:",ethers.utils.verifyMessage("登录网站" , signature))
简单的一句语句就可以验证签名。
2. Golang 签名解析
golang 中也可以针对签名进行解析,原理和ethers中的verifyMessage 类似,但是在解析的过程中,需要转化:因为签名死按照EIP-191标准,需要针对签名的消息添加前缀:“\x19Ethereum Signed Message:\n”
以下是完整的代码,其中的参数全部为string类型,返回签名中的公钥。
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
}
运行测试代码验证代码的正确性
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)
}
验证结果正确。
3. 总结
在golang 中针对签名的解析需要考虑到签名消息的前缀问题,否则不能够正确将解析。
来源:https://blog.csdn.net/YSS_33521/article/details/126539987


猜你喜欢
- 一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python也是在python 3.4中引入了协程的
- 模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中。此类中的大部分函数都与对文件的操作方法类似。例:#coding=gb
- torch.Tensor有4种常见的乘法:*, torch.mul, torch.mm, torch.matmul. 本文抛砖引玉,简单叙述
- 一、算法简要我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类。这里,用到了数学中的sigmoid函数,sigmoid函数的具体表
- 本文实例讲述了Python数学形态学。分享给大家供大家参考,具体如下:一 原始随机图像1、代码import numpy as npimpor
- 引言写这篇文章主要是周末休息太无聊,看了看别人代码,发现基本上要么是多协程下载文件要么就只有单协程的断点续传,所以就试了试有进度条的多协程下
- 确定数据库内有多少记录,或者确定有多少记录达到了某些标准,这些用ASP完成并非难事。如果你采用了正确的游标类型,你可以用RecordCoun
- Python input 等待键盘输入,超时选择默认值,释放input,之后重新进入等待键盘输入状态,直到用户输入可用数据。一、调用 fun
- Python批量识别图片指定区域文字内容,供大家参考,具体内容如下简介对于一张图片,需求识别指定区域的内容1.截取原始图上的指定图片当做模板
- 1. 程序背景之前做文件批量移动的时候不小心多加了一个pdf后缀,但问题不大,几行代码就可以搞定~2. 程序要求将以下目录中文件夹中的有问题
- 上次学会了爬取图片,这次就想着试试爬取商家的联系电话,当然,这里纯属个人技术学习,爬取过后及时删除,不得用于其它违法用途,一切后果自负。首先
- 需求需要检查多个端口是否开放,没有找到第三方工具和服务来快速测通,就自己用python写了个脚本.原理是通过telnet来实现的,仅支持tc
- 银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的 A
- PySide是一个免费的软件,与PyQt不同之处在于使用了LGPL,允许PySide免费的开发商业软件。 PySide有15个模块。这些模块
- 前言:目前在研究易信公众号,想给公众号增加一个获取个人交通违章的查询菜单,通过点击返回查询数据。以下是实施过程。一、首先,用火狐浏览器打开X
- 一、下载PyCharm下载最新版PyCharm,官方地址:https://www.jetbrains.com/pycharm/downloa
- hashlibhashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256,
- 暂且放下你的编程语言来瞻仰下我所见过的最棒的标准库。为项目选择编程语言和挑选你最爱的球队不一样。应该从实用主义出发,根据特定的工作选择合适的
- Python中的array模块是一个预定义的数组,因此其在内存中占用的空间比标准列表小得多,同时也可以执行快速的元素级别操作,例如添加、删除
- 最近好多分享这个问题的代码,题目说的是用面向对象或者函数式编程,下面是PYTHON的实现示例#!/usr/bin/python#encodi