blockchain-ex1
实验一:Go语言基础&区块链中的典型密码算法
实验概述
Go(又称golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。由于实验环境是在go环境下开发,因此需要预先对go的语法规则有一个基本的了解。
实验准备
实验系统:
-
Mac OS (Apple M1 PRO)
环境配置
-
在Mac OS系统下使用homebrew安装go语言环境,并安装goLand
实验内容
实验1-1 入门练习
使用Go语言编写一段程序实现以下功能:给定三个不同的正整数,求它们的最小公倍数。
-
先使用辗转相除法设计最大公因数函数,再根据的性质,可以计算出两数的最小公倍数,重复使用上述流程即可求的三个正整数的最小公倍数。
-
完整代码和参数、结果如下图:
实验1-2 比特币测试网地址的生成
参考以下比特币地址生成流程,用Go语言实现如下操作:

-
实现HASH160:先用一次sha256,再用一次ripemd160。
-
实现HASH256:连续使用两次sha256。
-
计算比特币地址:先对公钥使用hash160生成fingerprint,然后版本号与fingerprint拼接,二者再与其校验和拼接,拼接结果通过base58进行编码得到比特币地址
-
比特币地址生成结果如下图;
实验1-3 Merkle Tree
请用Go语言实现一棵叶子节点数为16的Merkle Tree(,并在叶子节点存储任意字符串,并在所有非叶节点计算相应Hash值。请将上一步生成的Merkle Tree任一叶子节点数据进行更改,并重新生成其余Hash值。利用Merkle Tree的特点对该修改位置进行快速定位。
-
根据数据初始化叶子结点,编写计算节点hash的函数
-
根据叶子结点构建Merkle Tree1
-
中序遍历输出叶子结点内容
-
构建一颗初始状态与Merkle Tree1完全一样的Merkle Tree2,修改Merkle Tree2上部分叶子结点的内容(e.g. 修改node2为new2,node16为new16)
-
通过Merkle Tree的特点,对修改位置进行快速定位,并输出错误节点的路径。其中最重要的定位函数如下图:
-
其他的一些工具函数如下(函数功能见注释)
拓展实验 实验1-4
使用Go语言编写一段程序(将ex1-4文件夹下的main.go补充完毕),程序的输出为 一个合法的比特币测试网地址(version byte为0x6f),且要求:
-
地址中包含3个连续的小写字母c。
-
生成公钥时,使用自己的学号作为seed。
-
使用seed=21371445生成随机数,为增强随机性,使用(时间源+seed)作为随机数生成器的熵源。
-
使用随机数,借用ESDCA生成私钥,其中曲线为secp256k1,从私钥中取出公钥(X,Y)
-
处理公钥:将坐标形式的公钥,转换为压缩形式的公钥(从完整公钥之中取出x坐标,如果y坐标的最后一个字节是偶数,那么在x坐标的开头添加 0x02。如果y坐标的最后一个字节是奇数,则在x坐标的开头添加 0x03)。为保证能够使用ex1-2的函数,对其接口参数格式,将压缩形式的公钥转换为HEX字符串。
-
使用ex1-2的GetAddress函数生成比特币地址
-
循环判断含有“ccc”的“靓号”比特币地址,其中判断函数如下
-
输出生成结果。
-
由于指导书给出的测试网无法连接or无法使用,另行寻找了测试网(https://coinfaucet.eu/en/btc-testnet/)进行测试。领取比特币如下图:
-
实验结束后,已归还测试比特币。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lzhのBLOG!