热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于Go语言构建区块链:part5

Golang语言和区块链理论学习完毕后,快速入门方法无疑是项目实战。本文将参考https:jeiwan.cctagsblockchain教程,学习如何基于Go语言构建区块链。1
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,再次提醒:一大堆数学公式!) 我们所需要知道的就是这些曲线可以生成非常大的随机数。比特币所使用的曲线算法将从02256随机选择一个数(这意味着有大概1077个随机数可供挑选,而宇宙可见范围内存在大约10781082个原子) ,这使得同一私钥被生成两次的可能为0
此外,比特币使用ECDSA算法(Elliptic Curve Digital Signature Algorithm) 对交易进行签名。比特币使用Base58算法将公钥编码成可读格式的字符串。该算法与著名的Base64算法类似,但为了避免利用相似性进行攻击,Base58算法将一些字符移除了,因此没有0(数值0) 、Oo的大写形式) 、Ii的大写形式) 、lL的小写形式) 。此外也没有+/

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

3、EIPEMD160第三方扩展包安装 

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

D:\go\src\Blockchain5>Blockchain5 createwallet
panic: crypto: requested hash function #9 is unavailable

goroutine 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




 


推荐阅读
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本文详细介绍了 Java 中遍历 Map 对象的几种常见方法及其应用场景。首先,通过 `entrySet` 方法结合增强型 for 循环进行遍历是最常用的方式,适用于需要同时访问键和值的场景。此外,还探讨了使用 `keySet` 和 `values` 方法分别遍历键和值的技巧,以及使用迭代器(Iterator)进行更灵活的遍历操作。每种方法都附有示例代码和具体的应用实例,帮助开发者更好地理解和选择合适的遍历策略。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • Java学习第10天:深入理解Map接口及其应用 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 通过使用七牛云存储服务,本文详细介绍了如何将本地图片高效上传至云端,并实现了内容的便捷管理。借助七牛云的 Python SDK,文章提供了从认证到文件上传的具体代码示例,包括导入必要的库、生成上传凭证以及处理文件路径等关键步骤。此外,还探讨了如何利用七牛云的 URL 安全编码功能,确保数据传输的安全性和可靠性。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
author-avatar
Li-zHihuAn
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有