工作量证明即分布式时钟
目录
摘要
本文试图从分布式系统(分布式时钟)的角度理解区块链(比特币,下同)的一致性;实 际上区块链之所以安全可信,工作量证明是主要原因,数字签名和哈希校验是辅助性因素。
比特币系统的交易并非立即可信,通常支付发起后需要等一个小时交易才算正式生效,大 宗交易甚至要等 二十四个小时;等待时间的背后,正是比特币基于工作量证明的 渐进 式 信任机制。
比特币系统是一个去中心化的分布式系统,其网路内所有的节点身份均等;因此渐进式的 信任机制的本质是 工作量证明所构建分布式时钟。
本文从“双花”问题展开,通过不断提问的方式逐步接近本文的主题。
问题由来
“双花”问题是区块链系统上的主要安全问题之一;在去中心化的 P2P 网络上,由于数据 的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况。现实世界 中纸币天然的屏蔽了这个问题,即便是网上交易,在大银行主导的中心化的支付网络上, 个人用户复制数据进行“双花”基本上不可能,因此也鲜有“双花”的问题。
一个典型的区块链上双花问题场景如下:
Bob 拥有一幅价值 $250000 的名家画作,她希望通过 Bitcoin 系统卖出这幅画作。
Alice 对这幅画作很感兴趣,Alice 通过区块链系统,向 Bob 支付了价值 $250000 的比 特币。
Bob 等了一段时间,看到区块链上已经有若干个确认(即当前交易所在区块之后新增了 区块)后,将画作发送给 Bob
假设 Alice 拥有整个区块链网络中 51% 的算力,Alice 可以重新挖矿,对这笔交易和这笔 交易所在的块进行共识攻击;由于 Alice 拥有 51% 的算力,因此很快共识攻击所在的区 块链分叉上的区块数很快就超过正常交易的分叉
最终 Alice 在没有想 Bob 支付任何比特币的情况下,得到价值高昂的画作。
关于“双花”问题,有非常多的解释,然而几乎所有的解释都是基于区块链分叉进行的, 那么问什么双花就一定会引起取款连分叉呢?或者说共识攻击几乎都要通过区块链分叉 进行呢?
顺序
在区块链系统中所有的交易都需要提供输入交易,也就是发生在当前交易之前的比特币来 源交易,如果只有一条链路,那么当矿工验证交易合理性的时候就能很容易的发现双花的 问题;因此真正有威胁的双花问题都是利用了分布式网络中暂时存在的不一致性,如下图 所示:
假设在比特币网络中,一个矿工看到的是上面的分支,另一矿工看到的是下面的分支,由 于比特币的来源交易是合法的,那么这两个矿工看到的交易都是合法的,假设这两个矿工 分别找到了答案,获得将这两笔交易写入区块链的权利,那么在写入的时候实际上形成了 区块链分支,区块链的其他参与者在收到广播的时候无从判断到底那一笔是双花,只有等 待一段时间后,选择相信更长的分支。
因为有潜在“双花”问题的风险,因此交易双方需要等待确认,通常等一个小时,当前交易 区块后面有六个区块后,双方才会认为交易可信,选择一个小时并不意味着绝对可信,而 是在攻击难度和交易效率之间的折中。双花问题之所以很有威胁,就在于两笔交易的顺序 不定,同一个比特币来源交易之后到底支撑哪一笔后续交易,存在变数;不同的区块链节 点对短时间内无法达到共识。
实际上,在比特币系统中,交易的顺序确定是共识的核心。人们无法花费尚未产生的比特 币,输入验证就是要保证比特币的产生先于比特币的花费;而当有了分歧(分支)之后选 择相信更长的分支,实际上确定一笔合法的比特币来源交易和消费交易顺序的过程。一旦 确定了交易的顺序,比特币系统中的所有的交易就形成了一个线性的链条,所有交易之前 的顺序确定且不可修改。
现实生活中,人类用时间来确定事物发生的顺序,这个时间通常通过原子钟之类的工具测 定出来,形成大家所熟知的年月日,但年月日本身并不重要,重要的是我们可以通过年月 日所构成的时间戳来确定事件的顺序。那么在比特币系统中, 交易顺序是如果确定的呢?
区块链是分布式系统
区块链是一个去中心化的分布式系统,交易产生于不同的节点,并没有可信的第三方能够 保证交易的顺序;也许有人会说在节点生成交易的时候附带着时间戳,这样交易就会有序; 然而一个显而易见的问题是这个时间戳可信么?
实际上分布式系统中没有绝对的全局时钟,各个物理设备上的本地时钟也不是准确的,因 此单纯的时间戳不可能使得区块链上的交易有序。这个问题的详细描述来自于 Lamport 的论文 Time, Clocks, and the Ordering of Events in a Distributed System。
时间是人类的“概念”,其具体形式可以是诸如原子钟之类,本质上它们都属于可信的第三 方,比如北京时间。人们使用时间,相信时间,并非对年月日等数字有有兴趣,而是用来 确定日常生活这种事务的顺序。
基于上面的论述,Bitcoin 系统中没有可信的第三方,没法使用基于可信第三方的时间戳, 既然时间戳不可信,那么区块链系统就必须要通过别的方式解决这个问题。理解了区块链 如何通过非时间戳的方式确定顺序,就理解了区块链的核心概念。
工作量证明即分布式时钟,时钟的基本单位十分钟
区块链确定链上交易顺序的秘密,就隐藏在工作量证明的机制中。工作量证明的说到底就 暴力猜测给定哈希值的输入,具体细节,可以参考这篇文章。工作量证明的重要 重要属 性如下:
- 无记忆性 - 人类是一种善于学习的动物,当人类面对复杂问题的时候,最自然的做法 就是通过不断地增加尝试次数渐进式学习,第二次比第一次好,第三次比第二次有改 进;然而无记忆性强调的是每次尝试都是独立的,相互之间没有因果关系。一个简单 的例子是即便前十次抛硬币的结果都是背面,也不能让人完全确信下一次一定是背面。 工作量证明也是一样的,不论之前做了多久的哈希猜测,下一次发现答案的概率是一 样的。
- 无记忆性 是 无进展性 的基础,在计算哈希值得过程中,每一次尝试都是独立的, 多尝试一次并没有让矿工更加接近答案,换言之多多猜测一次并没有让找到答案的过 程更进一步。 找到答案取决于且仅取决于矿工猜测哈希的速率。
由于找到答案取决于且取决于矿工的猜测速率也就是运算能力,因此随着矿工运算能力的 增加,比特币系统每个一段时间就会调整猜测的难度,保证猜出下一个答案基本上在十分 钟左右。
比特币系统中,区块链上的区块每十分钟增加一个;通过相信更长的分支,所有交易之间 的顺序被唯一确定; 从确定事物发生的顺序这个角度上讲 , 工作量证明就是比特 币系统中的分布式时钟,按照现实世界时间每隔十分钟拨动一次。在两次拨动之间什么 都不会发生,换言之区块链上基本时间单位相当于现实中的十分钟。
每个矿工都是时间的创造者
在区块链上,矿工们各自计算答案,并没有一个中心化的机构批准谁有资格进行计算;矿 工们在各自计算的时候并不互相交流,仅需要在找到答案后公布出来。尽管下一个区块所 需要矿工们提供的答案可以有很多个,但大家最终认同的答案是惟一的,因此可以认为矿 工们工作在同一个问题上,尽管没有沟通。
因此每一个矿工都是区块链上时钟的创造者;由于工作量证明的无进展性,因此可以认为 每一次哈希值猜测都是为时钟的创造做贡献,即使立即离开。
在区块链上每一个矿工的每一次哈希猜测都在为区块链上的时钟创造做贡献,随着矿工的 不断地加入和离开,区块链上的时钟不断地向前拨动; 大家共同创造分布式时钟 , 大家也共同信任基于此分布式时钟确定的交易顺序 。
统一的时钟和顺序
本质上,哈希值的猜测是无进展性,并且哈希函数可以接受任意字符串;因此工作量证明 即便是不以区块的哈希头作为输入一样能够工作。
然而如果输入不是区块的头,尽管我们可以通过工作量证明得到一个分布式时钟,但是我 们没有办法将这个时钟和区块链上的顺序结合在一起,尽管时钟在拨动,但交易的顺序并 没有在时钟拨动的过程中得到确认。而通过将区块的头作为输入值,分布式时钟拨动就意 味着交易顺序被确定,且顺序确定除了分布式时钟的拨动没有其他的方式。 也就是说 工作量证明不仅仅意味着分布式时钟的拨动,也意味着着基于时钟拨动的交易顺序被物 理的确定下来。
在分布式时钟拨动的过程中,工作量证明的积累越来越多,形成基于哈希指针的链条,也 即区块链:
工作量证明即时钟
本文从双花问题出发,引出区块链上顺序的问题;而顺序的核心是分布式时钟,在比特币 系统中工作量证明即创造了分布式时钟,且通过巧妙的将区块哈希头作为工作量证明的输 入,比特币系统将分布式时钟和链上交易顺序的确定统一。