首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用python阐述区块链技术概念

之前在github上看到这个小项目, 作者用不到300行python代码实现了一个迷你区块链, 通过查看代码和运行效果, 基本可以对区块链中一些核心概念有个大体了解。本篇对代码进行一个梳理解读, 我把源码做了微小修改以丰富运行结果输出, 并删除了源码中繁琐的注释减少代码长度(本来这篇文章就是解释代码的:) 有兴趣的同学可以玩耍一下

blockchain 类

首先我们需要按照区块链技术的一些基础概念搭个架子出来例如: 未上链交易池, 整个区块链账本, 相连节点, 交易打包成新区块, 共识算法(这里是pow) 等

一步步来, 首先当然是构造函数, 先初始化三个属性:

未打包交易

区块链账本数据

相连节点

相连节点用set存储可以避免重复添加的情况self.new_block() 是创建整个区块链的创世块, 这个后边可以看到解释, 先忽略

新建一笔交易

这个很简单, 就是向 这个列表里面添加一个字典信息代表一笔未打包的交易, 返回值是应该添加进下一个区块的索引

打包交易进入区块

在这个代码中, 打包进入区块是个简单的添加动作, 其实在这之前是需要先挖矿成功的, 你可能对挖矿部分很感兴趣, 其实实现起来也很简单, 可能是作者为了逻辑更清晰简单, 把挖矿逻辑和打包分开了, 这部分后边可以看到

可以看到一个区块有以下属性:

index: 索引号

timestamp: 时间戳

transactions: 打包的交易

proof: 工作量证明难度

previous_hash: 前一个区块的哈希值

valid_hash: 本区块一个有效的哈希值

proof和比特币里面的幸运数的概念一样, 不断地尝试proof去算出一个validhash, 虽然validhash可以有很多个有效值, 但我们只需要找到一个符合共识算法的有效值就可以了, 因为pow类算法重在验证做了多少工作, 而不是找一个全局唯一值

proof of work

hash 这个函数选用python标准库中hashlib.sha256实现, json.dumps() 时一定要按key排序, 因为dict默认是无序的, 这样每次哈希后会得到不一样的哈希值, 这当然不是我们想要的

proofofwork中proof从0开始不断加1, 调用validproof进行猜测, 可以看到, 这个简单pow实现是通过对上一区块幸运数lastproof, 本区块幸运数proof, 上一区块哈希值last_hash进行sha256得到的16进制结果判断高5位是否都是0来计算一个合法的区块哈希值

至此一个单节点的区块链就差不多了, 我们用flask先包装几个http的api,flask是python里面一个很轻量的web框架, 没用过的同学可以玩玩

用uuid4生成节点的唯一id, 这里代表地址的概念

可以看到在proofofwork调用成功后, 会新建一笔交易作为系统给节点的奖励, 这就是我们在比特币概念中所熟知的挖矿了, 代表系统本身, 代表接收者是节点自己, 是奖励值

封装添加新交易的API, 把交易添加到该节点的交易池中

查看整个区块链上数据

运行信息

把节点启动:

尝试请求一下我们的接口, 会看到只有一个创世区块

接下来我们添加一笔交易:

此时交易进入了节点的未打包交易池中, 而且返回该笔交易即将添加进入到第二个区块中

现在让此节点进行一次挖矿:

可以看到通过挖矿产生了一个新区块, 打包的交易中第一个是我们上一步所产生的交易, 第二个就是挖矿所产生的奖励了, 比特币的挖矿原理是一样的, 是系统给挖矿节点地址发送了一些比特币, 不过流程更复杂罢了

到这一步其实还是单机区块链, 下面我们看看作者又封装的一些简单的API和方法, 来实现简单的多节点通信和共识

节点注册

针对当前节点, 有其他节点连接过来, 通过一些协议互相确认, 就是一个节点注册过程, 下面的代码把地址加入到nodes集合中, 对端节点就算是已经注册进来了

对应的API实现如下:

请求效果:

解决共识问题

现在我们已经两个节点了, 并且节点2已经注册到节点1,这时如果节点2成功打包了几个区块, 那么节点1如何同节点2同步呢?

这段代码通过简单的长度判断和验证逻辑, 做到了各个节点间的共识

对应API

我们来一起看下效果:

上图中节点2进行一次挖矿后一共两个区块, 节点一进行同步后用节点2的链替换掉自己的链, 这样两个节点链上数据就一致了

当然比特币这种成熟系统这些动作都是自动做的, 这里都是我们手动请求触发, 不过这样对于学习了解这些概念也更清晰, 虽然代码中的各种实现都很简陋, 但贵在简单, 不到300行代码就实现了这个可运行的小系统, 对初学者的学习价值还是很高的

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券