工作量证明 (Proof-of-Work)
为了在点对点基础上实现一个分布式时间戳服务器,我们需要使用类似于 Adam Back 的 Hashcash [6]的工作量证明系统,而不是依赖报纸或 Usenet 帖子。工作量证明涉及扫描一个值,当使用 SHA-256 等哈希函数进行哈希时,哈希值以若干个零位开头。所需的平均工作量随着所需零位数的增加而呈指数增长,并且可以通过执行一个哈希操作来验证。对于我们的时间戳网络,我们通过在区块中递增一个 nonce,直到找到一个使区块哈希满足所需零位的值来实现工作量证明。一旦 CPU 的努力被用来满足工作量证明,区块就无法在不重新进行工作的情况下被更改。随着后续区块的链接,改变该区块的工作将包括重新处理所有后续区块。
Block: 区块
Prev Hash: 前一区块哈希
Nonce: 随机数
Tx (Transaction): 交易
工作量证明还解决了在多数决策中确定代表性的问题。如果多数基于一 IP 地址一票的原则,任何能够分配多个 IP 的人都可能破坏它。工作量证明本质上是一个 CPU 一票。多数决策由最长链代表,最长链投入了最多的工作量证明。如果大多数 CPU 能力由诚实节点控制,诚实链将增长得最快,并超越任何竞争链。要修改过去的一个区块,攻击者必须重新进行该区块及其后所有区块的工作量证明,然后赶上并超过诚实节点的工作量。我们稍后将展示,随着后续区块的增加,攻击者赶上的概率会呈指数级下降。
为了补偿硬件速度的提高和随着时间推移运行节点的兴趣变化,工作量证明的难度通过一个移动平均值来确定,目标是每小时生成的平均区块数量。如果生成速度过快,难度将增加。