上一篇文章讲了比特币里的矿工在干什么(比特币里的矿工干什么?区块链伪技术介绍(一)),今天我们用一个简单的例子,给大家一个直观的感受,一起来看看矿工所谓的“工作”,除了消耗电力,他们实际上在做什么。
区块链的四大基本特征是:不可篡改、不可复制的唯一性、智能合约、去中心化。不可篡改、不可复制的唯一性与区块链结构中的散列(Hash)算法密切相关。
我们知道哈希算法的特点是内容稍有变化,得到的哈希值就会有巨大的差异。因此,在上图中的链式结构中,如果我们改变区块1中的数据,由于它的哈希值是从数据中得到的,那么哈希值必然发生变化,而这个区块的哈希值如果哈希值发生变化,则它后面的块将不得不改变。而如果链条特别长,修改的成本会非常高,几乎不可能。
然后我们写一段Python代码来实现上面的block。
首先我们写一个块类,代码如下:
类Block:
块号=0
数据=无
接下来=无
散列=无
随机数=0
previous_hash=0x0
def __init__(自我,数据):
self.data=数据
def hash(self):
h=hashlib.sha256()
H。更新(
str(self.nonce).encode(\'utf-8\') +
str(self.data).encode(\'utf-8\') +
海峡(自我。previous_hash)。编码(\'utf-8\')+
str(self.timestamp).encode(\'utf-8\') +
str(self.blockNo)。编码(\'utf-8\')
)
返回h.hexdigest()
def __str__(self):
返回\'Block Hash: \' + str(self.hash()) + \'\\nBlockNo: \' + str(self.blockNo) + \'\\nBlock Data: \' + str(
self.data) + \'\\nHashes: \' + str(self.nonce) + \'\\n------------\'
我们可以看到哈希值是由数据生成的,前一个区块的哈希值,随机数,当前时间和区块号。如果这些数据中的任何一个发生变化,哈希值都会发生变化。这门课最重要的就是哈希生成算法,其他的都很简单。
接下来我们写一个区块链链表类,代码如下:
类Blockchain:
差异=20
最大随机数=2**32
目标=2 ** (256 - 差异)
块=块(\'创世纪\')
虚拟=头=块
def 添加(自我,块):
堵塞。 previous_hash=自我。堵塞。散列()
block.blockNo=self.block.blockNo + 1
self.block.next=阻止
self.block=self.block.next
定义我的(自我,块):
对于范围内的n(self.maxNonce):
打印(n)
# if (random.randint(1, 10) 2) :
自己。添加(块)
# 打印(块)
休息
如果int(block.hash(), 16)=self.target:
自己。添加(块)
打印(块)
休息
else:
block.nonce +=1
主要有两个函数,一个是添加新区块到链上的函数add,另一个是挖矿函数mine。这个功能就是矿工主要在做的所谓“工作”。它决定了新区块是如何产生的。
我们看到在一个循环中,实际挖矿的时候可能是while(true)。如果发现一个区块满足某个限制条件,在上面的代码中,执行的代码是int(block.hash(), 16)=self.target,这个比较难实现。注释掉的代码是random.randint(1, 10) 2。这个条件比较容易实现。在比特币等空气币中,条件比这个更难,难度可调,保证十分钟左右生成一个新区块。
通过上面的代码,我们实现了一个简单的区块链,也让大家看到了矿工所谓的“工作”,就是想办法实现一个难的或者容易的算法条件。
最后,我们写一段代码来执行这个简单的块,代码如下:
区块链=区块链()
对于范围(5): 中的n
blockchain.mine(区块(\'区块\' + str(n + 1)))
而blockchain.head !=None:
打印(区块链。头)
blockchain.head=blockchain.head.next
结果如下: