在第一篇文章[1]中,我们向大家展示了如何通过精炼的Go代码实现一个简单的区块链。如何计算每个块的 Hash 值,如何验证块数据,如何让块链接起来等等,但是所有这些都是跑在一个节点上的。文章发布后,读者反响热烈,纷纷留言让我快点填坑(网络部分),于是就诞生了这第二篇文章。
这篇文章在之前的基础上,解决多个节点网络内,如何生成块、如何通信、如何广播消息等。
流程
第一个节点创建“创始区块”,同时启动 TCP server并监听一个端口,等待其他节点连接。
Step 1
启动其他节点,并与第一个节点建立TCP连接(这里我们通过不同的终端来模拟其他节点)
创建新的块
Step 2
第一个节点验证新生成块
验证之后广播(链的新状态)给其他节点
Step 3
所有的节点都同步了最新的链的状态
之后你可以重复上面的步骤,使得每个节点都创建TCP server并监听(不同的)端口以便其他节点来连接。通过这样的流程你将建立一个简化的模拟的(本地的)P2P网络,当然你也可以将节点的代码编译后,将二进制程序部署到云端。
开始coding吧
设置与导入依赖
参考之前第一篇文章,我们使用相同的计算 hash 的函数、验证块数据的函数等。
设置
在工程的根目录创建一个 .env
文件,并添加配置:ADDR=9000
通过 go-spew
包将链数据输出到控制台,方便我们阅读:go get github.com/davecgh/go-spew/spew
通过 godotenv
包来加载配置文件:go get github.com/joho/godotenv
之后创建 main.go
文件。
导入
接着我们导入所有的依赖:
package main
import (
"bufio"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"io"
"log"
"net"
"os"
"strconv"
"time"
"github.com/davecgh/go-spew/spew"
"github.com/joho/godotenv"
)
回顾
让我们再快速回顾下之前的重点,我们创建一个 Block
结构体&