这个网络中,一旦有CPU通过工作量证明算法获得响应结果,并将这个块加入链表,这个块就不能被改变,除非重做这个工作。随后的块都链接在这个块上,如果想改变这个块,就必须对随后的所有块都做同样的工作。

工作量证明同时解决了多数投票决策的问题,如果决策基于投票的IP地址数量,当一个投票人有很多IP时,公平性就被颠覆了,这里的工作量证明实际是一个CPU一票。多数人的决策结果由最长的链来表达,因为这个链代表了最大的工作量投入。如果大多数CPU算力由可信的节点控制,那么可信的链长度就增长得最快,并且超过其他的竞争链长度。要想修改过去的一个块,攻击者必须投入算力来重新计算这个块以及其后的所有块,并且还要超过和追上可信节点的工作。后面,我们会证明一个后来的攻击者追上工作量的可能性,会随着块的增加而指数级降低。
考虑到持续增强的硬件计算速度和网络内运行节点数量的变化,工作量证明的难度要跟随每小时块增加的数量来调整,如果增加的太快,难度就应该提升。
- 网络
运行这个网络的步骤如下:
- 新的交易被广播到所有节点
- 每个节点手机新交易到一个块
- 每个节点为这个块,计算一个较困哪的工作量证明
- 如果一个节点发现了此工作量证明,他就广播到所有节点
- 如果这个块中的所有交易是有效的并没有被用过,节点就接受这个块A
- 节点基于块A创建下一个块来表示接受此块。下一个块将使用A的哈希值
节点总是认为最长的链是正确的,并总是尝试延展他。如果两个节点同时广播不同版本的下一个块,一些节点可能先接受其中一个,这个时候他们在先接受到的块上工作,但是应该保留其他一个分支,以防止他变得更加长。这个分支的选择,将在收到下一个工作量证明时来确认,长的一个是应该保留的,其他的应该被废弃。
新的交易广播不需要到达所有的节点,只要送达足够的节点,他们不久就能进入一个块。块广播也允许丢失消息。如果一个节点没有收到块,他可以通过请求下一个块,就可以补齐丢失的部分。
- 激励
这里约定,一个块中的第一笔交易是一个特殊的奖励,即创建者拥有一个新币。因为没有中央权威机构去发行他们,这个激励机制来鼓励各个节点来实现货币的首发。保持一定数额货币的稳定增加,类似于金矿工人开发矿产,并将黄金投入流通一样,在这里就是消耗的CPU时间和电力。
激励还可以来自于交易手续费。如果交易的进入金额大约流出金额,就是因为增加了这个块中承载交易的手续费。一旦预先设定数量的货币投入流通,激励将完全来自于手续费。
激励将鼓励节点保持诚实。如果一个攻击者可以组织多余所有诚实节点的CPU算力,他有两个选择,一是通过欺诈来取消其做出的支付动作,另外一个是生成新的币。他能够很容易发现按照规则更有利,这个规则能让他获得的新币多于其攻击系统能省掉的。
- 回收磁盘空间
如果一个币经过太多次交易,在最后一笔交易时,可以将其之前的交易丢弃以节省存储空间。我们使用Merkle树来管理块的交易的hash值,以避免打乱块的hash值。旧的块可以从树的分支切除,分支内部的hash不用继续存放。

一个不含交易的块头大约80字节,假设每10分钟生成一个新块,那么一年生成的块所占用的空间为80 * 6 * 24 * 365 = 4.2MB,当前(2008年)计算机系统一般配置为2GB内存,而摩尔定理预测每年有1.2GB的增长,所以即使将这些块的头部全部存储在内存,也不是一个问题。
- 简化支付验证
验证支付并不需要所有节点参与。用户只需要保留最长的经过工作量证明链的块头,这些信息他可以从网络获得直到他确认是最长的一条,并获得Merk分支,将交易链接到特定含时间戳的块。通过检查交易在链上的位置,来确认网络节点是否接受,如果有块在其之后增加进来,则进一步确认网络已经接受此交易。
