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


但是,这个账单是需要生成的,也就是需要矿工来挖矿。首先用户拿币来交易,这时生成了一个订单,矿工拿到订单信息时需要生成合法账单信息,等到生成成功,矿工会把交易账单分享到各个节点,这时交易才能完成。每一笔账单上的信息包含:账单号、交易时间、交易内容、上一笔账单的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)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

运行结果图:




由图可以看到,只前六位为0生成10个Hash串就耗费833秒,平均一个83.3秒,再往上加所耗费的时间几何倍地增长。

所以要挖矿的小伙伴最好用C/C++编写,并且设备、网络采集信息等都要领先他人才能挖矿。

————————————————

版权声明:本文为CSDN博主「fyq201749」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/fyq201749/article/details/80973103