本学期一门实验课,以此记录
week1
实验1 入门练习
实验1要求三个不同正整数的最小公倍数
实验流程
-
辗转相除法构造求解最大公约数的函数
-
最小公倍数即乘积除以最大公约数
-
先求任意两数的最小公倍数再与第三个数求最小公倍数
实验结果
实验代码
package main |
实验2 比特币测试网地址的生成
实验流程
-
调用库对输入公钥进行HASH160,即RIPEMD160(SHA256(Public Key))
-
将第一步结果与Version byte拼接
-
将第二步结果进行HASH256,即进行两次SHA256,取前4字节作为Checksum
-
将二三步结果拼接进行Base58编码得到地址
实验结果
实验代码
package main |
调库颇费周折,要注意把第三方库装到GOROOT
或GOPATH
所在路径下,一般推荐是后者
实验3 Merkle Tree
实验流程
-
定义结构体
MerkleNode
作为节点type MerkleNode struct {
left *MerkleNode
right *MerkleNode
Data []byte
index int
} -
初始化16个叶子节点,
Data
为对应的字符串,左右子节点都为空,索引依次赋值 -
从下往上逐层构建树,先把相邻两个叶子节点合为子树,保存子树节点
-
处理完叶子层再对子树结点层进行合并,最后合并到根节点,完成树的构造
-
快速定位流程:
- 从根节点的hash值开始比对,当根节点hash不同,叶节点有一处变动时有且只有一条路径上所有hash值都不同
- 两树左枝相同时就转向右枝,右枝相同时就转向左枝
实验结果
实验代码
package main |
这个实验重点就是把树构建出来,然后定位时从根节点开始直接比就可以,熟悉语言特性的话还是蛮简单的,(菜狗作者还没学会go硬着头皮写了好久)
拓展实验
是一个生成挖比特币公私钥的实验,后面再看
week2
实验一 构建区块
实验要求:
- 将空缺字段补充完整
- 实现对Block的Hash计算
实验流程
-
区块链的基本构成单位是区块,而区块又分为区块头和区块体两部分,实现的简单区块包括字段:
字段 解释 数据类型 Time 当前时间戳,也就是区块创建的时间 int64 PrevHash 前一个块的哈希,即父哈希 []byte Hash 当前块的哈希 []byte Data 区块存储的实际有效信息,也就是交易 []byte 故补全结构体为:
type Block struct {
Time int64
Data []byte
PrevHash []byte
Hash []byte
} -
实验一要求对Block的Hash计算方法为:
Hash=SHA256(PrevHash + Time+ Data)
,直接实现即可
实验结果
实验代码
package main |
实验二 链接区块成链
实验要求:
- 生成创世区块 NewGenesisBlock()
- 添加新区块 Blockchain.AddBlock()
实验流程
- 生成创世区块 NewGenesisBlock(),即调用
NewBlock()
,Data
初始化为Genesis Block
,Hash值置为空 - 添加新区块 Blockchain.AddBlock(),维护一个区块数组
blocks
作为区块链,将传入的Data
与前一个区块的hash来构建新区块,然后把新区块放入数组中。
实验结果
实验代码
package main |
实验三 添加工作量证明模块
回答问题:工作量证明中的difficulty值的大小会怎样影响PoW计算时间?
设difficulty=,PoW算法要求找到的hash值前比特需要满足要求,成功的概率为,当线性增大时,计算时间指数级增大
实验流程
- 完善工作量证明算法,主要是Hashcash算法
- 选择部分公开数据–在
NewProofOfWork()
模块中完成 - 维护一个初始值为0的计数器
nonce
- 首先通过
prepareData()
模块来准备用来Hash计算的数据 - 计算完成后与目标值比较判断是否在给定范围内,是则结束,否则
nonce
加一继续循环
- 选择部分公开数据–在
- 修改Block类,将
nonce
添加至Block结构中,修改SetHash()
函数,使其调用ProofOfWork
算法获得哈希值 - 完成验证函数
Validate()
,如区块的hash在目标范围内则返回true
,否则返回false
- 在
main
中增加验证部分,对每一个区块调用NewProofOfWork()
算法中的Validate()
方法
- 在
实验结果
实验代码
proofofWork
部分
package main |
block
部分
package main |
main
部分
package main |