本章源代码地址:[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)
- 重要更新说明
- linechain发布
- linechain新版设计
- 引言一
- 引言二
- 引言三
- vs-code设置及开发环境设置
- BoltDB数据库应用
- 关于Go语言、VS-code的一些Tips
- 区块链的架构
- 网络通信与区块链
- 单元测试
- 比特币脚本语言
- 关于区块链的一些概念
- 区块链组件
- 区块链第一版:基本原型
- 区块链第二版:增加工作量证明
- 区块链第三版:持久化
- 区块链第四版:交易
- 区块链第五版:实现钱包
- 区块链第六版:实现UTXO集
- 区块链第七版:网络
- 阶段小结
- 区块链第八版:P2P
- P2P网络架构
- 区块链网络层
- P2P区块链最简体验
- libp2p建立P2P网络的关键概念
- 区块链结构层设计与实现
- 用户交互层设计与实现
- 网络层设计与实现
- 建立节点发现机制
- 向区块链网络请求区块信息
- 向区块链网络发布消息
- 运行区块链
- LineChain
- 系统运行流程
- Multihash
- 区块链网络的节点发现机制深入探讨
- DHT
- Bootstrap
- 连接到所有引导节点
- Advertise
- 搜索其它peers
- 连接到搜到的其它peers
- 区块链网络的消息订发布-订阅机制深入探讨
- LineChain:适用于智能合约编程的脚本语言支持
- LineChain:解决分叉问题
- LineChain:多重签名
- libp2p升级到v0.22版本
- 以太坊基础
- 重温以太坊的树结构
- 世界状态树
- (智能合约)账户存储树
- 交易树
- 交易收据树
- 小结
- 以太坊的存储结构
- 以太坊状态数据库
- MPT
- 以太坊POW共识算法
- 智能合约存储
- Polygon Edge
- block结构
- transaction数据结构
- 数据结构小结
- 关于本区块链的一些说明
- UML工具-PlantUML
- libp2p介绍
- JSON-RPC
- docker制作:启动多个应用系统
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基础操作整理
- jupyter计算交互环境
- git技巧一
- git技巧二
- 使用github项目的最佳实践
- windows下package管理工具