# Bitcoin白皮书解读_Part2

By [HuiSu](https://paragraph.com/@huisu) · 2023-04-28

---

第三章：时间戳服务器(Timestamp Server)
----------------------------

**3.1 原文翻译**

本解决方案首先基于时间戳服务器(Timestamp Server). 时间戳服务器通过对以区块(block)形式存在的一组数据实时随机散列而加上唯一时间戳，并公开广播该散列从而做到信息公开。时间戳作为某数据或某信息hashing的产物，可以证明数据必然在该时刻存在过。每个时间戳形式时包含该事件先前已完成的所有hashing结果(已发生过的、已生成了的时间戳)，因而形成链状。

**3.2 扩展阅读**

1.  同时发生的交易将被分组打包放在一起，打包的产物就是区块。这样做可以提高效率节省内存：把多个没有交叉关系的交易一起打包再加上时间戳，要比单独地戳每个交易高效。
    
2.  计算出这些交易的哈希值，并将其发布到具有广泛受众的外部进行公示。这个哈希值同时代表着时间戳：一个哈希值生成的前提是其包含的数据必须已经存在，所以哈希值的发布也记录着数据存在的时间。
    
3.  最后，随着更多交易产生并被记录，区块不断增加。想要生成新的哈希值，就需要用从当前块和前一个已存在的哈希值来计算。由于哈希值不能被逆转，如果块B的哈希值可以从块A的哈希值计算出来，这就证明了块A出现在块B之前。
    

![](https://storage.googleapis.com/papyrus_images/c3d2732bd878a0ea093f0a623dd60fc186d131eedc8b7cd0c0cd6d41f361d90e.png)

由于哈希值/时间戳是公开发布了的，每个人都可以检查它们的发布时间以及是否形成链。也就是说每个人都可以检查区块B的哈希值是否可以从区块A的哈希值计算出来(通过重新计算)，从而确定区块A中包含的交易必须在区块B的交易之前被记录下来。这是比特币中矿工经常做的一种验证：验证新区块是否有效、旧的区块是否被篡改。

注：加密哈希函数有很多类型，比特币所使用的加密哈希函数为SHA-256。

第四章：工作量证明(Proof-of-Work)
------------------------

相关视频，动画形式更清晰：[https://www.youtube.com/watch?v=3EUAcxhuoU4](https://www.youtube.com/watch?v=3EUAcxhuoU4)

背景：基于区块链的系统，由去中心化节点的集体工作维护。其中一些节点被称为矿工，节点产生的过程叫做挖矿。与真实的挖矿类似，矿工需要付出体力劳动去不同位置挖矿，并不是每次挖掘都能有成果，所以想要挖到矿就需要付出时间精力与体力去进行多次尝试。在比特币中矿工多次尝试后成功匹配的就是区块，成功挖到后矿工需要一份工作量证明来表示这个区块是自己挖的，同时获取一定奖励（因为通过他的努力，区块增多了）。

由于哈希函数所生成的哈希值是不可逆推的，想要知道某个哈希值所代表的含义就需要通过多次尝试（猜密码），直到匹配出对应结果。这一过程毫无疑问是花费大量时间且完全随机的，成功匹配一个哈希值需要耗时耗力，所以任何人成功匹配了后需要一份工作量证明来表示自己所付出的努力。这个尝试的过程叫做**挖矿**。

【挖矿】的过程是矿工需要尝试猜测一个伪随机数，又称NOUCE。该随机数与块中提供的数据结合并生成随机散列，矿工再尝试能否与原文匹配成功。

![](https://storage.googleapis.com/papyrus_images/94f18bcadbf08563e9153214838810607904f6bdde62785a0d7fe501e4fafdb1.png)

匹配成功后矿工将信息公开，其他矿工来验证匹配成功的有效性。验证通过后有效的区块将成为区块链中的一个节点，该挖矿的矿工可以相应获得奖励。为了证明每个区块是哪位矿工挖出的，每个区块都会生成一串blockhash作为工作量证明，也就是Proof-of-work。

![](https://storage.googleapis.com/papyrus_images/e75af0efa10ad4de43d9fb6b6dd1be9910e89cc84acb803add46abf13a84b384.png)

网络上的矿工花费大量的精力与计算力去验证，一旦A矿工找到了某一方法后将其方案公布，其他矿工通过验证的方式核验该问题是否被A解决，确定后A矿工会获得一定奖励，同时也会获得一份证明来证实他耗费的时间、精力与计算力来解决了这个问题。

**区块链的方式有效防止偷盗、篡改**

一旦区块被验证、矿工获得工作量证明，则该工作就完成了，不得被修改。如果想要修改信息则需要重新工作。由于区块链的链状结构，想要更改链中的某个区块则需要连同该区块后连接着的所有区块一并更改才能生效，也将需要消耗更多的cpu计算力。这种设定可以解决两个问题：不可逆、防止攻击者篡改。随着链中区块的增加，攻击者需要进行追赶，也就是他重新生成信息的速度需要高于新增区块的增加速度，这对计算力有非常高的要求，往往导致攻击者所付出的比他最终获得的利益要多的多。

**由“一个IP一个投票权”变为“一个CPU一个投票权”**

工作量证明还解决了做决策时少数服从多数的规则可行性。如果大多数人都是基于一个ip地址一票(One-IP-one-vote)的原则，那么通过某种方式拥有多个ip地址的人可以从中作弊。工作证明本质上是实现一个cpu一票(One-CPU-one-vote)。决策的结果由最长的链所决定，因为链最长=区块做多=拥有最大的工作量证明=投入付出了最多的CPU计算能力。

第五章：网络(Network)
---------------

**5.1 原文翻译：**

网络成功运行的原则有以下几点：

1.  新交易成交时需要广播周知所有已有节点
    
2.  所有已有节点需将新交易(一个或多个)收集进一个区块
    
3.  所有节点开始致力于匹配新区块的哈希值，拼配成功后可获得工作量证明
    
4.  当某一节点匹配成功并获得工作量证明时，需要公布周知所有其他节点
    
5.  区块成功验证需要具备两个条件：区块内的所有交易都是有效的、成交了的，并且这些交易都是该coin的首个成交交易(当同一coin同时参与多个交易时，首个成功的交易是算数的)。一旦满足这两个条件，所有已有节点将接受、认证该区块是有效的。
    
6.  所有节点认证该区块的有效性后，将使用被认可的区块所生成的随机散列，在已有区块链的末端生成一个新的区块。
    

节点总是认为最长的链是正确的，并将不断基于它添加新的数据信息，从而延长它。如果两个节点同时广播了两个不同版本的“下一个区块”，作为信息接受方的众多节点中有的会优先接收到其中一个，而另一部分节点会先接受到另一个。在这种情况下，节点们将在他们各自先接受到的那个区块上继续工作，但同时也会把“下一个区块”的另一版本作为分支保存下来。当下一个工作量证明产生时，就可以解决之前的分歧\[注1\]。新的区块链接在正确的分支之一，两个分支就会出现长度差异，节点们会基于更长的链继续工作，而之前在另一版本“下一个区块”中工作的节点也会切换到最长的链上。

\[注1\]：当下一个区块出现时，其随机散列值包含先前所有交易的随机散列与该交易的接收方地址，所以这里的“先前所有交易的随机散列”就可以判断出当前产生分支的两种版本哪一个是成立的。

新交易的广播不用必须到达所有节点。只要多数节点接收到信息后他们会将新交易打包接在链上，其余节点就会从链的增长而知悉新交易的产生。同时区块广播机制还能避免信息遗漏。如果某节点没有接收到某个新区块产生的信息，它可以从下一个新区块接入的同时获取那条miss的信息。

**5.2 扩展阅读**

**1\. 验证结果**

一个矿工公布了自己匹配成功的哈希值后，其他矿工(或者说节点)需要去验证该哈希值的准确性。

**2\. 在进行挖矿时，需要认可上一个块的准确性才能继续**

第六步中“所有节点认证该区块的有效性后，将使用被认可的区块所生成的随机散列，在已有区块链的末端生成一个新的区块。” 需要将当前块加入链中，就要认可链末端的区块(也就是上一个被验证的区块)的有效性。这一步保证每一个区块都是被验证过的、准确无误的。

**3\. 最长链规则**

如果两个矿工同时提交了针对下一个区块的不同哈希值，由于只有一个是正确答案，那么意味着这两个矿工中必定有一个人是错误的。这时如何验证谁对谁错呢？首先这两个区块都会被保留，待下一个区块生成时，由于“每个区块中都包含历史所有交易信息”，所以下一个区块中必然包含上一个正确区块的信息，可以用这个来判断两个答案中哪个是准确的。判断成功后下一个区块自动转移到正确链条中。

---

*Originally published on [HuiSu](https://paragraph.com/@huisu/bitcoin-part2)*
