区块链技术实现篇(一)实现共识机制

导言

从人类诞生以来,......(此处省略N万字),在伟大的China出现了一种区块链的雏形:麻将。

我的麻将水平,两个字概括:呵呵。反正这个春节基本上一直在输,这东西是不是需要天赋啊?

打麻将,最后有没有胡牌,大家都是有共识的,每个人的出牌,都在大家关注下,每人轮流出牌,井然有序,每次出牌可以视作区块链中的一个区块,彼此首尾相联,形成一条信息链。每个人都掌握相同的一份出牌记录(区块链),禁止任何出老千的行为。

从麻将可以看到,打一局麻将的完整信息,是分布式存储的,在所有玩家的脑中都有一份完整的记录,这个记录唯一可以变更的就是添加新的出牌记录。

区块链在网络中采用的是类似的实现原理,我在接下来的文章中通过程序实现一个共识机制,在后续的系列文章中会陆续对区块链的相关技术进行讲解、示范。

先解释一下,在区块链中通过什么来实现信息的不可冒充、修改、删除。原理比较简单,我们先看一下,一个区块基本的数据结构:

在这个数据结构中,“previousHash”属性保存了上一区块的哈希码,所以,根据哈希码,可以判断上一个区块数据有没有变化。同时,因为所有的用户都保留完整的区块链记录信息,所以,系统会自动从其它用户处复制一份有效的区块链,恢复已被修改的记录。

一、实现目标

简单实现区块链共识技术。共识需要有个标准:长度最长、有效的区块链是唯一准确的。

二、环境准备

本文使用python3来实现

python3.6

python库:Flask框架、requests

IDE:Subclime Text3、Postman

三、步骤拆分

在每个节点(用户)的电脑上,运行一个相同的区块链服务。

记录网络中区块链的所有的用户地址。

获取并比较所有用户的区块链记录。如果本地的不是最新的,则更新。

所有用户实现最终共识。

四、实现

开始创建一个区块链主类Blockchain。

chain:记录完整的区块链记录。

nodes:记录网络中的用户节点地址,防止重复记录,所以采用set数据集进行存储。

2. 在Blockchain主体类中添加以下三个方法。

registerNode:添加新的用户节点地址。

validChain:对区块链的有效性进行校验。

resolveConficts:解决区块链信息不一致(共识)的问题。

先来看registerNode方法。这个方法只需要在nodes属性中保存所有用户的IP地址。

validChain方法。这个方法可以快速的对区块链的有效性进行验证,验证过程中用到了每个区块的工作量信息,在这里可以理解为每个区块的合法性标识。

resolveConficts方法是最关键一个,用于保证区块链记录始终都是最新的,并且是有效的。

3. 在网络中发布两个服务接口

registerNodes:注册所有的用户节点地址。

nodeResolve:实现节点间区块链共识,即一致性。

先来看registerNodes方法。这个方法的调用时机,是在用户运行区块链服务时,向已知的所有用户,发送注册通知,告诉对方节点,我现在是激活状态,准备好了区块链相关服务。

nodeResolve方法。实现区块链信息的比较,同步到最新区块链。

4. 区块链服务发布

五、测试

测试环境:Python3.6、Sublime Text3、Postman

使用Sublime 运行一个区块链服务在8000端口,另外开一个窗口,运行区块链服务在8001端口。

2. 启用8000端口的服务,先生成区块长度为3的区块链。

3. 注册另一个8001端口的地址

4. 在8001端口使用区块链,生成区块长度为5的区块链。

5. 在8000端口的服务调用共识服务接口,我们发现区块链更新为长度为5的8001服务中的区块链数据。

至此,简单实现了区块链共识机制的基本过程。

关于区块链技术,欢迎大家一起交流学习。

如果您对最新技术感兴趣,请大家关注“龙息”微信订阅号、“龙息云”微信服务号、“龙息科技”今日头条号。

扫描下方的二维码,及时获取最新技术内容

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180311G0V90D00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券