0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用不到50行的 Python 2.x代码实现一个简单的区块链

阿铭linux 来源:未知 作者:李倩 2018-03-29 15:29 次阅读

虽然有些人认为区块链是一个早晚会出现问题的解决方案,但是毫无疑问,这个创新技术是一个计算机技术上的奇迹。那么,究竟什么是区块链呢?

区块链

比特币Bitcoin或其它加密货币按时间顺序公开地记录交易的数字账本。

更通俗的说,它是一个公开的数据库,新的数据存储在被称之为区块block的容器中,并被添加到一个不可变的链chain中(因此被称为区块链blockchain),之前添加的数据也在该链中。对于比特币或其它加密货币来说,这些数据就是一组组交易,不过,也可以是其它任何类型的数据。

区块链技术带来了全新的、完全数字化的货币,如比特币和莱特币Litecoin,它们并不由任何中心机构管理。这给那些认为当今的银行系统是骗局并将最终走向失败的人带来了自由。区块链也革命性地改变了分布式计算的技术形式,如以太坊Ethereum就引入了一种有趣的概念:智能合约smart contract。

在这篇文章中,我将用不到 50 行的 Python 2.x 代码实现一个简单的区块链,我把它叫做 SnakeCoin。

不到 50 行代码的区块链

我们首先将从定义我们的区块是什么开始。在区块链中,每个区块随同时间戳及可选的索引一同存储。在 SnakeCoin 中,我们会存储这两者。为了确保整个区块链的完整性,每个区块都会有一个自识别的哈希值。如在比特币中,每个区块的哈希是该块的索引、时间戳、数据和前一个区块的哈希值等数据的加密哈希值。这里提及的“数据”可以是任何你想要的数据。

真棒,现在我们有了区块的结构了,不过我们需要创建的是一个区块链。我们需要把区块添加到一个实际的链中。如我们之前提到过的,每个区块都需要前一个区块的信息。但问题是,该区块链中的第一个区块在哪里?好吧,这个第一个区块,也称之为创世区块,是一个特别的区块。在很多情况下,它是手工添加的,或通过独特的逻辑添加的。

我们将创建一个函数来简单地返回一个创世区块解决这个问题。这个区块的索引为 0 ,其包含一些任意的数据值,其“前一哈希值”参数也是任意值。

现在我们可以创建创世区块了,我们需要一个函数来生成该区块链中的后继区块。该函数将获取链中的前一个区块作为参数,为要生成的区块创建数据,并用相应的数据返回新的区块。新的区块的哈希值来自于之前的区块,这样每个新的区块都提升了该区块链的完整性。如果我们不这样做,外部参与者就很容易“改变过去”,把我们的链替换为他们的新链了。这个哈希链起到了加密的证明作用,并有助于确保一旦一个区块被添加到链中,就不能被替换或移除。

这就是主要的部分。

现在我们能创建自己的区块链了!在这里,这个区块链是一个简单的 Python 列表。其第一个的元素是我们的创世区块,我们会添加后继区块。因为 SnakeCoin 是一个极小的区块链,我们仅仅添加了 20 个区块。我们通过循环来完成它。

让我们看看我们的成果:

别担心,它将一直添加到 20 个区块

很好,我们的区块链可以工作了。如果你想要在主控台查看更多的信息,你可以编辑其完整的源代码并输出每个区块的时间戳或数据。

这就是 SnakeCoin 所具有的功能。要使 SnakeCoin 达到现今的产品级的区块链的高度,我们需要添加更多的功能,如服务器层,以在多台机器上跟踪链的改变,并通过工作量证明算法(POW)来限制给定时间周期内可以添加的区块数量。

让这个极小区块链稍微变大些

这个极小的区块链及其简单,自然也相对容易完成。但是因其简单也带来了一些缺陷。首先,SnakeCoin 仅能运行在单一的一台机器上,所以它相距分布式甚远,更别提去中心化了。其次,区块添加到区块链中的速度同在主机上创建一个 Python 对象并添加到列表中一样快。在我们的这个简单的区块链中,这不是问题,但是如果我们想让 SnakeCoin 成为一个实际的加密货币,我们就需要控制在给定时间内能创建的区块(和币)的数量。

从现在开始,SnakeCoin 中的“数据”将是交易数据,每个区块的“数据”字段都将是一些交易信息的列表。接着我们来定义“交易”。每个“交易”是一个 JSON 对象,其记录了币的发送者、接收者和转移的 SnakeCoin 数量。注:交易信息是 JSON 格式,原因我很快就会说明。

现在我们知道了交易信息看起来的样子了,我们需要一个办法来将其加到我们的区块链网络中的一台计算机(称之为节点)中。要做这个事情,我们会创建一个简单的 HTTP 服务器,以便每个用户都可以让我们的节点知道发生了新的交易。节点可以接受 POST 请求,请求数据为如上的交易信息。这就是为什么交易信息是 JSON 格式的:我们需要它们可以放在请求信息中传递给服务器。

真棒!现在我们有了一种保存用户彼此发送 SnakeCoin 的记录的方式。这就是为什么人们将区块链称之为公共的、分布式账本:所有的交易信息存储给所有人看,并被存储在该网络的每个节点上。

