Golang语言和区块链理论学习完毕后,快速入门方法无疑是项目实战。本文将参考https://jeiwan.cc/tags/blockchain/教程,学习如何基于Go语言构建区块链。

1、引言

本文为原文第5部分学习笔记,该部分主要是实现blockchain的地址概念。一个比特币地址的例子:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa。这是世界上首个比特币地址,据说属于比特币发明人中本聪。比特币地址是公开的,如果你想转给某人一些BTC,那么就需要知道其地址。这些地址并不代表钱包,仅仅是具备可读格式的公钥。在比特币世界中,你的ID是一个密钥对(公/私钥) ,该密钥对需要保存在你的电脑或者其他你可以直接存取到它的设备。比特币通过密码学算法来创建密钥对,从而保证在不能直接存取该密钥情况下,没人可以动你的钱。 本质上,比特币钱包就是一个密钥对。当你安装钱包客户端或者比特币客户端创建一个新地址时,一个密钥对将会被创建。在比特币世界,谁拥有密钥,谁就可以掌控属于该密钥的钱。

2、Blockchain地址背景知识

在数学和密码学中,数字签名算法保证:
1. 当数据从发送者传给接受者时,数据不会被篡改
2. 数据被某个发送者创建
3. 该发送者不能拒绝发送数据

通过签名算法对数据进行处理后得到一个签名,该签名用于后续验证数据使用。数字签名使用私钥签名,公钥验证。
数据签名需要以下信息:
1. 要签名的数据
2. 私钥

数据签名过程生成一个签名,签名存储于TXI中。为了校验签名,需要如下信息:
1. 已经被签名的数据
2. 签名信息
3. 公钥

认证过程简而言之就是:核查用私钥加密数据后生成的签名,是否可以用来生成公钥。

