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

Python创建一个区块链案例

区块链是什么呢?区块链是一种分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式,而所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。在本质上区块链是一个“去中心化”的分布式账本或者说分布式数据库,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。

区块链具有几个重要的特性,去中心化,自治性,开放性,不可篡改,以及匿名性,由此使其天然具有了三个方面的应用可能性,这就是价值传递,机器信任和智能合约。

区块链的几个特性中的“去中心化”,“自治性”和“开放性”这三点主要是由其设计理念来主导的,而“不可篡改”是其技术实现机制来保证的,至于“匿名性”则是区块链存储的交易信息来决定的。

那么,怎么才能保证存储在区块链里的数据是“不可篡改”的?

区块链是由一个个区块(block)组成,区块就像数据库的记录,每次写入数据,就是创建一个区块。每个区块包含两个部分:

区块头(Head):记录当前区块的元信息

区块体(Body):实际数据

区块头包含了当前区块的多项元信息。

生成时间

实际数据(即区块体)的Hash

上一个区块的Hash

什么是Hash呢?Hash就是计算机可以对任意内容,计算出一个长度相同的特征值。区块链的Hash长度是256位,不管原始内容是什么,最后都会计算出一个256位的二进制数字,而且可以保证,只要原始内容不同,对应的Hash一定是不同的。例如,字符串123的Hash是a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0(十六进制),转成二进制就是256位,而且只有123能得到这个Hash。

在这种设计下,每个区块的Hash都是不一样的,可以通过Hash标识区块,如果区块的内容变了,它的Hash一定会改变。区块与Hash是一一对应的,每个区块的Hash都是针对”区块头”(Head)计算的。

例如:Hash =SHA256(区块头),这个就是区块Hash的计算公式,Hash由区块头唯一决定,SHA256是区块链的Hash算法。前文说过,区块头包含很多内容,其中有当前区块体的Hash(注意是“区块体”的Hash,而不是整个区块),还有上一个区块的Hash,这也就意味着,如果当前区块的内容变了,或者上一个区块的Hash变了,一定会引起当前区块的Hash改变。这一点对区块链有重大意义。如果有人修改了一个区块,该区块的Hash就变了,为了让后面的区块还能连到它,该人必须同时修改后面所有的区块,否则被改掉的区块就脱离区块链了。而由于后面要提到的原因,Hash的计算很耗时,同时修改多个区块几乎不可能发生,除非有人掌握了全网51%以上的计算能力。

而正是通过区块的加密算法(Hash算法)和区块间的这种联动机制(区块之间的关联),区块链保证了自身的可靠性,数据一旦写入,就无法被篡改,每一个区块都连着上一个区块(“Block”),就构成了区块链(“Blockchain”)。

最近带着我家的00后中学生一起学习了Python这种编程语言,在理解清楚了区块链的本质后,用Python创建一个简单的区块链就非常简单了。为了向区块链的第一个成功应用——比特币(“Bitcoin”)致敬,我将要创建的这条区块链就命名为“hanscoin”了。

在创建区块链之前,首先要定义区块。区块链中的每个块都存储有时间戳和可选的索引,同时为了帮助确保整个块链的完整性,每个块将具有自识别哈希值的功能,就像比特币一样,每个区块将包括作为区块的索引的哈希值,时间戳,数据以及前一个块的哈希值。区块中的数据这一项可以根据需要定义,在hanscoin里,我就写一句话:

self.index = index

self.timestamp = timestamp

self.data = data

self.previous_hash = previous_hash

self.hash = self.hash_block()

现在,块结构已经定义好了。为了创建一个区块链,需要向实际的链条添加区块。如前所述,每个块都需要上一个块的信息,这就出现了一个问题:块区中的第一个区块怎么来的?第一个区块,或着说“创世区块”,是一个特殊的块,在许多情况下,它是手动添加的或具有允许添加的唯一逻辑。为了简化,我将创建一个函数,只需返回一个创世区块,该区块的索引为,它在“previoushash”参数中具有任意数据值和任意值。

在创建了一个创世区块后,需要一个函数来生成区块链中的后续区块吗,该函数将将链中的前一个区块作为参数,创建要生成的区块的数据,并返回具有其相应数据的新块。新产生的区块会存储先前区块中的哈希值,区块链的完整性随着每个新的区块而增加,这就是区块链的设计和技术实现机制。如果没有这样做,其他人会很容易篡改历史记录,并用自己的全新数据替代链条,而这个哈希链作为加密证明,用于确保一旦新区块被添加到区块链中,就不能被替换或删除。

至此,区块链hanscoin的主要功能代码就完成了:

在我用Python构建的这个区块链hanscoin中,区块链本身就是一个简单的Python列表。列表的第一个元素是创世区块,当然,需要添加后续的区块。因为hanscoin是最小的区块链,所以我们用for循环只添加了10个新的块。

现在,我们来启动这个区块链,看看运行效果:

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券