但是,有个问题:人们从哪里得到 SnakeCoin 呢?现在还没有办法得到,还没有一个称之为 SnakeCoin 这样的东西,因为我们还没有创建和分发任何一个币。要创建新的币,人们需要“挖”一个新的 SnakeCoin 区块。当他们成功地挖到了新区块,就会创建出一个新的 SnakeCoin ,并奖励给挖出该区块的人(矿工)。一旦挖矿的矿工将 SnakeCoin 发送给别人,这个币就流通起来了。

我们不想让挖新的 SnakeCoin 区块太容易,因为这将导致 SnakeCoin 太多了,其价值就变低了;同样,我们也不想让它变得太难,因为如果没有足够的币供每个人使用,它们对于我们来说就太昂贵了。为了控制挖新的 SnakeCoin 区块的难度,我们会实现一个工作量证明Proof-of-Work(PoW)算法。工作量证明基本上就是一个生成某个项目比较难,但是容易验证(其正确性)的算法。这个项目被称之为“证明”,听起来就像是它证明了计算机执行了特定的工作量。

在 SnakeCoin 中,我们创建了一个简单的 PoW 算法。要创建一个新区块,矿工的计算机需要递增一个数字,当该数字能被 9 (“SnakeCoin” 这个单词的字母数)整除时,这就是最后这个区块的证明数字,就会挖出一个新的 SnakeCoin 区块,而该矿工就会得到一个新的 SnakeCoin。

我们差不多就要完成了。在运行了完整的 SnakeCoin 服务器代码之后,在你的终端可以运行如下代码。(假设你已经安装了 cCUL)。

对代码做下美化处理,我们看到挖矿后我们得到的新区块的信息:

大功告成!现在 SnakeCoin 可以运行在多个机器上,从而创建了一个网络,而且真实的 SnakeCoin 也能被挖到了。

你可以根据你的喜好去修改 SnakeCoin 服务器代码,并问各种问题了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    56

    文章

    4792

    浏览量

    84627
  • 区块链
    +关注

    关注

    111

    文章

    15562

    浏览量

    105923

原文标题:用python构建一个极小的区块链

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    教你用Python从0开始创建区块

    对数字货币的崛起感到新奇的我们,并且想知道其背后的技术——区块是怎样实现的。本文通过 Python 构建
    的头像 发表于 04-20 06:55 6185次阅读
    教你用<b class='flag-5'>Python</b>从0开始创建<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>区块</b><b class='flag-5'>链</b>

    分享50条经典的Python一行代码

    今天浩道跟大家分享python学习过程中非常经典的50一行代码,让大家体验它简洁而功能强大的特点。同时给大家分享号主收集到的所有关于python
    发表于 08-16 15:00 1038次阅读

    简单学学之课堂二:区块的透明性指的是什么?

    的基础上教学习者如何去查询转账信息。 般说到透明,大致包括两含义:1)用来形容物体能透过光线的,例如水是透明的;2)比喻公开,不隐藏。如:透明度。此次课堂里说的透明就是指公开、不隐藏。说到
    发表于 01-05 14:19

    什么是区块 区块有什么用

    与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的种全新的分布式基础架构与计算范式。 简单地说,
    发表于 03-26 11:31

    区块软件开发公司谈未来区块的主要应用方向

    。它使用由自动脚本代码组成的智能契约对数据进行编程和操作。以下是未来世界区块应用的四方面。  1、财务管理行业  区块
    发表于 11-22 16:54

    区块将如何优化产业

    的新区块渠道的兴起,运用和基础渠道开端解耦合,在以太坊开发的更为完善的区块基础协议上面,开发者可以开发各式各样的去中心化运用(Dap
    发表于 12-13 15:19

    区块在其他领域的些应用

    通过区块技术的匿名性和数据公开透明性,就可以实现数据的前台匿名、后台实名可控,以及区块的可溯源、不可篡改等特性,是可以运用在法定的数字货
    发表于 01-07 17:42

    企业结合区块创建区块技术落地应用有什么特色

    操作都会使得账册状态发生改变,比如增加条记录;(2区块(Block):记录某段时间内发生的所有交易和状态结果,是对当前账本状态的次共识;(3)
    发表于 12-19 11:30

    区块+从全球50案例看区块的应用与未来》高清pdf

    区块+从全球50案例看区块的应用与未来》高清pdf百度网盘链接: https://pan
    发表于 03-13 00:42

    区块钱包软件开发,区块钱包源码搭建

    什么是区块钱包?区块钱包本质上是工具,目前绝大多数的
    发表于 05-26 16:30

    区块分成两部分, 一个区块一个

    就称之为“区块(block)”。以比特币的区块为例,它完整记录了网络上的每笔历史交易,好比是
    发表于 03-20 08:55

    什么是区块区块都有哪些应用?

    什么是区块区块未来的应用前景怎样?
    发表于 06-28 09:20

    如何使用50Python代码实现AI的动作平衡

    本文将为大家展示如何通过 Numpy 库和 50 Python 代码,使用标准的 OpenAI Gym平台创建智能体 (agent),就教会机器处理推车杆问题 (cart pole
    的头像 发表于 06-16 10:40 3117次阅读

    python设计简单推荐系统的资料和完整代码

    本文档的主要内容详细介绍的是python设计简单推荐系统的资料和完整代码免费下载。
    发表于 03-30 09:32 14次下载

    如何在Rust项目中使用InfluxDB 2.x

    Rust是种系统编程语言,它具有高性能、内存安全和并发性等特点。InfluxDB是开源的时序数据库,它专门用于存储和查询时间序列数据。InfluxDB 2.x是InfluxDB的
    的头像 发表于 09-19 16:33 657次阅读