挖矿基本原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fyq201749/article/details/80973103

刚研究了区块链的原理,今天使用Python介绍一下矿工是如何挖矿的。

首先,先科普一下为何需要矿工去挖矿。区块链使每一笔交易变得可靠,即将每一笔账单都保存在网络的每个节点。这也就让每个人都知道资金流向,让买卖更加透明,不需要一个监管部门来记录每一笔交易信息。

但是,这个账单是需要生成的,也就是需要矿工来挖矿。首先用户拿币来交易,这时生成了一个订单,矿工拿到订单信息时需要生成合法账单信息,等到生成成功,矿工会把交易账单分享到各个节点,这时交易才能完成。每一笔账单上的信息包含:账单号、交易时间、交易内容、上一笔账单的Hash、和一个数字。其中账单号也就是区块链的块号、交易时间、交易内容、上一笔账单生成的Hash都是无法更改的,所以矿工能够更改的就是最后一项数字了(这里的信息并不完整,需要详细了解请百度或谷歌)。

忘了介绍,矿工如何生成合法的账单?所谓合法的账单,是根据每一笔账单上的信息生成的Hash串所决定的,而决定Hash串的标准是根据矿工挖矿的时间来定的,为了不让矿工那么快地挖矿,所以设定了不同的难度,举个例子,Hash256生成的十六进制一共64位,为了让矿工不那么快地计算Hash值,所以设定个规则,生成Hash串的前10位必须是0(当然也可以是前15位为0),这个账单才能生效。所以,矿工需要不停地更改数字来穷举根据账单信息生成的Hash串。

下面上代码:

#Hash库
import hashlib as hs 
#时间库
import datetime as date
#区块
class Block():
    #构造方法,传入数据包括索引、时间戳、数据、上一笔账单的Hash串、可更改的数字
    def __init__(self,index,timestamp,data,preHash,number):
        self.index = index
        self.timestamp = timestamp
        self.data = data
        self.number = number
        self.preHash = preHash
        self.hash = self.blockHash()
    #生成Hash串
    def blockHash(self):
        sha = hs.sha256()
        sha.update(str(str(self.index) + str(self.timestamp) + str(self.data) + str(self.preHash) + str(self.number)).encode("utf-8"))
        return sha.hexdigest()
#创建初始区块    
def initBlock():
    rst = Block(0,date.datetime.now(),"first","0",0)
    return rst
#创建区块链
blockChain = [initBlock()]
preBlock = blockChain[0]
#测试运行所用时间
starttime = date.datetime.now()
#生成10个区块
for i in range(0,10):
    通过修改数字来生成Hash串
    for j in range(0,10000000000):
        #由于我懒,时间戳、数据都使用了上一个区块的数据,实际需要交易时的数据
        nextBlock = Block(preBlock.index+1,preBlock.timestamp,preBlock.data,preBlock.hash,j)
        #这里只测试了前六个字符为0时的数据,成功则加入区块链
        if nextBlock.hash[:6] == "000000":
            blockChain.append(nextBlock)
            preBlock = nextBlock
            break
    print(preBlock.hash)
#测试运行所用时间
endtime = date.datetime.now()
print((endtime-starttime).seconds)

运行结果图:

这里写图片描述

由图可以看到,只前六位为0生成10个Hash串就耗费833秒,平均一个83.3秒,再往上加所耗费的时间几何倍地增长。
所以要挖矿的小伙伴最好用C/C++编写,并且设备、网络采集信息等都要领先他人才能挖矿。

猜你喜欢

转载自blog.csdn.net/fyq201749/article/details/80973103