让我们回顾一个交易的整个声明周期:
1. 伊始,仅仅有genesis block,该block包含一个coinbase交易。Coinbase交易不包含真是的TXI,因此不需要签名。Coinbase交易中的TXO包含哈希后的公钥(使用RIPEMD160(SHA256(PubKey)算法)。
2. 当有人消费时,新的交易被创建。该交易的TXI引用之前交易的TXO。每个TXI存储一个未哈希的公钥,和整个交易的签名。
3. 比特币中收到此交易的其他节点将进行验证,将核查:TXI中公钥的hash值是否和其引用的TXO的公钥匹配(这保证发送者只能使用属于其拥有的货币) ;签名是否正确(这保证该交易是被一个真实的货币所有者创建的) 。
4. 当一个矿工准备好要挖一个新block时,该交易将放入到block中并开始挖矿。
5. 当挖到一个新block后,网络中的其它节点会收到一个消息:该block被挖到了,同时将该block添加到blockchain中。
6. 在block被添加到blockchain之后,交易完成,其TXO可以被新的交易所引用了。

比特币使用椭圆曲线算法生成私钥。椭圆曲线是一个复杂的数学概念,在这不对其进行详述(如果非常感兴趣,可以参考this gentle introduction to elliptic curves,再次提醒:一大堆数学公式!) 我们所需要知道的就是这些曲线可以生成非常大的随机数。比特币所使用的曲线算法将从0到2256随机选择一个数(这意味着有大概1077个随机数可供挑选,而宇宙可见范围内存在大约1078到1082个原子) ,这使得同一私钥被生成两次的可能为0。
此外,比特币使用ECDSA算法(Elliptic Curve Digital Signature Algorithm) 对交易进行签名。比特币使用Base58算法将公钥编码成可读格式的字符串。该算法与著名的Base64算法类似,但为了避免利用相似性进行攻击,Base58算法将一些字符移除了,因此没有0(数值0) 、O(o的大写形式) 、I(i的大写形式) 、l(L的小写形式) 。此外也没有+和/。

比特币地址由三部分组成:
Version Public key hash                                                                Checksum
00         62E907B15CBF27D5425399EBF6F0FB50EBB88F18   C29B7D93 3

3、EIPEMD160第三方扩展包安装

按照教程实现代码后,编译运行提示如下错误信息:

D:\go\src\Blockchain5>Blockchain5 createwallet
panic: crypto: requested hash function #9 is unavailablegoroutine 1 [running]:
crypto.Hash.New(0x9, 0x40, 0x40)C:/Go/src/crypto/crypto.go:89 +0x117
main.HashPubKey(0xc042096100, 0x40, 0x40, 0xc0420491c0, 0xc0420491e0, 0xc042049180)D:/go/src/Blockchain5/wallet.go:49 +0x91
main.Wallet.GetAddress(0x637da0, 0xc04204f540, 0xc0420491c0, 0xc0420491e0, 0xc042049180, 0xc042096100, 0x40, 0x40, 0x0, 0x0, ...)D:/go/src/Blockchain5/wallet.go:34 +0x61
main.(*Wallets).CreateWallet(0xc0420724e8, 0x6365e0, 0xc042066a80)D:/go/src/Blockchain5/wallets.go:31 +0x5f
main.(*CLI).createWallet(0xc04206ff70)D:/go/src/Blockchain5/cli_createwallet.go:7 +0x3e
main.(*CLI).Run(0xc04206ff70)D:/go/src/Blockchain5/cli.go:100 +0x5a8
main.main()D:/go/src/Blockchain5/main.go:5 +0x32

该信息提示加密算法ripemd160找不到,这说明标准包中不含该算法的实现,需要手动安装扩展包。

浏览器输入该安装包路径:“golang.org/x/crypto/ripemd160”,提示无法访问,说明该网站在国内被禁了,需要先利用VPN等方式连接到外网,解决网络问题。

到Go 语言包管理网站 输入完整包名,如:“golang.org/x/crypto/ripemd160”,回车或点击【Go!】。如果包名输入正确的话,下面会有提示下载过程,如果服务器上 `go get` 正确完成,下载地址列表会列出所有相关的包,点击下载即可。

接下来,复制 golang.org.x.crypto.tar.gz 到 $GOPATH 目录的 src 目录下,解压缩。接下来安装这个包:

$ go install golang.org/x/crypto/ripemd160

  

安装完成后,在wallet.go中 import “golang.org/x/crypto/ripemd160”

// HashPubKey hashes public key
func HashPubKey(pubKey []byte) []byte {publicSHA256 := sha256.Sum256(pubKey)RIPEMD160Hasher := ripemd160.New()_, err := RIPEMD160Hasher.Write(publicSHA256[:])if err != nil {log.Panic(err)}publicRIPEMD160 := RIPEMD160Hasher.Sum(nil)return publicRIPEMD160
}

  

重新编译运行,即可,结果如下:

D:\go\src\Blockchain5>Blockchain5 createwallet
Your new address: 12CNMc5CcitvdwUdy6gN4KUCUZLxNfu18x

转载于:https://www.cnblogs.com/yxdz-hit/p/8666464.html

基于Go语言构建区块链:part5相关推荐

  1. 基于Java语言构建区块链(四)—— 交易(UTXO)

    基于Java语言构建区块链(四)-- 交易(UTXO) 2018年03月11日 00:48:01 wangwei_hz 阅读数:909 标签: 区块链比特币 更多 个人分类: 区块链 文章的主要思想和 ...

  2. 基于Java语言构建区块链(五)—— 地址(钱包)

    基于Java语言构建区块链(五)-- 地址(钱包) 2018年03月25日 18:02:06 wangwei_hz 阅读数:1292更多 个人分类: 区块链bitcoin比特币 文章的主要思想和内容均 ...

  3. 基于Java语言构建区块链(六)—— 交易(Merkle Tree)

    基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...

  4. 基于Java语言构建区块链(一)—— 基本原型

    最终内容请以原文为准:https://wangwei.one/posts/df1... 引言 区块链技术是一项比人工智能更具革命性的技术,人工智能只是提高了人类的生产力,而区块链则将改变人类社会的生产 ...

  5. 区块链java语言,基于Java语言构建区块链(一)—— 基本原型

    引言 区块链技术是一项比人工智能更具革命性的技术,人工智能只是提高了人类的生产力,而区块链则将改变人类社会的生产关系,它将会颠覆我们人类社会现有的协作方式.了解和掌握区块链相关知识和技术,是我们每位开 ...

  6. vtk删除一个actor_如何构建一个基于actor的简单区块链

    vtk删除一个actor Scalachain is a blockchain built using the Scala programming language and the actor mod ...

  7. fcn从头开始_如何使用Go从头开始构建区块链

    fcn从头开始 介绍 (Introduction) With Web 3.0 and blockchain becoming more mainstream every day, do you kno ...

  8. 基于共识算法和区块链模拟实现超级账本

    基于共识算法和区块链模拟实现超级账本 实验语言:GO 实验环境:GoLand 2022.1 : go 1.13.4.widows-amd64.msi :curl-7.83.1 实验中使用的开源包: h ...

  9. 银心科技与黑萤科技达成战略合作,联合构建区块链数据库存储生态至高点

    银心科技与黑萤科技达成战略合作,联合构建区块链数据库存储生态至高点 元为开始,旦为天明,2019年元月,分布式存储领域利好不断,先是海外知名项目.全球首个区块链数据库存储ORA甲骨链在熊市逆势获得千万 ...

最新文章

  1. arcgis加载天地图_ArcGIS Runtime SDK for Android100.5.0端加载天地图服务
  2. [转]nginx反向代理网站(网易、百度之类的)
  3. Java 数组转 List 的三种方式及对比
  4. 无线网络的基础及优化方案
  5. linux更新模块,GNOME 3.29.3 发布,大量模块更新及功能改进
  6. 使用反射复制一个JavaBean的对象
  7. windows 一键切换ip dns脚本
  8. 竞品分析 | 荔枝VS喜马拉雅FM:有声音频APP的发展与社交
  9. 十大排序算法Java
  10. html5显示文件后缀,如何显示文件后缀名
  11. Mac系统中键盘失灵后的解决小技巧
  12. 微信群聊在哪个服务器,咱们谈谈微信群,为什么很多的聊天群变得越来越冷漠了...
  13. 微信小程序嵌套h5页面+发布微信小程序(超级简单)
  14. product相关函数(excel)
  15. coursera 吴恩达四卷积神经网络第四周 Art Generation with Neural Style Transfer
  16. libreoffice linux命令行,linux下使用libreoffice 命令行转化进行excel转PDF的排版问题
  17. Redis系列之——Redis-Cluster
  18. 人工智能学习笔记 python实现梯度下降法对多元函数求解
  19. PTA 7-13 小明的家庭合影
  20. Oracle 数据库的打开与关闭

热门文章

  1. python cocos2dx_cocos2dx 3.0 环境搭建、项目编译于运行
  2. clone repository in git shell under windows
  3. 第二章 如何在VS2008里面编译CG
  4. 创建窗口,输入一个无符号整数,输出其对应的二进制数
  5. android 连接ble键盘,如何在Android上以编程方式配对和连接HID蓝牙设备(蓝牙键盘)...
  6. html怎么直接给服务器发消息,HTML5教程之服务器发送事件
  7. pythonunicode和str_python2 中 unicode 和 str 之间的转换及与python3 str 的区别
  8. java云端开发_云端编写Java代码的方法
  9. matlab晶闸管没有触发就导通,单相全控桥式晶闸管整流电路(纯电阻负载)
  10. android.opengl.GLSurfaceView概述