作者:小毛哥 Mao / 来源:链闻
时间对于分布式账本技术的意义不言而喻,任何账本都需要达到「有序」,而在时间和状态分离的时钟体系中,时间和状态并非耦合绑定,链上交易的时间戳将会被编码,交易像水一样在网络间流动。
Solana 将基于哈希的时间链与状态更新进行分离,首先为其智能合约平台提供一个免许可、全局可用、信任最小化时钟体系,并在达成共识前优化网络运行,Solana 把这个核心创新称之为「历史证明机制」(Proof of History, POH)。
撰文:小毛哥 Mao
特别感谢 RockX 联合创始人董心书博士的审读及建议
「今天是 2019 年 8 月 16 日,起迟了,今天又是平淡的一天。」
几年几月几日、早与迟、今天和明天,都是我们对时间的概念,时间可以来源于 iPhone 手机、玩具手表、最精确的原子钟等任何可信赖的第三方,重要的是,我们所说的「时间」好像是一个人类社会赋予的概念。爱因斯坦的广义相对论尝试从更科学的角度探索时间的真正定义,当然,人们还是以自己感觉最直观的定义理解着自己的时间。
反直觉的是,在完全开放的分布式系统中,因为失去了可以完全信赖的第三方,我们很难依赖几年几月、早与迟这些习以为常的时间概念来确定事件的顺序。在分布式系统中,我们所需要的「时间」不是我们习惯的时间粒度,而是需要的是一种机制,通过该机制我们可以验证一个事件发生在另一个事件之前、之后或者同时发生。
为什么时间是区块链的根本问题?
时间戳的概念
试想一种情况:你在某日举着《纽约时报》阅读,被记者拍下一张照片,过了几天之后,你发现你的这张照片被刊登在了新一期《纽约时报》。
假设《纽约时报》信息是正确无误的情况下,因为这个巧合,即使多年之后,虽然你忘记了被拍下照片的日期,但通过这份情报,你也可以准确地判定照片拍摄的日期:在 2014 年 10 月 12 日至 2014 年 10 月 14 日之间。
这个巧合实际构造出一种时间机制,我们建立了两个可信的时间点,而案例中《纽约时报》提供的信息就是这个机制里的时间戳。
正如上文我们所提到的,要确定事件的前后关系问题,需要的不是可信的物理时钟,而是去建立拥有可信时间点的时间机制。根据爱因斯坦的相对论中观点,全宇宙中位于不同空间的时间不是一致同步的。比特币通过创建自己的时间概念来解决这个问题,证明实现分布式账本技术是可行的。
分布式系统中的基本问题:时钟问题
根据一份比特币最初的源代码,中本聪最初将比特币的数据结构,即大家熟悉的「区块链」(Blockchain)表述为「时间链」(Timechain)。
时间对于分布式账本技术的意义不言而喻,任何账本都需要达到「有序」,人们不能花没有收到的钱,也不能花已经花了的钱。区块链技术本身必须在无需第三方的情况下,明确地对账本进行排序。虽然区块链中还有许多其他技术细节,但时间是至关重要的,没有时间与顺序,就没有区块链。
美国计算机科学家 Leslie Lamport 在 1978 年发布的论文 《Time, Clocks, and the Ordering of Events in a Distributed System》首次将分布式系统中的时序与相对论中的时间概念进行对比,并提出一种可用于「同步逻辑时钟的系统,以对事件进行全局排序」的分布式算法。他在 1982 年发表一篇关于可容错的计算机系统的经典论文《The Byzantine Generals Problem》,也就是著名的拜占庭将军问题的来源。
拜占庭将军问题是分布式系统发展中的殿堂级问题,而对于该类问题解决方案,背后的概念基本上是将可能引发不一致的并行操作进行串行化的排序。2008 年 11 月 13 日,中本聪在一份解释比特币的早期邮件开头写道,工作量证明机制是拜占庭将军问题的解决方案之一。
如何确定事件的时间和顺序,是分布式系统的基本问题。引入全局时钟是实现拜占庭将军问题中线性一致性(Linearizability Consistency)的方法之一。全局时钟可以让让许多互不信任的节点有全局同步的时间来源,再加上时间戳,就可能实现全局一致的有序交易。为了分布式系统达到强弱不等的一致性结果,许多建立在此思路上的区块链共识作为解决方案应运而生。
全局一致的时钟 + 时间戳 = 有序的交易
理解时间和状态 —— 解构区块链时钟
PoW 时钟体系:工作量证明机制 + 时间链 / 区块链
为了理解这个晦涩的密码学问题,我们不妨将比特币的 PoW 工作量证明机制想象成一个时钟,反复计算出符合条件的哈希值(即挖矿)相当于参与一个人人都可以参与并且会走到满足结果那一刻的时钟体系:
时间价值
时间对于工作量证明机制的意义在于通过持续消耗的动能来保护网络的安全。我们可以使用「存量和流量」(stock & flow)描述基于时间的能量及价值累计现象,使用以下三个公式简要概括 PoW 时钟体系的时间价值:
时间流量 / 存量 = 已经消耗 / 将要消耗的动能
时间存量价值(过去) = 挖矿已经消耗的动能(总账本) + 挖矿硬件的库存价值
时间流量价值(未来)= 挖矿将消耗的动能(预期账本) + 挖矿硬件的潜在盈利
状态更新
状态更新实际上是由出块决定,每个新出的区块反映出一个新的状态。这一时间链结构被设计为平均每隔十分钟出块一次, 即 PoW 时钟大约每 10 分钟指针滴答转动一次。同时,每一次指针转动都意味着该时钟完成一个不可回溯、无记忆性的全局状态更新。
指针转动,滴答一次 = 有序出块,状态更新
滴答时间 = 出块时间 (平均约 10 分钟)
转速调整 = 挖矿难度调整
最终状态更新 = 最长链原则
时间与状态:紧耦合
在工作量证明机制中,一个区块产生之后,整条链会锁定,此时没有任何状态更新,直到产生或接收到下一个有效的新区块。每个新的区块都包含前一个区块的哈希,作为在该区块有效的证据。总之,在 PoW 时间体系中,时间和状态是耦合在一起的,总是相互绑定、一致行进。没有状态更新,时间就无法推进。
PoW 时钟体系特点
PoW 时钟体系是对解决分布式系统中时间和状态问题的开创性的解决方案,PoW 体系是一个安全、成熟、无许可的、全球共享的网络设施,值得注意的是,PoW 时钟体系成本透明公开,但时钟性能、可拓展性不足,仍有改进空间。
PoS 时钟体系:权益证明机制 + 时间链 / 区块链
PoS 时钟体系将共识机制跟加密经济激励结合,有时通过限制验证人数以提高系统性能。本文以目前成果最佳的高性能、无须许可的 BFT 共识算法 Tendermint + BPoS (Bonded Proof of Stake) 为例来理解该时钟体系。
时间价值
时间对于权益证明机制的意义是围绕着 PoS 机制的核心行为 staking (质押)产生的, 我们可以将理解 PoW 时间价值体系的方式引申至该 PoS 时钟体系。
时间的流量 / 存量 = 已经质押 / 即将质押的资金成本
时间存量价值(过去) = 已参与质押资金的机会成本 + 质押累计收益
时间流量价值(未来)= 长期持币者的预期质押量 + 预期质押收益
状态更新
PoS 时钟体系状态与 PoW 时钟体系相似,
指针转动,滴答一次 = 有序出块,状态更新
滴答时间 = 出块时间 (Tendermint 约 6 秒)
时间与状态:松耦合
在权益证明机制中,时间和状态依然是耦合绑定的。因此,该分布式系统性能的改良思路依然是在时间和状态之间做取舍,要么增加区块大小,要么减少区块时间,以增加时钟的性能,即系统的吞吐量(TPS),用公式来表示:
吞吐量 (TPS])= 区块大小(每区块的 txs)/ 区块时间 (区块间隔时间)
如果 Tendermint 网络达到 5 秒的出块时间,5MB 的区块大小,理论上可以达到 4000 TPS 的吞吐量。
PoS 时钟体系特点
PoS 时钟体系在解构分布式系统时间和状态的尝试中迈出了重要的一步,在系统的吞吐量上获得了巨大的提升,但同时也付出了巨大的成本,比如围绕 staking 的质押时间的长短含有影响 PoS 体系安全性的不确定因素。
分片时钟体系:状态分片架构 + 时间链 / 区块链
分片架构体系,虽然不同项目的解决方案存在差异,但基本架构基本包括信标链(Beacon Chain),为网络的其余部分提供时间源。该时钟体系的改进性能思路很简单,就是在时钟体系下增加更多小的时钟体系。
时间价值
分片时钟体系扩展了单一区块链的时间存量及流量,从而量化扩展了时间价值
状态更新
信标链可以提供分片架构的全局时钟,但每个分片仅是周期性地将其各自的独立时钟体系与信标链的时钟体系同步,分片交互时需要状态的周期性更新,更新所需的时间可能会带来延迟。
时间与状态:将耦合的时间和状态同时分割
状态分片架构将整个时钟体系分割为一堆单独的时钟体系,将全局状态分割为一堆较小的单独分片,每个分片有自己的独立时钟体系,相互独立但共同推进。
分片时钟体系的特点
在理想状态下,若分片之间跨分片交互最小,每个分片的性能维持不变,所有分片的累计吞吐量将会随着分片数量的增加而线性增加。分片概念的设想显著提升了系统性能,但可以预见是,由于每个单独分片的时间和状态依然是耦合的,同时还存在着分片安全、跨分片交易、网络通信等技术问题,分片时钟体系的现实情况依然会受到基础区块链,包括信标链及主链自身扩展性的限制。
跳脱时钟框架体系:分离时间和状态
让我们回顾一下以上讨论的时钟体系,PoW 时钟体系开创性地为比特币创建了信任最小化的时钟;PoS 时钟体系中我们以 Tendermint + BPoS 共识为例,说明了如何减少验证者人以改善时钟体系性能;分片时钟将整体的时钟体系分割为一堆单独的时钟体系,显著地提高了吞吐量。
值得注意的是,所有这些时钟体系依然是建立在时间和状态耦合的框架内,也必然会受到限制。看起来每一个时钟体系都有独到之处,但都不完美。让我们继续思考继续优化区块链时钟体系的方法:
- 时间一定要和状态绑定吗?
- 如果我们能「证明历史」且「编码时间」,可以分离时间和状态吗?
- 如果技术上能做到分离时间和状态,这个时钟体系会是什么样?
首先,该时钟体系依然需要一个全局可用、无需许可的时间来源,只有在全局可用的时钟体系下,状态更新可以持续且异步进行。其次,要改善节点之间的通信,需要快速、精准并保持信任最小化。在时间和状态分离的时钟体系中,时间和状态并非耦合绑定,链上交易的时间戳将会被编码,交易像水一样在网络间流动。
基于该思路,Solana 将基于哈希的时间链与状态更新进行分离,首先为其智能合约平台提供一个免许可、全局可用、信任最小化时钟体系,并在达成共识前优化网络运行。
Solana 把这个核心创新称之为「历史证明机制」(Proof of History, POH),PoH 历史证明机制是在达到成共识前在网络运行的优化解决方案,提供了一种全新的时钟概念。POH 在达成共识之前充当一种特殊的时钟,使得优化数据传播到内存池管理等的各种独特的时序假设在上层设计上产生。
这一核心创新打开了全面提升的设计空间。除了提供「编码时间」的时间戳的时钟之外,PoH 还使得 Solana 能够优化网络上可用的区块时间(800 ms)、区块传播(log200(n))、吞吐量(50K-80KTPS)和分类帐存储(petabytes)。
PoH 时钟体系:分离时间和状态的时间来源 + 时间链 / 区块链
时间价值:
PoH 历史证明机制中提供了一种全新的时间概念,同为时钟体系提供了一个特殊时间来源,起到了时钟体系「计时」和「定序」的作用,使得系统时间不再受限于状态。
状态更新:
PoH 历史证明时钟体系将时间和状态分离,状态更新不限于每次时针转动。也就是说,该时钟体系分离了时钟转动一次(时间)和滴答一次(状态更新)。
时针转动 ∈ 状态更新
滴答时间 = 区块时间 ( Solana 测试网为 800 微秒)
时间与状态:解耦 / 分离
时间维度:基于可验证延迟函数 (VDF) 编码时间戳
可验证延迟函数 (VDF) 是一类数学函数,能够使得该函数的计算需要至少一段已知的时间。其他区块链要求验证人相互通信、同步信息以确认时间已经过去,可以进行下一步行动,而每个 Solana 验证人可以通过将标准时间戳编码为一个 SHA-256 序列哈希的可验证延迟函数 (VDF) 进入区块链中。Solana 使用 VDF 并不是为了随机性,而是为了维护该时钟体系的方法之一。
Solana 如何将标准时间戳编码至区块链中
状态维度:先选择领导者(Leader),后进行完整的纪元(epoch)
因为每个验证人都需要维护自己的时钟,所以选择领导者 (leader)在先,进行一个完整的纪元(epoch)在后。如同 Tendermint 机制,一个纪元的时间表可以持续数千个区块。然而,与 Tendermint 不同的是,Solana 网络从不等待验证失败的节点。每个验证人运行 VDF 以证明它已经获得了传输区块和验证人的区块时段 (Slot),同时可获得奖励。
PoH 时钟体系的特点
1. 缩短节点通信间隔时间
其他区块链要求验证人相互通信、同步信息以确认时间已过去、状态可更新,而 Solana 的节点在持续不断接收最新交易时,每个交易都有发送者附加的已签名 PoH 时间戳哈希,并将其转发给其他节点,节点可以立即通过 PoH 时间戳哈希对直接对交易进行排序,而缩短了等待对应节点确认的通信时间。
2. 无需等待领导者(Leader)的轮换
在 POH 历史证明机制下,领导者(Leader)的轮换不会影响网络状况。网络可以在没有任何验证人相互通信的情况下决定领导(Leader)的轮换,网络会作为一个整体,持续不断地处理交易,领导者的轮换决策是异步调用的。
3. 新节点只需要数据结构便可验证区块链完整性
PoS 机制受到常见的批评之一在于其不是完全客观的,而是弱主观的。但由于 POH 对 Solana 的改进,Solana 变得客观。因为随着时间的推移,时间也被编码到区块本身中。同时由于验证人通过并行验证 POH 的速度可以比 POH 的初始速度快 1000 倍,所以一个新的节点可以在没有外在信息的情况下,只需要账本的数据结构即可验证区块链从创世到当前的完整性。
如何基于历史共识继续优化 PoH 时钟体系?
Tower BFT:充分利用 PoH 时钟体系时间来源,优化 PBFT 共识
PBFT 实用拜占庭容错的瓶颈
说明什么是 Tower BFT 之前,我们首先来说明一下实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT),PBFT 诞生于比特币出世之前,至今已逾二十年,源于解决分布式系统的著名共识问题:拜占庭将军问题。
一群拜占庭将军围攻一座城市,他们必须达成同时进攻或同时撤退的共识,且各将军只能透过信使将自己的决定通知其他人。然而,这群将军中有叛徒,发出相反的讯息,或者只通知一部分的将军。在已知有叛徒存在的情况下,该如何达成正确可用的共识?
在分布式系统中,我们可以将:
- 将军 看作 节点
- 信使 看作 节点间的通讯
- 进攻 / 撤退的决策 看作 需达到的共识
- 将军的随机行为 称为 拜占庭错误(Byzantine Fault)
- 在叛徒节点存在的情形下仍能达成共识的特性 称为 拜占庭容错(Byzantine Fault Tolerance)
从结果来说,一个正确可用的共识必须确保拜占庭将军(即节点)一定会达成唯一的共识(即一致性),且共识终究会形成(活跃性)。
PBFT 实用拜占庭容错是一个基于选出领导者、基于通讯、倾向于一致性的共识解决方案,由于 PBFT 含有验证者需要把其投票广播给其他验证人的通讯机制,大大增加了通信复杂度和通讯量,导致难以扩展的瓶颈。
基于 PoH 历史证明的改良版共识算法
在 PoH 历史证明的基础上,Solana 改良运行 Tower BFT,这是一种类似 PBFT 的共识算法。Tower BFT 在达成共识之前利用 Solana 的 PoH 时钟已经同步的时间来源,减少了通讯复杂度和通讯延迟。
与 PBFT 不同的是,Tower Consensus 倾向于活跃性而非一致性。与 PBFT 相同的是,节点会成倍增加超时时间(Time-outs)以达成协议,但由于该时钟体系的账本结构本身也是一个免信任的时间源,节点可以观察和检查网络中所有其他验证人的超时时间。我们可以通过一个例子让方便大家更好地理解这一点:
想象你置身在一个孤岛上,一个瓶子漂了过来,里头装着一个 U 盘。在 U 盘里存着一个 Solana 账本。如果你只查看账本本身,你将看到每个节点都可以计算当前验证人的数量、每个验证人的状态 —— 以及最为重要的一点,每个验证人向网络中的任何区块提交的超时时间。仅仅是根据数据结构,不需要任何点对点的对等信息,验证人就可以做出投票决定,网络可以达成共识。
验证人和复制器(Replicators):双节点分工生成轻量级证明,优化数据储存
目前区块链网络以 1 GB 每秒的速度,每年将为账本生成 4 PB 的数据。按照这样的速度,区块链数据的存储将很快成为主要的中心化向量,这与区块链实现的去中心化愿景背道而驰。
Solana 利用两种类型的节点分工生成轻量级证明,使其有 PoS 网络更有效地运行。
- 验证人节点:负责验证网络数据,但 PoH 历史证明和 Tower PBFT 帮助其提高验证速度。
- 复制器节点:从验证人节点中获取计算权重,以极小的硬件要求进行操作。
复制器节点(Replicators)对硬件的要求不高,我们日常所有的笔记本电脑就可以执行。但是复制器节点在网络中的作用却很重要,能够优化分布式数据存储系统,旨在解决处理数兆字节级 (pb) 数据的数据可用性问题。
Solana 的复制器节点不需要参与共识并存储整个数据历史,而是利用多个复制器节点分别储存数据历史的小片段,以生成轻量级证明并执行纠删码功能,从而将整个状态历史被分割成许多部分。每隔一段时间,网络就会要求复制器证明它们正在存储其应该存储的数据。
Solana 使用的复制证明 (PoRep)理念主要借鉴自 Filecoin,并利用 PoH 共识提供的时序来源优化复制证明(PoRep)的创建方式。复制器节点将在不参与共识的情况下,使用 PoH 历史证明生成轻量级的证明,这种证明可以复制账本的各个部分,而且允许验证人能够跨 GPU 批量验证。
结语
理解「编码时间」的意义,重塑区块链 Layer 1 可拓展性
Solana 通过将时间与状态分离,证明在一个信任最小化、无须许可世界计算机是可能会被实现的。本文我们探讨了三个 Solana 的创新点:
- 历史证明 (Proof of History, PoH):Solana 其他独特的架构都是建立在 PoH 的基础上,PoH 提供共识之前的时间源,起到了计时和定序的作用,是解决时钟问题和重塑区块链可拓展性的一个深刻而巧妙的解决方案。
- Tower BFT:充分利用 PoH 时钟体系的时间来源,优化 PBFT 共识。
- 复制器 (Replicators):使用 PoH 历史证明生成轻量级证明,优化分布式数据储存。
从「时间维度」理解分布式系统的性能至关重要,时间就是一切,通过 PoH 历史证明「编码时间」的全新思维,无许可的分布式系统甚至可以媲美经过验证的中心化的云计算提供的性能。
当前 Solana 在 5 个大洲的 200 个验证者构成的测试网络上,吞吐量超过 50000 TPS,平均 TTF 为 1.5 秒。这基本上可以媲美目前最好的全球分布式的数据库 Spanner,但 Solana 更有实质意义的去中心化。
同时,逻辑简单、信任最小化的可拓展 Layer 1 底层网络实际上在逻辑上抽象了复杂性,使得往后的开发人员能将精力集中在应用程序逻辑上。将期待留给 Layer 2 的可拓展解决方案和优化应用场景,实际上增加了用户、开发人员和服务商的复杂性和摩擦。
Vitalik 于 2014 年 1 月在向世人揭开以太坊的面纱时,他所强调的正是这一点:世界计算机的意义在于抽象所有不特定于应用程序的东西。随着时间的推移,在 2019 年 8 月 21 日,Vitalik 又在推特上发文称,对于 layer 2 链下扩容方案感到悲观,因为对于激励要做很多应用层处理,并且很难大规模应用。
对于绝大多数用例,构建在 Solana 区块链之上的开发人员根本不需要考虑可拓展性,因为 Solana layer 1 的意义就在于抽象复杂性,在此基础优化上层 layer 2 的设计,笔者会再下一篇文章详细论述这层逻辑。