比特币的时空模型
现如今大多数人谈到比特币都会赞扬他的去中心化,似乎去中心化是比特币的最大创新?当我们仔细看看原始白皮书,好像并没有提到“去中心化”这几个字眼。 然而比特币的确建立在互联网的基础之上,他应该具备某些去中心化的潜能,比如数据是存储在分布式的节点,节点的所有权归属到个体的私钥持有者。说是潜能,是因为并不是一开始就是如此,只有当这个系统扩展到足够的参与者,控制权足够分散,才能实现某种程度的去中心化。 过于强调去中心化表明很多人看到了比特币在空间上的特征,鲜有人关注比特币是如何处理时间的。 上篇文章中我们介绍了虚拟时间的概念,基于虚拟时间,我们可以设计不同的时间协议来满足不同系统的需求。 而对于一个分布式支付系统来讲,首先要解决的问题就是当两条消息的虚拟时间相同时,如何确定他们的先后次序,比特币给出的答案是让CPU来决定。 通过让CPU针对某条消息不断运算哈希算法,来增加这条消息的权重。这个权重也证明了CPU为这条消息做了多少工作,消耗了多少能量,把它加入到虚拟时间的协议中,每个Object依照虚拟时间和CPU的工作量证明排出一条统一的时间轴。时间越靠前的消息,CPU对它做的工作也越多,也...
比特币的时空模型
现如今大多数人谈到比特币都会赞扬他的去中心化,似乎去中心化是比特币的最大创新?当我们仔细看看原始白皮书,好像并没有提到“去中心化”这几个字眼。 然而比特币的确建立在互联网的基础之上,他应该具备某些去中心化的潜能,比如数据是存储在分布式的节点,节点的所有权归属到个体的私钥持有者。说是潜能,是因为并不是一开始就是如此,只有当这个系统扩展到足够的参与者,控制权足够分散,才能实现某种程度的去中心化。 过于强调去中心化表明很多人看到了比特币在空间上的特征,鲜有人关注比特币是如何处理时间的。 上篇文章中我们介绍了虚拟时间的概念,基于虚拟时间,我们可以设计不同的时间协议来满足不同系统的需求。 而对于一个分布式支付系统来讲,首先要解决的问题就是当两条消息的虚拟时间相同时,如何确定他们的先后次序,比特币给出的答案是让CPU来决定。 通过让CPU针对某条消息不断运算哈希算法,来增加这条消息的权重。这个权重也证明了CPU为这条消息做了多少工作,消耗了多少能量,把它加入到虚拟时间的协议中,每个Object依照虚拟时间和CPU的工作量证明排出一条统一的时间轴。时间越靠前的消息,CPU对它做的工作也越多,也...
去中心化的时间系统
上篇文章中我们谈到,OOP当中的Object是一个个迷你计算机,他们之间通过消息传递相互影响。所以一个纯正的OOP系统应该是分布式去中心化的,就像整个互联网系统。 按照这个理念来设计系统,首先会碰到的问题就是如何处理时间。长久以来我们习惯于让CPU来决定时间,在处理并发执行的Object访问统一资源时,通过加锁来限制状态的错乱。这种方式容易让系统发生阻塞,而且每次状态更新都要考虑锁的问题,增加了编程的心智负担。 如果我们让时间变得去中心化,每个Object可以维护一套本地的虚拟时钟,记录这个Object内部事件发生的先后顺序。每个Object如同平行宇宙延续着自己的时间,彼此互不干扰,直到他们通过消息传递进行通讯,时间开始交错。 那么从全局系统角度来看,如何得出当前的时间进展呢?这里我们可以观察到两条基本定律: 1. 在每个Object内部如果事件A发生在事件B之前,那么“A的时间”必定小于“B的时间” 2. 在每次消息传递的过程中,消息的“发送时间”必定小于“接收时间”。 以下图为例,我们把Object A的内部事件的虚拟时间称为Ta1,Ta2 …,消息m2的发送时间为Tm2s...
去中心化的时间系统
上篇文章中我们谈到,OOP当中的Object是一个个迷你计算机,他们之间通过消息传递相互影响。所以一个纯正的OOP系统应该是分布式去中心化的,就像整个互联网系统。 按照这个理念来设计系统,首先会碰到的问题就是如何处理时间。长久以来我们习惯于让CPU来决定时间,在处理并发执行的Object访问统一资源时,通过加锁来限制状态的错乱。这种方式容易让系统发生阻塞,而且每次状态更新都要考虑锁的问题,增加了编程的心智负担。 如果我们让时间变得去中心化,每个Object可以维护一套本地的虚拟时钟,记录这个Object内部事件发生的先后顺序。每个Object如同平行宇宙延续着自己的时间,彼此互不干扰,直到他们通过消息传递进行通讯,时间开始交错。 那么从全局系统角度来看,如何得出当前的时间进展呢?这里我们可以观察到两条基本定律: 1. 在每个Object内部如果事件A发生在事件B之前,那么“A的时间”必定小于“B的时间” 2. 在每次消息传递的过程中,消息的“发送时间”必定小于“接收时间”。 以下图为例,我们把Object A的内部事件的虚拟时间称为Ta1,Ta2 …,消息m2的发送时间为Tm2s...
OOP的本质是什么
学过编程的人大概没人没听过OOP (面向对象编程) 的概念,如果你是程序员或计算机系的学生,也许你每天都在用C++或者Java提供的OOP范式写代码。然而有趣的是,当初提出OOP概念的 Alan Kay,并不认为这些主流编程语言是OOP。 在Alan Kay看来,OOP的核心不是继承,封装和多态,而是“消息传递”。 要理解这一点首先我们需要搞清楚,Object究竟指代的是什么。在原始的定义里,Object其实是一个迷你计算机,这里的计算机不是物理层面上的计算机,而是剥去具体实现细节的逻辑计算机。 我们知道计算机的基本组成部分包括CPU,内存和IO,分别对应着时间,空间和信号。通过信号在时空中的转译,你可以模拟宇宙间的万事万物,包括模拟计算机自己。这也是阿兰图灵当初的想法。 如果以计算机为最小单元来构建一个系统和编程模式,我们关注的重点就是计算机之间如何传递消息,以及消息如何通过计算机进行转译。 这样一个系统能够很方便地创造出成千上万个细微粒度的计算机,每一个计算机都有一个唯一标识,他们之间可以方便地进行消息传递。由于只需遵从逻辑上的意义,计算机的内存可以通过虚拟内存进行管理,增加...
OOP的本质是什么
学过编程的人大概没人没听过OOP (面向对象编程) 的概念,如果你是程序员或计算机系的学生,也许你每天都在用C++或者Java提供的OOP范式写代码。然而有趣的是,当初提出OOP概念的 Alan Kay,并不认为这些主流编程语言是OOP。 在Alan Kay看来,OOP的核心不是继承,封装和多态,而是“消息传递”。 要理解这一点首先我们需要搞清楚,Object究竟指代的是什么。在原始的定义里,Object其实是一个迷你计算机,这里的计算机不是物理层面上的计算机,而是剥去具体实现细节的逻辑计算机。 我们知道计算机的基本组成部分包括CPU,内存和IO,分别对应着时间,空间和信号。通过信号在时空中的转译,你可以模拟宇宙间的万事万物,包括模拟计算机自己。这也是阿兰图灵当初的想法。 如果以计算机为最小单元来构建一个系统和编程模式,我们关注的重点就是计算机之间如何传递消息,以及消息如何通过计算机进行转译。 这样一个系统能够很方便地创造出成千上万个细微粒度的计算机,每一个计算机都有一个唯一标识,他们之间可以方便地进行消息传递。由于只需遵从逻辑上的意义,计算机的内存可以通过虚拟内存进行管理,增加...