硬文:为什么中本聪不给比特币设计最终性?

news2024/12/23 22:09:07

14af71d86dc7f4171c67b109f00edcc1.png

* * * 原创:刘教链 * * * 

昨日刘教链公众号刊发原创文章《论比特币和以太坊的“宕机”》之后,引发了一些对区块链工作原理感兴趣的朋友的热烈讨论。其中,魔笛手社区群主Claire提了一个好问题:为什么中本聪不给比特币设计最终性(finality)呢?或者说,为什么中本聪设计的比特币没有显式最终性(explicit finality)呢?

透彻地了解这个问题,需要对计算机科学的一个重要分支——分布式系统——的发展历史和关键问题作一个全面了解和深入思考。在刘教链所著《上帝掷骰子:比特币史话》一书(https://leanpub.com/history-of-bitcoin 有售,以下简称《史话》)第七章“拜占庭将军”用了6个小节的篇幅对这段往事做了较为全面的铺陈。接下来,笔者试着用简单的篇幅和精炼的逻辑,来对上述问题做一个较为通俗易懂的解答。

中本聪发明比特币,克服了什么关键困难,或者说解决了什么关键问题?去中心化共识问题,或者叫做分布式一致性问题。特别的,比特币要解决的,是如何在有人可能会掉链子(宕机、掉线)、有人可能会作恶(人人皆佛魔两面)的不确定环境中,不借助于一个中心权威或者说中央统治者,就能自动达成共识(consensus)或者一致(consistency)的问题。这个问题,就是由计算机科学家Leslie Lamport在1982年的著名论文《拜占庭将军问题》中所指出和命名的“拜占庭将军问题”。

最早意识到此问题的人,并非Leslie Lamport,而是他的同事Robert Shostak。那是1978年。从1978年到中本聪发表比特币白皮书的2008年,整整30年,整个人类计算机科学界,没有人真正解决这个问题。

为什么这个问题如此难以解决?也许有学过分布式系统的朋友会说,当年Lamport就已经给出了解决方法了呀!就是拜占庭容错(BFT)算法。后来1999年的时候还有人继续改进该算法,提出了实用拜占庭容错(PBFT)等新算法。

事实上,Lamport的解题思路走向了一个错误的方向。所有BFT类的算法,都必须隐含一个假设,节点时钟同步性假设。否则,就无法形成共识、达成一致。而这个隐含假设,恰恰是自相矛盾的:想作恶的人,当然可以篡改他所控制的节点的时钟,使之不同步。要想满足这个假设,就要取消拜占庭环境的设定,那么,拜占庭容错算法只能在非拜占庭环境中工作,这解决方案是解了个寂寞!而如果作了非拜占庭环境设定,我们显然可以换用效率高出成百上千倍的算法来达成分布式一致性,比如谷歌Spanner和微信后台所用的Paxos算法(《史话》第六章第19话“时钟同步性”)。

你永远叫不醒一个装睡的人。直到今天,还有宣称去中心化的公链系统采用BFT、PBFT以及其他变体作为共识算法,在错误道路上执迷不悟。事实上,到了1985年,三个计算机科学家——耶鲁的Michael Fisher、MIT的Nancy Linch和华威大学(英)的Mike Paterson——联合发表了一篇名为《有一个错误进程即不可能达成分布式共识》的著名论文,提出了著名的“FLP不可能定理”。

FLP定理给了BFT类算法当头棒喝:只要取消掉时钟同步性假设,别说有人作恶了,即便只是有人掉链子,分分钟就把整个系统的共识搞崩溃。

路被堵死了。Lamport知耻后勇。你以为他奋发图强,一举克服了时钟同步性依赖了吗?不。他好汉不吃眼前亏、韩信能受跨下辱,借坡下驴、顺势躺平,乖乖接受了这个五雷轰顶的现实。1990-1998年,他提出了在非拜占庭环境下的高效共识算法Paxos。为啥花了这么久?在《史话》第27话“美丽的小岛”有记述这段离奇而曲折的故事,篇幅过长,不再展开。

这一下子就过去了十年。

老天爷似乎总爱给越挫越勇的人更多的挫折和挑战,“增益其所不能”。就在Lamport关于Paxos算法的论文发表的同一年,伯克利大学教授Eric Brewer提出了一个理论假说:分布式系统,无论如何,都不可能同时做到这3点:一致性(consistency),可用性(availability),分区容忍(partition tolerance)。

看起来好像一个不可能三角形。但是由于第三点不得不接受,因为网络不可能100%可靠,那么本质上就是二选一了:你要一致性呢,还是要可用性?鱼翅,我所欲也;熊掌,亦我所欲也。二者不可得兼,舍哪个而取哪个呢?

Paxos选得啥?Paxos选的是强一致性。那么就意味着,它必然、一定、不得不舍弃可用性。舍弃可用性不意味着一个采用Paxos算法的系统总是在宕机,但是它一定有机会宕机。宕机,就意味着要整体干预、协调和重启。也就意味着,对中心化控制的依赖。5秒钟思考一下,著名的“宕机链”Solana宕机之后怎么办?当然是项目方、基金会出面协调全网重启啦!它无法自我恢复。

同时,别忘记了,Paxos隐含的前提是始终同步性假设。高性能、强一致性的背后,是极其精准的时钟同步。谷歌Spanner系统甚至需要用原子钟来保证节点间分毫不差的计时。这种系统,是绝难推广到比特币所面临的拜占庭环境的。

Eric Brewer的理论假说直到2002年才被MIT的Seth Gilbert和Nancy Linch成功证明。自此成为人尽皆知的“CAP定理”。

'90年代互联网开始发展。今天的很多互联网巨头在'90-'99年之间相继成立。面对拜占庭问题,互联网技术直接选择了“躺平”,向拜占庭将军问题举手投降,直接建立公司级防火墙,把坏人拒之门外,营造非拜占庭环境,用自己中心化控制的计算机组成分布式集群,对外提供高性能的互联网服务。

在拜占庭将军问题面前,产业界选择了投降。和Lamport当年看到FLP定理证明之后的选择一样。

逃得过拜占庭将军问题,却逃不过CAP问题。产业界的实践并不晚于学术界。只不过,Lamport又一次当了“反指”(反向指标)。互联网系统的经典技术路线,并不是像Paxos选择一致性,而是反其道而行之,选择可用性。

为什么?很容易理解。你可以接受互联网服务少量的数据不准确、不及时(一致性出问题),但不能接受互联网停止服务和拒绝服务(可用性出问题)。而且,随着互联网用户规模和数据量的爆炸式增长,保持全网数据的强一致性(时时刻刻处处一致)十分困难。

既要又要是难如登天的。身段放软、适当妥协是智慧的。互联网界很自然地选择了向一致性开刀,在强一致性上做折衷,把强一致性弱化成经过一段时间之后达成一致,也就是所谓的“最终一致性”(eventual consistency)。

也即是说,互联网系统总是能够回应用户的访问请求,但是操作之后,不保证会立刻得到想要的结果。往往需要经过一小段时间t,数据才会同步更新到位。比如,笔者在刘教链公众号推送了这篇文章,并不是第一时间所有读者都能立刻收到,而是陆陆续续收到。但是最终而言,经过一段或长或短的时间,大家都会收到一模一样(一致)的文章内容。

这个最终到达全局一致性的状态,就叫做最终性(finality),或者叫做“终局”。

最终一致性走了和Lamport不同的道路,为互联网大规模发展几十年铺平了道路。但是,它虽然解决了CAP问题,却仍然只能在中心化管控的非拜占庭环境下工作。

好了,现在让我们重新回到最初的问题,拜占庭将军问题。如果我们既要一致性(记账数据不可以出错),又要可用性(系统不可以有任何宕机的可能性),又是拜占庭环境(有掉链子节点和作恶节点),也无法假设时钟同步性(任何节点都可能时间不准或者故意篡改时间),那么这样一个分布式共识系统,能被设计出来吗?

几乎所有人都会说不能。而且越是掌握专业知识的人,可能越笃信这样的系统是不可能存在的。因为见识过其中的困难,所以心中畏惧。当2008年10月31日中本聪初次披露比特币白皮书时,差不多每一个看到的人当时也都是这么想的。

中本聪给出的办法,就是放弃(显式)最终性。把最终一致性变成概率一致性(probabilisitic consistency),把最终性变成概率最终性(probabilisitic finality),即有一定概率达成一致,有一定概率达到最终性,且这个概率随时间向前流淌而迅速提高,快速逼近于100%,但永远不会到达100%。从这个意义上讲,也可以说,中本聪把最终一致性里的“最终”二字所代表的一小段时间t推向了无穷远。

用数学的语言说,就是对于任意的t < 无穷大,都有一致性的概率p < 1,而当t -> 无穷大时,p -> 1。这就是中本聪共识。

如果我们允许一致性概率p = 1,那么,显式最终性或者最终一致性就是概率最终性的特例:存在t < 无穷大,一致性的概率p = 1。

如果中本聪共识中的概率收敛速度足够快,那么不需要太久,p就会非常非常接近于1。在比特币白皮书第11小节“计算”一节里,中本聪计算过两个示例:恶意算力占比10%时,经过10个区块,一致性概率就会达到99.99988%;占比30%时,经过50个区块,概率就会达到99.99994%。(《史话》附录B:比特币白皮书刘教链译本)

随着时间的不断向前,随着区块链的不断延长,一致性概率会从0.9、0.99、0.999迅速增长,不断逼近0.9循环小数,即1。

比特币不再定义“最终”,而把“最终”的定义留给用户、留给我们。这也意味着,比特币的最终性,也是主观的。中本聪在白皮书中,给出的乐观计算是一致性达到概率99.9%,只要错误或恶意算力占不高于10%,我们就只需要在交易进入区块后再延长5个区块也就是所谓的“6个区块确认”就可以视为已经到达最够好的最终性了。

6个区块,大约是1个小时。更乐观的人可以主观上视3个区块确认就足够好了。更悲观的人也可以默默等待更久的时间。

比特币系统通过放弃设定一个强迫所有人接受的显式最终性,转而仅提供一致性的概率计算,而把何时接受共识交给每个用户的主观,从而一举突破了CAP定理、FLP不可能定理,抛弃了对时钟同步性假设的依赖,真正解决了拜占庭将军问题,实现了真正去中心化的记账系统。

我们是否有可能继续攀登,即保持和比特币同等级别的去中心化程度,并解决拜占庭将军问题,同时不放弃显式最终性,通过确定性的算法和机制,实现显式最终性呢?对此笔者不太乐观。直觉上感觉不放弃显式最终性解决拜占庭将军问题可能是一个类似于“发明永动机”的问题,区别在于在计算机分布式系统领域,目前还不知道何为“热力学第二定律”。

更大的矛盾之处还在于:如果扬弃了中本聪引入的工作量证明(PoW)——出于环保等任何政治正确的或其他方面的原因,比如改为PoS或其他什么算法;或者,扬弃了中本聪引入的链式区块账本(区块链),而是改用其他数据结构比如DAG(图),那么,都将不可避免地、必须、不得不实现显式最终性,否则,不需要消耗巨大外部能量和代价的数据就会被轻易推翻、颠覆和篡改。这样一来,在不得不实现的显式最终性和不得不克服的拜占庭将军问题二者之间,真的能兼得吗?如果实践和理论最终证明,要显式最终性,就无法克服拜占庭将军问题,如果要克服拜占庭将军问题,就必须舍弃显式最终性,那么,我们又将面临一个怎样的未来?是巨大的挫折,还是理论极限的再次突破?

行文至此,笔者心中不由地冒起冷汗,耳边仿佛回响起中本聪当年(2009.2.15)说过的话:(《史话》第38话“更好的黄金”)

“很多人自动忽视电子货币,将其视为损失的原因,因为自 20 世纪 90 年代以来,所有(做这一方面)的公司都倒闭了。很明显,仅仅是因为那些系统的中心化控制的本质让他们在劫难逃。我认为这是我们第一次尝试去中心化、基于非信任的系统。”

* * * 刘教链 出品 * * * 

加入星球,加密投资一路相伴

60499e84f8faf7990ec4288d6d38dac7.jpeg

(年费制 折合1.6元/天)

课:刘教链比特币原理音频课[链接]

书:《上帝掷骰子:比特币史话》[链接]

刘教链公众号阅读量破万的文章列表:

美联储已败(2w+)

中本聪的传奇宝藏(1w+)

比特币已胜(4w+)

比特币将要遭受一场真正的崩盘吗?(1.6w+)

PlanB:比特币牛市已结束。(1.5w+)

巴菲特:全部比特币只值25美元。(4w+)

坐拥12.9万枚比特币的大户如何看待比特币(1.8w+)

SHIB的成功,你学不会(1.1w+)

(公众号:刘教链。知识星球:公众号回复“星球”)

(免责声明:本文内容均不构成任何投资建议。加密货币为极高风险品种,有随时归零的风险,请谨慎参与,自我负责。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Babylon.js实战WebXR/元宇宙

从 VR 音频实验到街机上的 VR 休闲游戏&#xff0c;再到使用 AR 或 VR 创建新协作方式的更严肃用途&#xff0c;阅读本文后&#xff0c;你应该对今天可以做什么有很好的了解。 事实上&#xff0c;在本文中&#xff0c;我将分享我一直致力于使用 Babylon.js 构建沉浸式或增强现…

Towards Open-Set Object Detection and Discovery(论文翻译)

Towards Open-Set Object Detection and Discovery 摘要 随着人类对知识的不断追求&#xff0c;开集目标检测&#xff08;OSOD&#xff09;被设计用于识别动态世界中的未知目标。然而&#xff0c;当前设置的一个问题是&#xff0c;所有预测的未知对象共享相同的类别为“未知”…

Kali-linux使用Metasploitable操作系统

Metasploitable是一款基于Ubuntu Linux的操作系统。该系统是一个虚拟机文件&#xff0c;从http://sourceforge.net/projects/metasploitable/files/Metasploitable2/网站下载解压之后可以直接使用&#xff0c;无需安装。由于基于Ubuntu&#xff0c;所以Metasploitable使用起来十…

卧龙、凤雏!两源码学得一,代码质量都不会差!

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 有人问我&#xff0c;编程能力怎么提升&#xff0c;我说学源码学的。他有问我&#xff0c;是不学 Spring 源码比学 MyBatis 更好…

ESP32 event loop(事件循环)(17)

提示&#xff1a;本博客作为学习笔记&#xff0c;有错误的地方希望指正&#xff0c;主要参考乐鑫技术手册说明结合实例代码分析&#xff0c;结合理论知识学习后示例分析以及常见问题说明。 文章目录 一、ESP32 Event Loop 概述2、使用 esp_event APIs3、默认 event loop4、句柄…

Java进阶-面向对象进阶(抽象类接口内部类)

1 抽象类 1.1 概述 1.1.1 抽象类引入 ​ 父类中的方法&#xff0c;被它的子类们重写&#xff0c;子类各自的实现都不尽相同。那么父类的方法声明和方法主体&#xff0c;只有声明还有意义&#xff0c;而方法主体则没有存在的意义了(因为子类对象会调用自己重写的方法)。换句话…

Marvin - LLM驱动的AI函数开发包【Python】

Marvin是一个用于构建 AI 驱动软件的Python库。 Marvin 的工作是将 AI 直接集成到你的代码库中&#xff0c;使其看起来和感觉起来与任何其他功能一样。 Marvin 引入了一个新概念&#xff0c;称为 AI 函数&#xff08;AI functions&#xff09;。 AI函数与传统函数的不同之处在…

Java进阶-常用的API

1 Math类 1.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于Math类的定义如下&#xff1a; Math类所在包为java.lang包&#xff0c;因此在使用的时候不需要进行导包。并且Math类被final修饰了&#xff0c;因此该类是不能被继承的。 Math类…

springboot+jsp超市库存进销存管理系统-a597o

Spring框架是Java平台的一个开放源代码的Full-stack(全栈)应用程序框架&#xff0c;和控制翻转容器的实现。Spring框架的一些核心功能理论&#xff0c;可以用于所有Java应用&#xff0c;Spring还为Java EE构建的Web应用提供大量的扩展支持。Spring框架没有实现任何的编程模型&a…

PHP生成带有雪花背景的验证码

<?session_start();?> <FORM METHOD=POST ACTION=""> <input type=text name=number maxlength=4><img src="YanZhengMa.php?act=init"> <INPUT TYPE="submit" name="sub"> </FORM><?//检…

【分布族谱】正态分布和二项分布的关系

文章目录 正态分布二项分布验证 正态分布 正态分布&#xff0c;最早由棣莫弗在二项分布的渐近公式中得到&#xff0c;而真正奠定其地位的&#xff0c;应是高斯对测量误差的研究&#xff0c;故而又称Gauss分布。测量是人类定量认识自然界的基础&#xff0c;测量误差的普遍性&am…

本地电脑做服务器搭建私人音乐网站ThinkMusic + cpolar内网穿透

文章目录 1. 前言2. 本地网页搭建2.1 环境使用2.2 支持组建选择 3. 网页安装3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDN lisacpolar的文章&#xff1a;ThinkMusic源码搭建音乐网站&#xff0c;并实现公网访问 1. 前言 在我们的日…

数据结构初阶(1)(一些学习数据结构所需掌握的先导知识:包装类、装箱与拆箱、泛型【泛型的编译——擦除机制、泛型的上界、泛型方法、裸类型】、List简介)

目录 包装类 基本数据类型&#xff08;Primitive Types&#xff09;&#xff1a; 包装类&#xff08;Wrapper Classes&#xff09;&#xff1a; 装箱和拆箱 自动装箱和自动拆箱 泛型 泛型的编译——很重要的擦除机制&#xff1a; 泛型的上界&#xff1a; 泛型方法&…

LC-1335. 工作计划的最低难度(区间DP、记忆化搜索==>动态规划)

1335. 工作计划的最低难度 难度困难97 你需要制定一份 d 天的工作计划表。工作之间存在依赖&#xff0c;要想执行第 i 项工作&#xff0c;你必须完成全部 j 项工作&#xff08; 0 < j < i&#xff09;。 你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一…

JavaSE进阶(一)—— 面向对象进阶(static、单例、代码块、继承)

目录 一、static静态关键字 1. static是什么&#xff0c;static修饰成员变量的用法 2. 成员方法的分类 2.1 使用场景 3. static修饰成员方法的内存原理 4. static的注意事项[拓展] 二、static应用知识&#xff1a;工具类 1. 工具类是什么 2. 工具类的好处 3. 为什么工…

域名信息收集

被动信息收集 0x01 Certificate Transparency&#xff08;证书透明&#xff09; 证书透明度(Certificate Transparency)是证书授权机构的一个项目&#xff0c;证书授权机构会将每个SSL/TLS证书发布到公共日志中。一个SSL/TLS证书通常包含域名、子域名和邮件地址。查找某个域名…

Java进阶-字符串的使用

1.API 1.1API概述 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需要…

PPT技能之描边字,要大要醒目别整没用的

文字仅仅加粗&#xff0c;还是不够明显&#xff0c;不妨用上描边字。不会Photoshop&#xff0c;不会PS&#xff0c;也可以做好看的描边字。 描边字&#xff0c;是在文字的边缘加上边框&#xff0c;让文字更醒目、突出。 你的关注&#xff0c;是我最大的动力&#xff01;你的转…

【K8s】基本存储、高级存储(PV和PVC)、配置存储

文章目录 背景一、基本存储1、EmptyDir2、HostPath3、NFS 二、高级存储1、认识PV和PVC2、PV3、PVC4、生命周期 三、配置存储1、ConfigMap2、 Secret 背景 程序运行在容器中&#xff0c;而容器的生命周期可能极其短暂&#xff0c;容器销毁&#xff0c;数据丢失&#xff0c;因此…

pip install出现socket.timeout: The read operation timed out的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…