🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
本章源代码地址:[https://github.com/daleboy/blockchain1] # 文件一:block.go 在区块链中,存储有效信息的是区块。比如,比特币区块存储的有效信息,就是比特币交易信息,交易信息也是所有加密货币的本质。除此以外,区块还包含了一些技术信息,比如版本,当前时间戳和前一个区块的哈希。这里我们只存储关键的技术信息:时间戳、前一个区块的哈希,本区块的哈希。 ![](https://img.kancloud.cn/2a/74/2a74b0fe831d4c2fb3a3a95875df6a87_711x260.png) 本区块的哈希是将区块的所有数据(不包括自身的哈希数据)转为二进制连接起来后,通过哈希运算计算出来。 ![](https://img.kancloud.cn/ca/e0/cae07055ebabc22dc6aca4362945de0f_1189x331.png) 这里,有几个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类型定义的一个方法,通过引用调用,因为需要改变实例本身。 接下来,我们需要创建区块。 ![](https://img.kancloud.cn/55/41/5541e00f583c2a74ceed3a4a46839187_1122x244.png) 注意,Block结构的实例化方法: ![](https://img.kancloud.cn/da/27/da2708f6a7898f687cdd9fffec8f6fc3_1057x47.png) 我们是直接使用var的方式构建Block,实际上也可以用new来创建结构体的实例。 接下来需要一个函数,创建创始区块: ![](https://img.kancloud.cn/b5/79/b57912ee901016b79441829c9c84c8d6_675x160.png) # 文件二:blockchain.go 接下来是区块链的定义与创建 ![](https://img.kancloud.cn/b3/ea/b3ea5f4da118ac88f99ddaa8cd468804_809x555.png) 这里比较简单,只需要注意,我们无论是创建有创始区块的区块链还是给区块链添加一个区块,均需要返回区块链的指针,以供调用者继续使用。 # 文件三:main.go 在此执行文件中,完成检验 ![](https://img.kancloud.cn/af/ad/afad723cf699680bd0d88ea5d971f79b_1402x684.png) 要注意,一个文件夹下的所有文件必须使用同一个包名。 运行结果: ![](https://img.kancloud.cn/a9/c7/a9c71c49afa68e87f526361ed112a751_1087x424.png)