历史证明:区块链时钟 | Solanas 8 Innovations

分布式系统中最困难的问题之一是时间的一致性。事实上,一些人认为 Bitcoin 的工作量证明算法最本质的功能是充当系统的去中心化时钟[1]。Solana[2] 相信历史证明提供了这个解决方案,并在此基础上构建了一个区块链。

去中心化网络通过可信的集中式定时解决方案解决了这个问题。例如,谷歌 Spanner[3] 在其数据中心之间使用同步原子钟。谷歌工程师对这些时钟执行高精度同步,并持续对它们进行维护。

在区块链这样的对抗性系统中,要解决这个问题会更加困难。网络中的节点不能信任外部时间源或消息中出现的任何时间戳。例如,Hashgraph[4] 使用”中值”时间戳解决了这个问题。网络所看到的每条消息都由网络中的绝大多数节点进行签名和记录时间戳。消息的中值时间戳即 Hashgraph 所称的”公平”排序。每条消息都必须传输到系统中的绝对多数节点,然后在消息收集到足够的签名之后,需要将整个集合传播到整个网络。不难想象,这真的会很慢。

如果只是简单地信赖编码到消息中的时间戳,会出现什么情况?你会发现,突然之间,会有大量的分布式系统优化可以使用。不妨看一下以下引述:

“同步时钟非常有趣,它们可用于提高分布式算法的性能。借助同步时钟,我们可以将通信替换为本地计算。”_Liskov, B. Practical Uses of Synchronized Clocks in Distributed Systems_[5]

对我们而言,这意味着高吞吐量和高性能区块链。

历史证明

如果你可以证明消息发生在某个事件之前或之后的某个时间点,而不是信任时间戳呢?当你拍下某期《纽约时报》封面的照片时,你即创建了一个证明,表明你的照片是在该份报纸出版后拍摄的,或者你掌握了某种能够影响《纽约时报》出版内容的方式。通过历史证明,你可以创建历史记录,证明某个事件已在特定时间点发生过。

历史证明是一个高频率的可验证延迟函数[6]。可验证延迟函数需要特定数量且按顺序的评估步骤,会生成能以公开且有效的方式进行验证的唯一输出。

我们的具体实现使用一个有序的抗预映像哈希,该哈希使用上一个输出作为下一个输入不断运行下去。系统会定期记录计数和当前输出。

对于 SHA256 哈希函数,如果没有使用 2¹²⁸ 个核心执行暴力攻击,此过程无法实现并行化。

然后我们才可以确定每个计数器在生成时的实时性,并且每个计数器记录的顺序与实时的顺序相同。

时间上限

通过将数据的哈希值追加到前面生成的状态,可以将数据插入序列。状态、输入数据和计数都已发布。追加输入会导致所有未来的输出发生不可预测的变化。并行化仍然是不可能的,而且只要哈希函数是抗预映像和冲突的,就不可能创建一个在将来生成所需哈希的输入,或者创建具有相同哈希的替代历史。我们可以证明任意两个追加操作之间的时间间隔。我们可以证明数据是在追加之前创建的。正如我们所知,《纽约时报》上发表的事件发生在报纸编写之前。

时间下限

历史证明的输入可以反过来引用历史证明本身。反向引用可以作为带有用户签名的已签名消息的一部分插入,因此在没有用户私钥的情况下不能对它进行修改。这就像以《纽约时报》为背景拍照一样。因为这个消息包含 0xdeadc0de 哈希,所以我们知道它是在创建了计数 510144806912 之后生成的。

但是,由于这条消息也被插回到历史证明流中,就好像你以《纽约时报》为背景拍摄了一张照片,第二天《纽约时报》就发布了这张照片。这样我们会知道这张照片的内容存在于某一天之前和某一天之后。

验证

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

每个记录的切片的完整验证过程都可以在单独的核心上完成,所需时间为 1/核心数量。因此,一个拥有 4000 个核心的现代 GPU 可以在 0.25 毫秒内验证 1 个切片。

ASICS

每个 CPU 不是都不一样吗?不是有些 CPU 比其他 CPU 快得多吗?你如何相信由 SHA256 循环所生成的”时间”是准确的呢?

这个话题值得另写一篇文章,但是简要而言就是,我们并不太关心一些 CPU 是否比其他 CPU 更快,以及 ASIC 是否可以比网络上可用的 CPU 更快。最重要的一点是 ASIC 的速度提升是有限的。

我们使用的是 SHA256,并且由于 Bitcoin 的出现,人们已经展开了关于提升此加密哈希函数速度的重要研究。增加芯片大小(如使用查询表)或在不影响时钟速度的情况下将其展开,这两种方法无法提高此函数的速度。英特尔和 AMD 都将推出可在 1.75 个周期内完成一整轮 SHA256 的消费级芯片。

正因为如此,我们非常确定自定义 ASIC 的速度不会比原来快 100 倍,更不用说 1000 倍了,而且很可能都不会超过网络可用速度的 30%。我们可以构造出利用这个界限的协议,使攻击者仅可在有限而短暂的机会内发起拒绝服务攻击,并让此类攻击容易被检测到。这在下一篇文章中将进行详细介绍!