区块链第一版:基本原型
本章源代码地址:[https://github.com/daleboy/blockchain1]
undefined文件一:block.go
在区块链中,存储有效信息的是区块。比如,比特币区块存储的有效信息,就是比特币交易信息,交易信息也是所有加密货币的本质。除此以外,区块还包含了一些技术信息,比如版本,当前时间戳和前一个区块的哈希。这里我们只存储关键的技术信息:时间戳、前一个区块的哈希,本区块的哈希。

本区块的哈希是将区块的所有数据(不包括自身的哈希数据)转为二进制连接起来后,通过哈希运算计算出来。

这里,有几个go语言点注意:
(1)变量简要创建方法
省略var,直接创建变量并赋值,在变量后面跟冒号和等号完成:
timestamp:=[]byte(strconv.FormatInt(b.Timestamp, 10))
strconv.FormatInt函数:用于将整型数据转换成指定进制并以字符串的形式返回,其原型是:
unc FormatInt(i int64, base int) string
(2)类型转换
这里是将时间戳整数转为10进制并以字符串的形式返回。
整形不能直接强制转换为二进制,而字符串可以。所以这里用strconv包进行转换。
strconv包功能强大,可以实现几乎我们所需要的任何数据类型转换。
注意,SetHash是对Block类型定义的一个方法,通过引用调用,因为需要改变实例本身。
接下来,我们需要创建区块。

注意,Block结构的实例化方法:

我们是直接使用var的方式构建Block,实际上也可以用new来创建结构体的实例。
接下来需要一个函数,创建创始区块:

undefined文件二:blockchain.go
接下来是区块链的定义与创建

这里比较简单,只需要注意,我们无论是创建有创始区块的区块链还是给区块链添加一个区块,均需要返回区块链的指针,以供调用者继续使用。
undefined文件三:main.go
在此执行文件中,完成检验

要注意,一个文件夹下的所有文件必须使用同一个包名。
运行结果:

