大家好 我是西拉杰
今天我们要在五分钟里用Python打造一个区块链
准备好了吗 让我们开始吧
区块是一种包含数据和其他属性的数据结构
区块可以串联起来形成一个区块链条
所以被称为区块链
比特币协议用区块链数据结构存储交易数据
但我们可以在区块链中存储任意数据
为了了解它如何工作
让我们一起用谷歌的Code Labs环境
在浏览器中编写我们自己的区块链吧
我们将边写代码边在浏览器中看效果
以便更好地理解区块链
打造区块链需四步
导入依赖
创建一个区块
创建一个区块链
以及输出区块链的内容
首先导入datetime库
这样我们可以给每个区块生成时间戳
我们还需导入hashlib库
它包含一个定义区块时用到的重要算法
我们把区块定义为一个Python类
然后定义它的属性
每个区块都有七个属性
我们可以把它们分别列为不同的变量
首先 区块编号
用来对每个区块进行索引
接下来 存储在这个区块中的数据
比特币区块链在这里存储交易数据
为了简单起见 我们将只存储一个字符串
再定义一个指向下个区块的指针
还有当前这个区块的哈希值
Hash是一个把数据转换为固定长度数字的函数
哈希值被用来作为区块的唯一性标识
也用来验证这个区块的真实性
除此之外
定义一个只使用一次的nonce变量
后面我们会用它计算区块的唯一哈希值
接下来我们定义previous_hash变量
当我们建立区块链时
它将储存前一个区块的哈希值
最后 我们用datetime库生成这个区块的时间戳
定义好了这些属性以后
我们来实现这个类的初始函数
它定义了我们如何来初始化一个区块
唯一的参数是用户提供的数据
我们还需要为区块定义一个哈希函数
hashlib库包含了流行的sha256算法
用来生成代表一段文本的256位签名
把区块的五个属性串接起来 作为函数的输入
看到是如何用区块的独特属性创建哈西值的了吗?
一旦有人更改了区块链中某区块的哈希值
该区块后的每个区块都会改变
因为每一个区块的哈希值在生成时
都使用了前一个区块的哈希值
在完成Block类之前
让我们来写一个可以打印出区块的值的函数
定义好Block类以后
就可以开始定义Blockchain类了
我们先来定义Blockchain类的两个关键属性
创世区块和头指针
创世区块 也就是区块链的第一个区块
我们会在里面存储字符串”Genesis”
头指针则指示区块链最新加的区块
随着我们不断新加区块到区块链中
头指针会不断更新
说到添加区块 我们来写一个add函数
这个函数会添加一个区块到区块链中
被添加的区块是需要的唯一参数
区块链只是被美化了的链表
把新区块的previous_hash设为当前区块的哈希值
再把新区块的编号设为当前区块的编号+1
因为它是下一个区块
然后将当前区块的next指向新区块
区块链的头指针将指向新区块
现在我们还需要写一个mine函数
通过它可以让网络中彼此并不了解的节点
对唯一的区块链达成共识
构建一条不可更改的链
挖掘区块需要计算能力
这是一种防御性机制
在比特币区块链中
攻击者需要控制网络中的大部分计算能力
才能修改一个区块
以此来获得本不属于他们的钱
在比特币网络中
51%的计算能力
比世界上最快的500台超级计算机的算力之和还大
因为没有人可以控制那么大的算力
比特币网络已经平稳运行快十年了
我们还需要在Blockchain类里再定义三个属性
maxNonce 值为2的32次方
这是最大的32位数字
然后 挖掘难度系数 diff
我们使用挖掘难度系数来计算目标哈希
这会是2的256减去挖掘难度系数次方
在挖掘(mine)函数中
判断是否可以将某区块添加到区块链中
从0到2的32次方
也就是maxNonce的值
检查给定区块的哈希是否小于目标值
这跟比特币的挖矿函数完全一样
如果哈希值比目标值小
就把这个区块加入到区块链并退出循环
否则就递增nonce变量
重复刚才的过程一直到退出循环
挖掘难度决定了挖出一个区块需要多大的算力
难度越大 需要的挖掘时间就越长
从挖掘成功后nonce的值也能体现出来
定义好了两个类
就可以初始化一个区块链了
然后我们写一个循环来挖10个区块
用唯一的字符串来初始化每个区块
最后我们打印出区块链中的每一个区块
编译这段代码
我们可以看到区块链中每个区块
以及他们的关联属性
包括唯一哈希 数据 以及时间戳
希望这段教程对你有帮助
欢迎订阅 观看更多的编程视频
现在 我要去破解网络防火墙了
多谢观看