Proof of History——属于Solana区块链的时钟

1,271 阅读5分钟

分布式系统中最困难的问题之一是关于时间的协议。事实上,有些人认为,比特币的工作量证明(PoW)算法最基本的功能是作为系统的去中心化时钟发挥作用。在Solana,我们相信历史证明提供了这种解决方案,我们已经在此基础上建立了一个区块链。

去中心化的网络已经用可信的、集中的计时解决方案解决了这个问题。例如,谷歌的Spanner在其数据中心之间使用同步的原子钟。谷歌的工程师将这些时钟同步到一个非常高的精度,并不断维护它们。

在区块链这样的对抗性系统中,这个问题就更难了。网络中的节点不能相信外部的时间来源或出现在消息中的任何时间戳。例如,Hashgraph用"中值"时间戳解决了这个问题。每个被网络看到的消息都由网络中的超级多数人签名并加盖时间戳。消息的中位时间戳就是Hashgraph所谓的"公平"排序。每条消息都必须前往系统中的超级多数节点,然后在消息收集到足够的签名后,整个集合需要传播到整个网络。你可以想象,这真的很慢。

如果你可以简单地相信编码在消息中的时间戳,会怎么样呢?一个巨大的分布式系统优化的财富将突然在你手中。比如说:

"同步时钟很有趣,因为它们可以被用来提高分布式算法的性能。它们使得用本地计算取代通信成为可能"。

—— Liskov, B. 分布式系统中同步时钟的实际应用

在我们的案例中,这意味着一个高吞吐量、高性能的区块链。

Proof of History

如果你不相信时间戳,而是能够证明信息发生在某一事件前后的某个时间段,会怎么样?当你拍摄一张带有《纽约时报》封面的照片时,你就是在创造一个证明,证明你的照片是在该报纸出版后拍摄的,或者你有某种方式影响《纽约时报》的出版内容。通过PoH,你可以创造一个历史记录,证明某个事件在某个特定的时间点发生过。

1_Y4ogVaaFg54dVV4FOukMYA.png

历史证明是一个高频率的可验证的延迟函数。一个可验证的延迟函数需要特定数量的顺序步骤来评估,但产生一个独特的输出,可以有效地公开验证。

我们的具体实现使用了一个连续的抗预图像哈希,它不断地在自己身上运行,前一个输出被用作下一个输入。定期记录计数和当前输出。

对于SHA256哈希函数,这个过程不可能在不使用2¹²⁸核心的暴力攻击下并行化。

这样我们就可以确定,在每个计数器产生的过程中,真实的时间已经过去了,而且记录的每个计数器的顺序与真实的时间是一样的。

时间的上限

1_oNjzzrlMxByxz-PN5rBv5w.png

数据可以通过将数据的哈希值附加到之前生成的状态中而被插入到这个序列中。状态、输入数据和计数都是公布的。追加输入会导致所有未来的输出发生不可预测的变化。这仍然是不可能并行化的,只要哈希函数是预像和抗碰撞的,就不可能创建一个输入,在未来产生一个想要的哈希值,或者创建一个具有相同哈希值的替代历史。我们可以证明,在任何两个追加操作之间都有时间流逝。我们可以证明,数据是在被追加之前的某个时间创建的,就像我们知道《纽约时报》上发表的事件发生在报纸写成之前。

时间的下限

1_9Nu83I_2B3xv-wZbm60ZXA.png

对历史证明的输入可以有对历史证明本身的引用。背面引用可以作为有用户签名的信息的一部分插入,因此没有用户的私钥就不能修改。这就像拍摄一张以纽约时报报纸为背景的照片。因为这条消息包含0xdeadc0de哈希值,我们知道它是在510144806912计数被创建后产生的。

但由于该消息也被插入到历史证明流中,就像你在《纽约时报》的背景下拍了一张照片,而第二天《纽约时报》发表了这张照片。我们知道,那张照片的内容在某一天之前和之后都存在。

验证

虽然记录的序列只能在单个CPU核心上生成,但输出可以被并行验证。

1_3uZfg-qQKBniLIRaKrMFFw.png

每个记录的片断可以在不同的核心上从头到尾进行验证,时间为生成时间的1/(核心数)。因此,一个拥有4000个内核的现代GPU可以在0.25毫秒内验证一秒钟。

ASICS

每个CPU都是不同的,有些CPU比其他CPU快得多,不是吗?你怎么能相信我们的SHA256循环所产生的"时间"是准确的?

这个话题应该有自己的文章,但长话短说,我们并不关心一些CPU是否比其他的快,以及ASIC是否比网络可用的CPU快。最重要的是,ASIC的速度有一个有限的界限。

我们使用的是SHA256,由于比特币的出现,人们对这个加密哈希函数的速度进行了大量研究。这个函数不可能通过使用更大的芯片面积(如查找表)来加速,也不可能在不影响时钟速度的情况下解开它。英特尔和AMD都在发布消费类芯片,可以在1.75个周期内完成一整轮SHA256的运算。

正因为如此,我们有相当大的把握,定制的ASIC不会快100倍,更不用说1000倍了,而且很可能会在网络可用的30%以内。我们可以构建协议,利用这种约束,只允许攻击者有非常有限的、容易被检测到的、短暂的拒绝服务攻击的机会。