实验一:Go语言基础&区块链中的典型密码算法

实验概述

Go(又称golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。由于实验环境是在go环境下开发,因此需要预先对go的语法规则有一个基本的了解。

实验准备

实验系统:

  • Mac OS (Apple M1 PRO)

环境配置

  • 在Mac OS系统下使用homebrew安装go语言环境,并安装goLand

实验内容

实验1-1 入门练习

使用Go语言编写一段程序实现以下功能:给定三个不同的正整数,求它们的最小公倍数。

  • 先使用辗转相除法设计最大公因数函数gcd(a,b)gcd(a,b),再根据lcm(a,b)=abgcd(a,b)lcm(a,b)=\frac{a*b}{gcd(a,b)}的性质,可以计算出两数的最小公倍数,重复使用上述流程即可求的三个正整数的最小公倍数。
  • 完整代码和参数、结果如下图:

image-20240118164015837

实验1-2 比特币测试网地址的生成

参考以下比特币地址生成流程,用Go语言实现如下操作:

image-20240118164129895
  1. 实现HASH160:先用一次sha256,再用一次ripemd160。

    image-20240118164158382

  2. 实现HASH256:连续使用两次sha256。

    image-20240118164207999

  3. 计算比特币地址:先对公钥使用hash160生成fingerprint,然后版本号与fingerprint拼接,二者再与其校验和拼接,拼接结果通过base58进行编码得到比特币地址

    image-20240118164215291

  4. 比特币地址生成结果如下图;

    image-20240118164226533

实验1-3 Merkle Tree

请用Go语言实现一棵叶子节点数为16的Merkle Tree(,并在叶子节点存储任意字符串,并在所有非叶节点计算相应Hash值。请将上一步生成的Merkle Tree任一叶子节点数据进行更改,并重新生成其余Hash值。利用Merkle Tree的特点对该修改位置进行快速定位。

  1. 根据数据初始化叶子结点,编写计算节点hash的函数

    image-20240118164412989

    image-20240118164417999

  2. 根据叶子结点构建Merkle Tree1

    image-20240118164425615

  3. 中序遍历输出叶子结点内容

    image-20240118164432614

  4. 构建一颗初始状态与Merkle Tree1完全一样的Merkle Tree2,修改Merkle Tree2上部分叶子结点的内容(e.g. 修改node2为new2,node16为new16)

    image-20240118164440575

  5. 通过Merkle Tree的特点,对修改位置进行快速定位,并输出错误节点的路径。其中最重要的定位函数如下图:

    image-20240118164447468

  6. 其他的一些工具函数如下(函数功能见注释)

    image-20240118164456307

    image-20240118164503984

拓展实验 实验1-4

使用Go语言编写一段程序(将ex1-4文件夹下的main.go补充完毕),程序的输出为 一个合法的比特币测试网地址(version byte为0x6f),且要求:

  1. 地址中包含3个连续的小写字母c。

  2. 生成公钥时,使用自己的学号作为seed。

 

  1. 使用seed=21371445生成随机数,为增强随机性,使用(时间源+seed)作为随机数生成器的熵源。

    image-20240118164533009

  2. 使用随机数,借用ESDCA生成私钥,其中曲线为secp256k1,从私钥中取出公钥(X,Y)

    image-20240118164540334

  3. 处理公钥:将坐标形式的公钥,转换为压缩形式的公钥(从完整公钥之中取出x坐标,如果y坐标的最后一个字节是偶数,那么在x坐标的开头添加 0x02。如果y坐标的最后一个字节是奇数,则在x坐标的开头添加 0x03)。为保证能够使用ex1-2的函数,对其接口参数格式,将压缩形式的公钥转换为HEX字符串。

    image-20240118164546598

  4. 使用ex1-2的GetAddress函数生成比特币地址

    image-20240118164554448

  5. 循环判断含有“ccc”的“靓号”比特币地址,其中判断函数如下

    image-20240118164600880

  6. 输出生成结果。

    image-20240118164606690

  7. 由于指导书给出的测试网无法连接or无法使用,另行寻找了测试网(https://coinfaucet.eu/en/btc-testnet/)进行测试。领取比特币如下图:

    image-20240118164612641

  8. 实验结束后,已归还测试比特币。