区块链去中心化思想无处不在,比如最近使用个体抗原自检替代大规模的中心化核酸检测,就是去中心化思想的落地实践,避免了大规模聚集导致的交叉感染,提高了检测效率,本次我们使用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)以及验签操作相关推荐

  1. 对标以太坊的EOS再火,也拼不过InterValue的区块链4.0

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 2017年6月26日上线的数字货币EOS,仅用5天时间,就融了1.85亿美元,一举打破ICO的融资记录. 至2018年4 ...

  2. 以太坊DApp开发入门教程——Node.js和truffle框架打造区块链投票系统

    第一节 课程概述 本课程面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 -- 区块链投票系统. 通过本课程的学习,你将掌握: 以太坊区块链的 ...

  3. 8支团队正在努力构建下一代以太坊Ethereum 2.0

    "我们不想在构建 Ethereum 2.0时重新造轮子." 谈到开发人员为 Ethereum 区块链进行两个独立的升级(一个称为 Ethereum 2.0,另一个称为 Ethere ...

  4. 8支团队正在努力构建下一代区块链以太坊Ethereum 2.0

    2019独角兽企业重金招聘Python工程师标准>>> "我们不想在构建 Ethereum 2.0时重新造轮子." 谈到开发人员为 Ethereum 区块链进行两 ...

  5. 白皮书 | 以太坊 (Ethereum ):下一代智能合约和去中心化应用平台

    当中本聪在2009年1月启动比特币区块链时,他同时向世界引入了两种未经测试的革命性的新概念.第一种就是比特币(bitcoin),一种去中心化的点对点的网上货币,在没有任何资产担保.内在价值或者中心发行 ...

  6. 以太坊java开发指南_java以太坊开发库ethereumj

    EthereumJ是以太坊协议的纯Java实现.有关以太坊及其目标的高级信息,请访问ethereum.org,其 白皮书 提供了一个完整的概念的概述,和 黄皮书 一起提供了协议的正式定义. 我们尽可能 ...

  7. 以太坊(Ethereum) - 分布式应用(DApp)

    章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...

  8. 【以太坊】ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境...

    ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境 前言 为了保证环境稳定,我从头开了一个虚拟机. 环境如下 xiaoyu@xiaoyu ...

  9. 使用Ethereum C++ Aleth客户端创建具有两个同步节点的以太坊Ethereum私有网络

    Creating A Private Network With Two Syncing Nodes 本文是前面两篇文章的延续,链接分别为:Windows10安装Aleth和使用Ethereum C++ ...

最新文章

  1. Android 进阶自定义View(4)图表统计LineChartView曲线图的实现
  2. 如何进行大数据分析及处理?
  3. “云上金融,智创未来” 腾讯“云+未来”峰会金融专场在广州举行
  4. PyTorch 0.4新版本 升级指南 no_grad
  5. 利用ArcGIS Python批量拼接裁剪遥感影像(arcpy batch processing)
  6. oracle导出字符集命令,Oracle数据的导出及导入实现
  7. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界:光照与材质专场...
  8. 牛客NOIP2021提高组OI赛前模拟赛第一场T3——与巨(数学)
  9. DELL服务器双网卡绑定方法
  10. VO中的Long类型数据通过注解的方式直接转换为String,防止数据失真
  11. jsf集成spring_JSF Spring Hibernate集成示例教程
  12. 破解“冲动消费”难题,“李佳琦们”掀起618“反效率”之风
  13. 《动手学深度学习》| 2 深度学习基础
  14. asic面试题目 英伟达_英伟达笔试题目ASIC|英伟达笔试题
  15. 东北大学OJ-1215: 实验4-14:字符加密
  16. keepalived配置文件相关简单解释
  17. pycharm不显示一部分下划线和删除线(pep8,typo引起)
  18. hdu 杭电1429 胜利大逃亡(续)
  19. 让云助力企业数字化转型
  20. Cadence IC设计环境搭建( IC617+MMSIM151+Calibre2015)

热门文章

  1. Unity中旋转方式的探究与对万向节死锁(Gimbal Lock)的理解
  2. 自动生成 MultiTestManager 的执行文件mtm
  3. 【maya】metaHuman导入maya报错的问题
  4. 多IP服务器自动切换内网IP易语言源码
  5. 项目经理责任制核心要点之一:明确项目经理的责权利
  6. access日历_MS Access日历-概述
  7. LoadRunner11安装和破解(win 7)
  8. java 乐器钢琴_Java swing实现录音、播放、180多种乐器模拟、电子钢琴等功能
  9. 去掉桌面图标文字蓝色阴影
  10. 【考研路线规划】仅供参考