# 实现一个简单的去中心化网络

By [leaf](https://paragraph.com/@leaf-6) · 2022-12-04

---

区块链网络是去中心化的，这意味着区块链不是基于一个中心结点产生的，而是有很多去中心化的结点一起参与维护。

在这一节中将会基于Python模拟实现一个简单的去中心化网络。这个模拟的去中心化网络中多个结点可以运行在同一台电脑上，只是每个结点使用了不同的本地端口号，每个结点都是用一个独立的线程运行，相当于一个独立的结点。从功能上说，这些独立的结点会各自运行，互不影响。但从区块链上讲，这些结点相互配合共同维护这个区块链的正确性，并验证区块和生成新的区块来延伸整个链的长度。

（1）定义结点

为实现这个去中心化网络，先要定义一个全局变量来保存区块链上的所有结点，再定义一个结点的结构，每个结点都包含了唯一的端口、结点名称、一个唯一的钱包和一个区块链的副本，代码如图

![](https://storage.googleapis.com/papyrus_images/5f26ef8b1b2e38e82bf1637f5726825d0138313c204e20f2e2e7c8db64ae836c.png)

（2）启动结点

每个结点启动时会先初始化区块链信息并一直监听指定端口，处理其他结点请求，代码如图

![](https://storage.googleapis.com/papyrus_images/26b362eb0d100cd46fc3f69e286f9008f65330790994a85ad2c458397c7a160f.png)

（3）初始化区块链

初始化区块链的过程是先判断区块链网络中是否有其他结点，若有则发送初始化请求，请求该结点的区块链信息并同步到本结点，如果是网络中的第1个结点，则需要初始化一个创世区块，具体代码如图

![](https://storage.googleapis.com/papyrus_images/1268ee58d46c35c07196989dc00c0c32811d580ab1e4e8a84991bbab5add93b6.png)

（4）处理请求

初始化区块链后，各个结点会一直运行并处理其他结点发送过来的请求。结点收到的请求分为3种情况。第1种是初始化请求，收到该请求后结点将返回本地的区块链信息；第2种是新交易的广播，收到这类请求后结点验证该交易是否有效，若有效则进行挖矿生成一个新的区块添加到本地区块链并广播到整个网络中；第3种情况是新区块的广播，结点收到这类请求后先验证区块是否有效，如果有效则添加到本地区块链后面（在实际的网络中可能还需要检查这个新区块是否已存在于当前区块链中，如已存在则不重复添加），具体代码如图

![](https://storage.googleapis.com/papyrus_images/7ecf1e8ebb0f13eb4b9980c47f2a3c7fc0ff0fb226142c8038afc73a0143b0d0.png)

处理其他结点请求

（5）广播数据

下面代码中定义的broadcast\_new\_block函数作用是将新的区块广播到去中心化网络中，通过循环遍历整个结点列表，对除自身结点外的其他结点都进行发送，如图

![](https://storage.googleapis.com/papyrus_images/9ea208b9173338c1b9ac8aab8703591cce4bc7f26d3e6bbda2b9efa7ec15f85b.png)

除了上面的功能外，结点还应该可以提交一个交易并广播到去中心化网络其他结点，代码如图

![交易提交函数](https://storage.googleapis.com/papyrus_images/1da1ba24170fca31f2ee5929503066fa95fad14cf6bbbc3ab02a92e9b9e6bad6.png)

交易提交函数

以上工作完成之后就可以测试这个区块链网络的功能了。先初始化一个结点1并运行这个结点在8000端口，打印这个结点上的区块链信息，可以看到该区块链包含一个创世区块，如图

![](https://storage.googleapis.com/papyrus_images/7efefec1071b4b4358a2f439a746f2c7d9789bcf04baaa8ebe99eeffdfb07f86.png)

初始化结点1

再创建一个结点2并运行在8001端口，再打印一下这个结点的区块链信息，应该可以看到这个区块链也包含一个创世区块，这个创世区块链是从结点1同步过来的，如图4-66所示。

此时输出两个结点的加密数字货币情况，可以看到结点1生成创世区块链后获得了1个加密数字货币，而结点2没有加密数字货币，如图

![](https://storage.googleapis.com/papyrus_images/84a95998b69137b6222101a6109f7cd3a11f40751aaa3f8db813ee9f51a53450.png)

再测试一下交易功能，从结点1账户转账0.3个加密数字货币到结点2账户并提交到去中心化网络中，如图

![](https://storage.googleapis.com/papyrus_images/1170d2e6beb73f16190ae29b284dbb43b19aa1d900e7c321a3c5062c5aab5fe0.png)

测试交易功能

这是再次输出两个结点的区块链情况，可以看到两个结点中都有两个区块，如图

![](https://storage.googleapis.com/papyrus_images/c93999b655d73b6d514db5b9edeef0967b6de53aef43a8761383b6c2187e31f3.png)

此时结点的加密数字货币情况，应该是结点1账户转账0.3个加密数字货币后变成了0.7个加密数字货币，而结点2账户经转账得到0.3个加密数字货币，并经挖矿获得1个加密数字货币共计1.3个加密数字货币，如图

![](https://storage.googleapis.com/papyrus_images/cc0a4cae1991ac2b03a3d923cbbfee5510661e3d86703bdbce8e80cf1d2e43df.png)

打印输出交易后加密数字货币情况

至此，一个简单的但功能较为完整的区块链网络算是完成了。希望各位读者从这个区块链的Python实现中掌握区块链基本功能的实现方法。有兴趣的读者可以基于这个原型进行完善和优化，也可以基于自身熟悉的编程语言实现一个其他版本的区块链原型。这个由Python实现的区块链相关代码已放在GitHub上.

---

*Originally published on [leaf](https://paragraph.com/@leaf-6/DiEqToXLuOQHHtWLPRIn)*
