区块链是什么呢?区块链是一种分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式,而所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法。在本质上区块链是一个“去中心化”的分布式账本或者说分布式数据库,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。
区块链具有几个重要的特性,去中心化,自治性,开放性,不可篡改,以及匿名性,由此使其天然具有了三个方面的应用可能性,这就是价值传递,机器信任和智能合约。
区块链的几个特性中的“去中心化”,“自治性”和“开放性”这三点主要是由其设计理念来主导的,而“不可篡改”是其技术实现机制来保证的,至于“匿名性”则是区块链存储的交易信息来决定的。
那么,怎么才能保证存储在区块链里的数据是“不可篡改”的?
区块链是由一个个区块(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个新的块。
现在,我们来启动这个区块链,看看运行效果:
领取专属 10元无门槛券
私享最新 技术干货