# 去中心化的时间系统

By [terencege.eth](https://paragraph.com/@terencege) · 2022-06-07

---

[上篇文章](https://mirror.xyz/terencege.eth/9hUG_dpUB6ZWMnLUkLE3h0XJQeG3UVlNHulymER16Fc)中我们谈到，OOP当中的Object是一个个迷你计算机，他们之间通过消息传递相互影响。所以一个纯正的OOP系统应该是分布式去中心化的，就像整个互联网系统。

按照这个理念来设计系统，首先会碰到的问题就是如何处理时间。长久以来我们习惯于让CPU来决定时间，在处理并发执行的Object访问统一资源时，通过加锁来限制状态的错乱。这种方式容易让系统发生阻塞，而且每次状态更新都要考虑锁的问题，增加了编程的心智负担。

如果我们让时间变得去中心化，每个Object可以维护一套本地的虚拟时钟，记录这个Object内部事件发生的先后顺序。每个Object如同平行宇宙延续着自己的时间，彼此互不干扰，直到他们通过消息传递进行通讯，时间开始交错。

那么从全局系统角度来看，如何得出当前的时间进展呢？这里我们可以观察到两条基本定律：

1\. 在每个Object内部如果事件A发生在事件B之前，那么“A的时间”必定小于“B的时间”

2\. 在每次消息传递的过程中，消息的“发送时间”必定小于“接收时间”。

以下图为例，我们把Object A的内部事件的虚拟时间称为Ta1，Ta2 …，消息m2的发送时间为Tm2s，接受时间为Tm2r，其他Object类似。根据以上两条定律，Ta1在Ta2之前，Tm2s在Ta2之前，所以后者相比于前者需要加1，而对于消息m2接收时间Tm2r，需要取Tm2s和Tb2之间最大的一个，然后加1。

![](https://storage.googleapis.com/papyrus_images/1cd55c6efb22cfb4a89328329862a668d5e04f8a8ff4146ca32dfe51032e3d22.png)

由此可以看出对于全局系统来讲，事件发生的先后顺序是什么。如果两个Object中的事件的逻辑时间相同，我们可以认为彼此并行执行，因为没有相互依赖关系。

利用虚拟时间，我们可以设计出很多Object的运行机制。我们可以把每次的状态变更都打上时间的标签，每次数据的读取和写入都对应着某个时间。我们可以规定消息的接收时间，如果小于当前时间，可以退回到特定的版本，重新执行那个时刻之后的消息队列。

正如虚拟内存帮助我们自动管理物理内存，虚拟时间可以帮助我们自动管理消息队列的执行顺序。由于不依赖一个中心化的CPU，这套机制可以方便地扩展到多台机器中。

---

*Originally published on [terencege.eth](https://paragraph.com/@terencege/tMwI6h005GVAlu9Vyrzs)*
