200行Go代码实现自己的区块链——区块生成与网络通信

这篇文章介绍了如何在Go语言中实现区块链的网络通信,包括多节点生成区块、验证和同步链状态。通过TCP服务器和channel,节点间建立连接,接收并广播区块,模拟P2P网络。文章还涉及到了Go的Channel特性,以及如何通过JSON序列化数据进行广播。
摘要由CSDN通过智能技术生成

在第一篇文章[1]中,我们向大家展示了如何通过精炼的Go代码实现一个简单的区块链。如何计算每个块的 Hash 值,如何验证块数据,如何让块链接起来等等,但是所有这些都是跑在一个节点上的。文章发布后,读者反响热烈,纷纷留言让我快点填坑(网络部分),于是就诞生了这第二篇文章。


这篇文章在之前的基础上,解决多个节点网络内,如何生成块、如何通信、如何广播消息等。


流程


640?wx_fmt=png


  • 第一个节点创建“创始区块”,同时启动 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 结构体&

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值