新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作
区块链去中心化思想无处不在,比如最近使用个体抗原自检替代大规模的中心化核酸检测,就是去中心化思想的落地实践,避免了大规模聚集导致的交叉感染,提高了检测效率,本次我们使用Ethereum最新的ethersV5.0以上版本链接去中心化区块链钱包,并且通过后端Golang1.18服务进行验签。
在之前的一篇文章:青山不遮,毕竟东流,集成Web3.0身份钱包MetaMask以太坊一键登录(Tornado6+Vue.js3)中,我们使用的是ethersV4.0版本链接Metamask钱包,后端使用基于Python3.10的Tornado6.0框架,为了避免同质化,这里换成Okc钱包,客户端插件安装地址:https://chrome.google.com/webstore/detail/okx-wallet/mcohilncbfahbmgdjkbpemcciiolgcge
前端链接浏览器钱包
首先卸载Vue2.0项目:
npm uninstall vue-cli -g
这里node版本要在8.9以上,npm版本要在6以上;
随后安装Vue3.0以上版本:
npm install -g @vue/cli
然后安装pnpm:
npm install -g pnpm
pnpm解决了传统npm的node_modules依赖困境,主要通过软链接和硬链接的结合使用,最终达到节省磁盘空间,安装速度快,严格高效等目的,这里推荐使用pnpm进行包管理。
接着,在当前项目中安装ethers库:
pnpm install ethers@5.7.2 --save
注意这里版本要求v5.0以上。
根据ethers5.4官方文档所述:https://docs.ethers.io/v5/getting-started/#getting-started–connecting-rpc
ethers5.0版本支持异步async操作,提高了效率,async函数就是使用async关键字声明的函数。它是 AsyncFunction 构造函数的实例,并且其中允许使用 await 关键字。async 和 await 关键字让我们可以用一种更简洁的方式写出基于 Promise 的异步行为,而无需刻意地链式调用 promise。
声明异步链接方法:
//链接逻辑 connect:async function(){ },
随后请求链接当前的区块链钱包,并且异步获取公钥地址:
const provider = new ethers.providers.Web3Provider(window.ethereum); const accounts = await provider.send("eth_requestAccounts", []);
打印钱包地址:
console.log(accounts);
如图所示:
这里已经打印出了okc钱包的公钥地址,随后生成签名:
const signer = provider.getSigner(); var rightnow = (Date.now()/1000).toFixed(0) console.log(rightnow); signer.signMessage("Signing in at "+rightnow) .then((signature) => { //打印签名和公钥 console.log(accounts[0],signature); });
这里通过provider对象获取签名者对象signer,接着调用signMessage方法来进行签名操作,加签算法采用最简单的字符串+时间戳的形式。
前端返回签名和公钥地址:
0x5cae6c39a56d99d68e7a20c76da0ec387e34249b
0x1093b6dc7c6ae1340b2ebcf819dac1a7160b69a2abbb14d86a0696bd96d6b36923d5f3f82588f30a9353b327014338f51d4e7a90baa8052791a8017f156b57511c
后端Golang验签
验签的目的很好理解,如果在链接钱包的一瞬间,客户端被监听的其他软件恶意篡改公钥地址,那么很可能会给客户造成不可挽回的经济损失,所以暴露在前端的一切数据都需要后端进行校验,之前我们采用的是Python3.10版本进行验签操作:
from web3.auto import w3
from eth_account.messages import defunct_hash_message
import time public_address = "0x5cae6c39a56d99d68e7a20c76da0ec387e34249b"
signature = "0xc7b06789e6710652d8540487055e0e75918c9c4366ec47c9e7008760df1dedd6506a908f466e448481afed3fe009bbdbfdfa16c28585eff68be54d600083d4251b" #rightnow = int(time.time()) rightnow = 1670142219 print(rightnow) original_message = 'Signing in at {}'.format(rightnow) message_hash = defunct_hash_message(text=original_message) signer = w3.eth.account.recoverHash(message_hash, signature=signature) print(signer)
程序返回:
1670142219
0x5cAE6c39A56d99d68e7A20c76da0ec387e34249b
这里通过签名反向解析出了公钥地址,并且和前端获取的地址保持一致。
下面我们采用Golang1.18版本来验签,看看有什么不一样,首先安装Golang1.18,请移步:兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00
随后安装基于Golang的Ethereum库:
go get github.com/storyicon/sigverify
根据官方文档指引:https://github.com/storyicon/sigverify
构建main.go文件:
package main import ( "fmt" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/storyicon/sigverify"
) func main() { valid, err := sigverify.VerifyEllipticCurveHexSignatureEx( ethcommon.HexToAddress("0x5cae6c39a56d99d68e7a20c76da0ec387e34249b"), []byte("Signing in at 1670142219"), "0xc7b06789e6710652d8540487055e0e75918c9c4366ec47c9e7008760df1dedd6506a908f466e448481afed3fe009bbdbfdfa16c28585eff68be54d600083d4251b", ) fmt.Println(valid, err) // true <nil>
}
这里sigverify.VerifyEllipticCurveHexSignatureEx方法有三个参数,分别是公钥地址,签名字符集以及前端返回的签名字符串,返回值为valid:
➜ mydemo git:(master) ✗ go run "/Users/liuyue/wodfan/work/mydemo/src/mytest.go"
true <nil>
如果验签通过会返回布尔值:true。
至此,后端验签流程就结束了。
结语
总体而言,前端Ethers采用了ES7新语法async/await实现了重大改进,它提供了一种使用同步代码样式异步链接钱包对象的方式,而且不会阻塞主线程,而后端Golang作为编译型语言验签流程反而比解释型的Python更加简单方便。
新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作相关推荐
- 对标以太坊的EOS再火,也拼不过InterValue的区块链4.0
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 2017年6月26日上线的数字货币EOS,仅用5天时间,就融了1.85亿美元,一举打破ICO的融资记录. 至2018年4 ...
- 以太坊DApp开发入门教程——Node.js和truffle框架打造区块链投票系统
第一节 课程概述 本课程面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 -- 区块链投票系统. 通过本课程的学习,你将掌握: 以太坊区块链的 ...
- 8支团队正在努力构建下一代以太坊Ethereum 2.0
"我们不想在构建 Ethereum 2.0时重新造轮子." 谈到开发人员为 Ethereum 区块链进行两个独立的升级(一个称为 Ethereum 2.0,另一个称为 Ethere ...
- 8支团队正在努力构建下一代区块链以太坊Ethereum 2.0
2019独角兽企业重金招聘Python工程师标准>>> "我们不想在构建 Ethereum 2.0时重新造轮子." 谈到开发人员为 Ethereum 区块链进行两 ...
- 白皮书 | 以太坊 (Ethereum ):下一代智能合约和去中心化应用平台
当中本聪在2009年1月启动比特币区块链时,他同时向世界引入了两种未经测试的革命性的新概念.第一种就是比特币(bitcoin),一种去中心化的点对点的网上货币,在没有任何资产担保.内在价值或者中心发行 ...
- 以太坊java开发指南_java以太坊开发库ethereumj
EthereumJ是以太坊协议的纯Java实现.有关以太坊及其目标的高级信息,请访问ethereum.org,其 白皮书 提供了一个完整的概念的概述,和 黄皮书 一起提供了协议的正式定义. 我们尽可能 ...
- 以太坊(Ethereum) - 分布式应用(DApp)
章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...
- 【以太坊】ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境...
ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境 前言 为了保证环境稳定,我从头开了一个虚拟机. 环境如下 xiaoyu@xiaoyu ...
- 使用Ethereum C++ Aleth客户端创建具有两个同步节点的以太坊Ethereum私有网络
Creating A Private Network With Two Syncing Nodes 本文是前面两篇文章的延续,链接分别为:Windows10安装Aleth和使用Ethereum C++ ...
最新文章
- Android 进阶自定义View(4)图表统计LineChartView曲线图的实现
- 如何进行大数据分析及处理?
- “云上金融,智创未来” 腾讯“云+未来”峰会金融专场在广州举行
- PyTorch 0.4新版本 升级指南 no_grad
- 利用ArcGIS Python批量拼接裁剪遥感影像(arcpy batch processing)
- oracle导出字符集命令,Oracle数据的导出及导入实现
- 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场...
- 牛客NOIP2021提高组OI赛前模拟赛第一场T3——与巨(数学)
- DELL服务器双网卡绑定方法
- VO中的Long类型数据通过注解的方式直接转换为String,防止数据失真
- jsf集成spring_JSF Spring Hibernate集成示例教程
- 破解“冲动消费”难题,“李佳琦们”掀起618“反效率”之风
- 《动手学深度学习》| 2 深度学习基础
- asic面试题目 英伟达_英伟达笔试题目ASIC|英伟达笔试题
- 东北大学OJ-1215: 实验4-14:字符加密
- keepalived配置文件相关简单解释
- pycharm不显示一部分下划线和删除线(pep8,typo引起)
- hdu 杭电1429 胜利大逃亡(续)
- 让云助力企业数字化转型
- Cadence IC设计环境搭建( IC617+MMSIM151+Calibre2015)