导言
从人类诞生以来,......(此处省略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服务中的区块链数据。
至此,简单实现了区块链共识机制的基本过程。
关于区块链技术,欢迎大家一起交流学习。
如果您对最新技术感兴趣,请大家关注“龙息”微信订阅号、“龙息云”微信服务号、“龙息科技”今日头条号。
扫描下方的二维码,及时获取最新技术内容
领取专属 10元无门槛券
私享最新 技术干货