熊市学技术—《挖矿=POW=工作量证明》

当前位置:首页 > 币圈百科 > 熊市学技术—《挖矿=POW=工作量证明》

熊市学技术—《挖矿=POW=工作量证明》

2023-02-05币圈百科204

《比特币:四十八万页的账本》中提到,货币的本质是记账,比特币是分布式记账。那么问题来了,这个账谁来记,怎么记?

答案:矿工通过挖掘记账。

pow

说起采矿这个词,第一印象就是一群黑暗的矿工拿着锄头和探照灯在黑暗的地下挖掘。无数次叮叮当当的声音过后,突然一个矿工捡起一块透明的宝石或者黄灿灿的金子,大喊一声“挖啊,挖啊”。这是电影或小说中的情节。然而真实的情况是,在区块链网络中,“挖矿”这个词现在已经深入人心,所以我必须说下去。“挖矿”其实是对比特币等数字货币记账和发行的一个形象化称呼。这种行为背后真正的行动是网络上无数台计算机争夺记账权,解决一个特定的问题。哪台电脑先解决了这个问题,在全网所有电脑的见证下,解决问题的电脑将完成记账(打包一块),获得网络奖励的比特币。那么问题出在哪里?就是给一个块的块头找一个特殊的哈希值,这个特殊的哈希值要小于预设的目标值。为了方便,我们举个简单的例子。在区块链世界中,使用一种叫做SHA256的算法。其特点是给定任意一个句子,经过算法后可以得到一个哈希值。比如输入“Power Overwheeling”(玩过星际的都知道这个人是什么,呵呵),通过SHA256算法得到一个32字节的哈希值:' 8 e 12 dec 3 DC 8433 bfe 04 ca 1 e 4381 feaa 58d 30 C5 EC 06d 37756d 88 face 23 aa3 e 1 '由于sha256算法的特殊性,如果对这句话修改或添加任何字符,输出哈希值都会发生变化:比如在原句后加一个“1”,输入“Power Overwheeling获得一个新的32字节哈希值:' d9e 940764 a 410 ECF 7 AE 1 f27a 63248070 ab 45292 e 41 de 1 CD FC 89433 ba2c 20 AC 7 '现在设定一个目标,通过修改语句末尾的数字,十六进制哈希值的第一位将为0(一个256位二进制哈希值的前四位都为0)。下面是一个简单的代码,对句末不同的数字进行迭代,统计出符合要求的哈希值。代码如图1

执行程序,分别输入句子“power override”和数字“4”,数字“4”表示目标哈希值的第一个十六进制数字为0。图2

以上运行结果。-目标哈希值为010000000000000000000000000000000000000000000000000000000000000000000000-总共计算了32次,合格哈希值出现了两次,平均每16次一个。这是因为十六进制数字代表0。如果程序再次执行,输入“给我看看钱”,将数字“4”改为“8”。目标散列的前两位全是零(或者256位二进制的前八位全是零)-目标散列值是:00100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000需要的哈希值的0位越多,计算目标的次数就越多。比如从比特币区块链的477016块的数据来看,转换成二进制后的哈希值是:0000000000000097 cf 400 e 2634 e1b 42CB 0B 55B BD 25476 a 3 e 97 a5 E0 d 5。它需要多达72位的零,也就是说,每4.710 ^ 21次计算,大概就会有一个正确的哈希值。这种通过改变尾部值来重复计算得到正确哈希值的做法被称为工作量证明机制——POW-proof of work,在尾部重复迭代的数被称为nonce值。如何计算真正的块头hash?在实际块头hash值的计算中,会用到以下六个数据:图3

前五个都是已知值,分别是版本号、前一个块的hash值、从创始块到现在的时间戳、根merkle值和难度标记。 Merkle value是通过蓑衣网小编2023递归所有等待打包到块中的事务生成的值——有关详细信息,请参考Day2文章。由于各种原因,网络上不同的矿机在等待打包的块中可能有不同的事务记录和时间戳。Bits难度标记是整个比特币网络调整的参数,以比特币的总量和年产量为基准。根据中本聪的计划,比特币总量为2100万,每四年开采量减半。这个参数就是为了保持这个节奏而生的。它有两个作用:一是保证无论全网的哈希计算能力有多快,每两块之间的间隔始终保持在10分钟左右;其次,这个参数也是要打包的块的目标哈希值。回到块477016,难度目标是18015dcc,前两位是幂,后六位是系数。通过下面的公式展开后,可以得到目标哈希值。公式:目标哈希=系数* 2 (8 *(附表-3)。系数=0x 015 DCC exposition=018 target hash=0x 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000但由于十六进制的目标hash有17个零,转换成二进制后,零的个数高达72,每次计算是4.710 ^ 21次。但目前整个比特币网络的哈希计算能力为-6200 pH/s,即每秒可进行6.210 ^ 18次哈希计算,因此每个区块的生成时间约为750秒,相当于12.5分钟,略高于比特币每个区块的生成时间-10分钟。这个节奏也是比特币网络的心跳。普通笔记本的计算能力大概是1 * 10 ^ 8次/s,可能不正确,但是没关系,因为按照这种变态哈希计算能力的要求,多一个零,少一个零,相差15万年,或者150万年,对于人类短暂的存在来说也是一样的。但是,一旦找到正确的nonce,并且计算出小于目标的散列值,每个人都可以使用相同的一组参数来验证计算是否正确。例如,对于块477016,块头信息如图4

所示。根据公式hash=SHA 256(块头),python代码编写如下:图5 。分别输入以下六条信息:版本信息中,从块头根的merkle时间戳的难度目标nonce值中获取一个hash值,这个值正好等于第477016号块00000000000097 cf 400 e 2634 E1 b 42 CB 0b 55 BD 25476 a3 e 97 a5 E0 d 481d 5图6

一旦矿机计算出正确的hash值,就意味着块头正是因为计算量如此巨大,所以出现了所谓的专业矿机。都配备了专业的GPU阵列,和大数据计算很像,事实也确实差不多。用GPU传输如此海量的同质化数据,速度更快,效率更高。一个比特币矿一般是这样的。这么多专业矿机一起工作,能耗惊人。图7

如上所述,整个比特币网络的哈希计算能力为-6200 pH/s,在这种计算能力下,全球矿每小时消耗超过230万度电,每年190亿度电。目前国内民用电量约为0.55人民币/千瓦时。以此价格计算,每年耗电105亿人民币,目前比特币年产量约66万。

由于用电量巨大,为了降低成本,大部分矿山都建在水力发电丰富的地区,如西南地区,电价约为0.35人民币/千瓦时。下图是偏远西部的一个矿的位置,结合周围的景色看起来真的很像一个“矿”。 图8

下面是上文提到的代码,有大蟒界面的可以拿回家试试看

# hash-nonceimport hashlib

text=raw _ input("请输入一个句子:)#迭代随机数从0到xxxdifficult=raw _ input("请输入一个0-32的数字:")bit=int(不同)count=0 list=[]target=2 * *(256位)hextar=x range中nonce的hex(目标)(4 *(2 * *位)):#将目前添加到textinput=文本字符串(nonce)的末尾

#计算hexdigest()#显示输入和散列结果打印输入,'='hashif long(hash,16)
熊市学技术—《挖矿=POW=工作量证明》 | 分享给朋友: