精通比特币(77):工作量证明算法

  • A+
​哈希函数输入一个任意长度的数据,输出一个长度固定且绝不雷同的值,可将其视为输入的数字指纹。
对于特定输入,哈希的结果每次都一样,任何人都可以用相同的哈希函数,计算和验证哈希结果。
一个加密哈希函数的主要特征就是不同的输入几乎不可能出现相同的数字指纹。因此,有意的选择一个输入去生成一个想要的哈希值值是几乎不可能的,更别提用随机的方式生成想要的哈希值了。

 

无论输入的大小是多少,SHA256函数的输出的长度总是256bit。

 

工作量证明的流程示例说明

1.将使用Python解释器来计算语句 "I am Satoshi Nakamoto" 的SHA256的哈希值。
SHA256示例
$ python Python 2.7.1
>>> import hashlib
>>> print hashlib.sha256("I am Satoshi Nakamoto").hexdigest() 5d7c7ba21cbbcd75d14800b100252d5b428e5b1213d27c385bc141ca6b47989e

 

2.通过反复修改nonce 来生成不同哈希值的脚本的输出
$ python hash_example.py
I am Satoshi Nakamoto0 => a80a81401765c8eddee25df36728d732...
I am Satoshi Nakamoto1 => f7bc9a6304a4647bb41241a677b5345f...
I am Satoshi Nakamoto2 => ea758a8134b115298a1583ffb80ae629...

 

每个语句都生成了一个完全不同的哈希值。它们看起来是完全随机的,但你在任何计算机上用Python执行上面的脚本都能重现这些完全相同的哈希值。
​类似这样在语句末尾的变化的数字叫做nonce(随机数)。Nonce是用来改变加密函数输出的。

 

​为了使这个哈希算法变得富有挑战,我们来设定一个具有任意性的目标:找到一个语句,使之哈希值的十六进制表示以0开头。(目标即难度阈值,称这个为Target目标阈值。我们的目的是找到一个小于这个目标的哈希值。如果我们减小这个目标值,那找到一个小于它的哈希值会越来越难。)

 

以掷骰子来说明可以估计从实现目标难度取得成功所需的工作量。(不断扔一对骰子以得到小于一个特定点数的游戏,当目标为2时(最小可能点数),只有一个人平均扔36次或2%扔的次数中,他才能赢)

 

尽管每次尝试产生一个随机的结果,但是任何可能的结果的概率可以预先计算。 因此,指定特定难度的结果构成了具体的工作量证明。

 

此外,知道目标值后,任何人都可以用统计学来估算其难度,因此就能知道找到这个nonce需要多少工作。
工作证明必须产生小于目标的哈希值。 更高的目标意味着找到低于目标的哈希是不太困难的。 较低的目标意味着在目标下方找到哈希更难。 目标和难度是成反比。

 

比特币的工作量证明

矿工用一些交易构建一个候选区块。接下来,这个矿工计算这个区块头信息的哈希值,看其是否小于当前目标值。如果这个哈希值不小于目标值,矿工就会修改这个nonce(通常将之加 1)然后再试一次。按当前比特币系统的难度,矿工得试10^15次(10的15次方)才能找到一个合适的nonce使区块头信息哈希值足够小。

发表评论

您必须才能发表评论!