作者|阿尔诸那天空角
整理| Aholiab
根据IEEE之前的调查,Python已经成为最受开发者欢迎的语言之一。因为它对技术自然友好的特性,以及它不断更新的新功能。Python越来越受到国内外开发者的青睐。越来越多的独立、大型项目开始使用Python。
20世纪90年代初,荷兰人吉多范罗苏姆决定开发一种新的脚本解释器,作为对ABC语言的继承,以消磨圣诞节的无聊时光。
Python(意为大蟒蛇)被选为编程语言的名称,取自20世纪70年代在英国首映的电视喜剧《蒙提.派森的飞行马戏团》(蒙蒂Python的飞行马戏团)。
Python也是区块链开发者最实用的语言之一。今天,我们为Python开发了一个简单的区块链数据结构。
在本文中,我们一方面会讲解区块链数据结构的基本概念,比如hash的工作原理;另一方面,我们会用实际代码搭建一个区块链的基本数据结构,让你对区块链和Python的基础有一个基本的了解。
话不多说,言归正传!
从哈希函数开始。
在区块链,数据结构是非常重要的基础组成部分,尤其是比特币。虽然单一的数据结构不能被构建成加密的数字货币,但是理解数据结构对于理解区块链的基本原理是非常有益的。
但是在讨论数字结构之前,我们先从哈希开始。以比特币的SHA-256哈希函数为例,来说说如何用Python实现哈希。
哈希函数,也称为哈希算法,是一种从任何类型的数据创建小数字“指纹”的方法。哈希函数将一条消息或数据压缩成摘要,使得数据量变小,数据格式固定。这个函数混淆了数据,重新创建了一个指纹,称为哈希值(或哈希值)。哈希值通常由一串短的随机字母和数字表示。
对于任何长度的任何消息,SHA256将生成一个256位的哈希值,称为消息摘要。
这个抽象相当于一个长度为32字节的数组,通常用长度为64的十六进制字符串表示。
看一个例子:
在这句话中,哈希函数SHA256后得到的哈希值为:
回到SHA-256,说白了,就是一个哈希函数。那么我们如何用Python实现呢?下面的代码展示了用Python实现“hello world”的过程:
看到这里,你可能会问,“256”在SHA-256到底是什么意思?哈希算法是将任意文本转换为256位随机二进制字符串的过程。在上面的例子中,“hello world”是一个11位字符(只计算字母)。散列后,它变成如下字符串:
b 94d 27 b 9934d 3 e 08 a 52 e 52d 7 da 7 dab fac 484 EFE 37 a 5380 ee 9088 f 7 ace 2 EFC de 9
同样,即使我的文本不是11位长,生成的字符数也是一样的。例如:
在上面的例子中,“我是最好的总统。永远不会。”(意思:我是史上最好的总裁),哈希运算后的字符串是64位。即使输入文本是100位,哈希运算后的字符数也是64位。
这是因为字符是十六进制的。如果我们将这样的字符串转换成二进制,我们将得到一个256位的二进制字符串。如下图所示:
接下来,我们来看看哈希算法的特点。哈希的特点之一是“无冲突原则”。这个原理意味着,要得到一个256位的二进制字符串,显然不止一个输入可以做到。
因为256位的输出长度是固定的,但输入长度不受限制,所以输入范围远大于输出。只要输入可以穷尽,就有可能得到两个相同的256位输出。
说到这里,要找到这样的两个输入是非常困难的。即使输入稍有改变,输出结果也会完全不同。如下图所示:
因此,在2中找到相同输出的唯一方法是穷尽所有字幕和数字组合,这几乎是不可能的。概率是2的256次方。
115792089237316195423570985008687907853269984665640564039457584007913129639936
几乎等于10的77次方。这是什么概念?在460亿光年的宇宙中,可见原子的数量只有10的78次方。这个数字几乎等于宇宙中的原子数量!
计算这个数字需要多长时间?搭配NVIDIA Geforce 1080 Ti显卡,浮点运算的计算能力11.3。每个哈希需要计算3000次,需要以每秒376666666个哈希的速度计算。如果找到两个相同的哈希结果,就需要计算2的128次方。地球上所有人一起算,需要的时间如下:
这比地球的真实时间还要长。
用Python创建第一个块
知道了hash是什么,我们来说说block是什么。事实上,区块链是一个相互关联的序列。接下来,我们创建第一个块,也称为“创建块”。代码如下:
交易将包含在区块链中。交易很好理解,就是谁把多少钱转给了谁。我们对数据块进行排序,以便对其进行哈希处理:
这样,我们得到另一个块,姑且称之为“块2”:
散列块2:
得到了“第三块”。
然后散列块3得到“块4”。
这样,为了确保块上的数据没有被篡改,我只需要检查最后一个块的hash。而不是从创建块开始。该原则还消除了保存区块链上的数据的可能性。
通过上面的代码,可以得到以下结果:
这样,用Python进行简单区块链开发的演示就结束了。Python是一种强大的语言,区块链是一种强大的信用工具。两者结合必然会创造出新的可能性。
【结束】