yjjnls/Notes

View on GitHub
block chain/Basic/proof of work.md

Summary

Maintainability
Test Coverage
# 工作量证明共识机制
分布式网络的数据一致性是最难的问题了,在这种去中心化的网络集群下就更难了。其中最大的本质差别是,一个公司内的分布式系统中的结点是被假设成可信任的,而在去中心化的网络下,结点要被假设成不可信任的。想象一下,在一堆不可信的结点上做一致性是不是一件很难的事?

这里,需要解决几个与 " 数据一致性 " 相关的问题。

*   以谁的数据为准?
    任何结点都可以修改自己所下载的账本,也就是任何一个人都可以伪造账本。那么,谁的数据才是对的?在去中心化的网络下,我们只能认为,大多数人认识的数据是对的。只要我控制了一半以上的结点,那么我让这 " 大多数人 " 伪造同一份账本,那么相当于整个账本都被我修改过来了。因为在没有服务器的去中心化的网络下,所谓的真理只不过是大多数人同意的东西。
*   " 大多数人 " 的问题。
    是人数吗?在网络世界里,我可以用程序模拟出无穷多的 " 人 " 出来投票,所以,用人数来解决去中心化的问题,在分不清是人还是狗,是生物还是程序的计算机世界里,是一件很愚蠢的事。
*   意见分歧问题。
    如果在同一个时刻,有多个人都在告诉其它人,这账应该这么记。比如说,有人说,左耳朵转了 10 块钱给了耗子叔,有人说,左耳朵转了 20 元给了耗子叔,还有人说,左耳朵没有花钱,是陈皓花的钱。而且,他们的数据都合法,那么,整个网络应该听谁的?

是的,这种没有人组织的玩法真是乱啊。

为了解决这几个问题,比特币使用了 Proof-of-Work 工作量证明机制,也就是 " 挖矿 "。所谓的 " 挖矿 " 其实就是用大规模的计算来找到一个符合系统要求的区块 ID。要找到符合条件的区块 ID 只能通过暴力穷举的方式,所以要付出大量的系统计算资源和电力。

这样一来,我们用这种 " 极度消耗计算力 " 的方式来提高成本,从而有效地遏制或解决下面几个问题。


1.  修改几乎变得不可能。试想,如果生成一个区块需要大量的长时间的计算力。也就是在世界上最好的电脑集群下计算 10 分钟才能打好一个包,那么,当我们要去修改数据内容的时候,这个过程也是一样的。前面说过,如果你要伪造一个块,那么你就要修改后面所有的块,修改一个块的成本如此之高,那么修改整个链的成本也就非常之高了。
2.  能掌握 51% 的算力的人也变得几乎不可能。除了伪造一条链的成本很高,还要控制大多数人的算力,这意味着,是一个非常大的金钱的投入。这两个难度加起来,几乎不太可能。
3.  解决分歧。一方面,这么大的工作量找出来的区块 ID,已经有效地降低了大家有意见冲突的概率。另一方面,就算是出现了合法冲突的区块(同时出现了多个合理的区块,即区块链出现分支 / 分叉),也就是多个合法的账本。而因为挖矿的成本太高,导致要同时跟进多个账本是不可能的,所以矿工们只能赌跟其中一个。大多数人所选择的那一个分支的链就会越来越多,于是另外一边也就无人问津,从而作废了。


你别看 Proof-of-Work 成本这么高,还这么耗电不环保,但是,这是目前去中心化系统中最安全的玩法。