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

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

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

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

1. ethers 消息签名

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

      import { ethers } from 'ethers'; // 导入ethers packageconst 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-191hashedMessage := []byte("\x19Ethereum Signed Message:\n" + strconv.Itoa(len(message)) + message)hash := crypto.Keccak256Hash(hashedMessage)// Get the bytes of the signed messagedecodedMessage := 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 messagesigPublicKeyECDSA, 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 Signatureinitdata := "登录网站"sign := "0x5321f24a057500605f1d894c2be7cb7f196ba2444e8f6815af261efbcb9d272f70d327f146553c3d51cf1816823dba6254d5500a69b4197e9f4839e0971cf89d1b"publicKey := "0x0bDCC0C6eAc88439fb57b90977714b7430c3c623"publicKey2, err := signature.VerifyMessage(context.Background(), initdata, sign)fmt.Println(publicKey == publicKey2, err)
}

验证结果正确。

3. 总结

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

Go-ethereum 解析ethersjs中产生的签名信息相关推荐

  1. 区块链 以太坊 交易结构、执行、存储 解析 交易中为什么没有包含发送者地址这条数据

    一. 交易的结构 1. Transaction结构 交易结构定义在 core/types/transaction.go 中: type Transaction struct {//交易数据data t ...

  2. 从源码角度解析Android中APK安装过程

    从源码角度解析Android中APK的安装过程 1. Android中APK简介 Android应用Apk的安装有如下四种方式: 1.1 系统应用安装 没有安装界面,在开机时自动完成 1.2 网络下载 ...

  3. DNS解析过程中不得不知道的那些事

    DNS解析过程中不得不知道的那些事 0x01 定义 0x02 域名结构 0x03 DNS查询方式 1.从查询方式分类 2.从查询内容: 0x04 常见的DNS资源记录 1.A/AAAA记录 2.CNA ...

  4. PackageManagerService启动详解(五)之Android包信息体和解析器(中)

        PKMS启动详解(五)之Android包信息体和包解析器(中) Android PackageManagerService系列博客目录: PKMS启动详解系列博客概要 PKMS启动详解(一)之 ...

  5. Fabric 账本数据块结构解析(一):如何解析账本中的智能合约交易数据

    id:BSN_2021 公众号:BSN研习社 作者:红枣科技高晨曦 背景:BSN公网Fabric联盟链的出现降低了使用区块链的难度,在通过BSN城市节点网关发起交易时,只能获取最基本交易信息,想要展示 ...

  6. Fabric 账本数据块结构解析(二):如何解析账本中的配置块数据

    id:BSN_2021 公众号:BSN 研习社 作者:红枣科技高晨曦 背景:BSN公网Fabric联盟链的出现降低了使用区块链的难度,但在部分特定环境中,仍需要自己搭建Fabric环境时,了解Fabr ...

  7. 无法在证书存储区中找到清单签名证书的解决办法

    以前的一个项目今天打开忽然提示说"无法在证书存储区中找到清单签名证书",很郁闷,不知道怎么回事.最好在 工程属性里面--签名--为Clickonce清单签名 去掉 .再次生成居然成 ...

  8. 从多维度解析神经科学中的视觉编码

    来源:脑人言 一棵树是如何被知觉为"一棵树"?我又是如何认出你是"你"?我们可能会说这很大程度依赖于我们的视觉感知.以后者为例,从你身上反射的光将你的信息传入我 ...

  9. 2dx解析cocosbuilder中使用layer时的缺陷

    2dx解析cocosbuilder中使用layer时的缺陷 cocos2d-x 3.7 cocosbuilder中的layer通常会用到触摸属性: 但是在2dx解析布局文件的时候,却很多属性都没解析: ...

最新文章

  1. VTK:相互作用之InteractorStyleTerrain
  2. 信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮
  3. asp.net下向数据库存储和读取图片示例
  4. pd.get_dummies()
  5. python之绝对导入和相对导入
  6. bapi sap 创建物料_DEMO: MIRO 根据物料创建贷项凭证BAPI_INCOMINGINVOICE_CREATE
  7. python网络编程linux pdf_Python网络编程:Linux epoll
  8. Input禁用文本框
  9. 2022年最新iOS面试题(附答案)
  10. Emulex LightPulse FC9002L光纤卡安装日志
  11. 笔记本电脑光驱位加固态硬盘,重装系统,UEFI启动,解决电脑开机慢的问题
  12. html向下的箭头符号怎么打,向下的箭头怎么打
  13. opencv分离RGB三通道
  14. web-sso 系统集成 单点登录
  15. 零 XML 多表联查
  16. 双链表(double_linked_list):(增、删、改、查、逆置)的C++的例子,稍微改一下,就成C。
  17. (一)Flink从入门到项目实战——Flink介绍——董长春
  18. 微电影制作迅速走红的原因
  19. 菜鸟学习OGRE和天龙八部之三: GridInfo和HeightMap文件的数据格式(已更正)
  20. “图发展”与“保安全”:大数据今后怎么玩?

热门文章

  1. IDEA官方历史版本下载
  2. 2022秋 - C实验A类 –实验1 顺序结构
  3. 个人建站需要哪些能力?
  4. 互联网企业数据安全体系建设
  5. Python Gensim文本分析——从文本预处理到TFIDF、LDA建模分析
  6. DAI(dynamic arp inspection)
  7. AAAI'23 | 两篇大厂CTR预估最新工作
  8. 王俊杰:5G为零售带来“五新”发展机遇
  9. 骷髅(skeleton)
  10. 如何选择一个合适高效率的光纤熔接机--TFN FM-82