跳转至

比特币随想 - 白皮书译注

它利用了信息易于传播但难以扼杀的特性。 ----- 中本聪

从技术角度看,比特币就是什么东西?比特币白皮书中提到:比特币在已有技术的基础上,解决了点对点网络的“双花”问题,及重复执行交易。

摘要

一个点对点版本的电子现金应该实现点对点直接线上支付,而不需要金融机构介入。数字签名提供了部分解决方案,但是数字签名方案仍然需要依赖第三方来避免“双花”问题。这篇文章提出了一个利用点对点网络解决双花问题的方案。该网络通过将每笔交易哈希到一个不断增长的哈希工作证明链上,为其打上时间戳,这样修改一条记录的代价就是重新进行工作证明。最长的链不但证明了一些列有序的交易记录,也代表了他背后最大的CPU工作量(译者注:即电能)。只要主流的CPU工作量来自不会攻击网络的节点,他们就会生成最长的链并且抵御攻击。网络本身仅仅需要最基本的结构,信息广播基于最大努力,节点可以随时加入或者离开网络,当节点回到网络会使用最长的工作证明链作为基础。

引言

互联网经济依赖金融机构作为信任第三方来处理电子支付。对于大部分支付行为这个系统都可以胜任,但是它也继承了一些信任模型带来的缺点。比如因为金融机构无法避免仲裁行为,真正的完全不可逆交易并不能实现。仲裁也会提高交易费用、限制最小交易金额,不适合大量小额交易。(译者注:比特币网络并没有实现大量小额交易的目的,但是其二级网络闪电网络实现了该功能。)而且,无法对不可逆服务进行不可逆交易也有一定的成本。因为有回滚的风险,就需要信任。因此商家必须对他们的客户保持警惕,向他们索取比他们原本需要的更多信息。一定比例的欺诈也是不可避免的。这些成本和支付不确定性可以通过使用实物货币避免,但如今还不存在在没有受信任方的情况下进行支付的机制。

我们需要的是一个基于密码学证明的电子支付系统,而不是一个基于信任的系统,该系统可以让交易双方直接进行交易,而不需要信任第三方。从计算复杂度角度看,交易的不可逆性可以保护买家免于欺诈,通过常规托管机制(译者注:不理解到底什么意思)也可以保护买家。在这篇文章中,我们提出了一种解决双花问题的方法,该方法使用一个点对点的时间戳服务器生成交易时间顺序的计算证明。只要诚实节点控制的CPU算力超过不诚实的节点,系统就是安全的。

交易记录

我们将电子货币定义为:一串数字签名。 电子货币的拥有者对前一个记录的哈希和目标拥有者的公钥进行数字签名,然后把这个数字签名添加到该货币的末端,这样就实现了货币的转移。被支付人可以通过验证支付人的签名来验证所有权链。

虽然被支付人可以验证币的所有权,即支付拥有币,但是显然,被支付人无法证明支付人是否仅仅把币支付给自己一个人,即无法证明支付人是否双花。一般的办法是引入一个信任的第三方,或者叫铸币局,来验证每一笔交易是否双花。这样,每一笔交易后,币需要被返还铸币局,并发行一个新币,只有铸币局发行的货币是合法的并且保证没有双花问题。然而,这个方案最大的问题在于整个货币系统都会依赖铸币局,每一笔交易都要经过铸币局。换句话说,铸币局就是银行。

译者:信任其实不可以被移除,而是转移。整个公钥密码学是强大的,如今整个互联网都依靠公钥密码学来实现秘钥传递和验证。公钥密码学解决了对称密码学的问题:私钥传递,但是问题变成了如何信任公钥?目前的解决方案跟银行差不多:CA,即证书机构。通过一个被信任的中心化组织分发信任的公钥。比特币系统其实把信任从银行转移到了工作证明,即最长公链消耗的能源。

我们需要一个方法,让被支付人确认支付人之前没有为交易签名,即当前是支付人第一次为这个交易签名。因为,我们只在乎最早的交易,而不是后续的双花问题。确认交易没有发生唯一办法就是查验之前所有的交易。在铸币局方案中,铸币局知晓所有的交易,因此可以确定顺序。在没有第三方的情况下实现这一目的的方法就是将交易广播1。因此我们需要一个系统来保证所有的参与者可以认可一个唯一的历史记录。被支付人需要证明在交易发生的时刻,绝大多数节点认可该笔交易第一次发生。

时间戳服务器

我们提出的方案首先需要一个时间戳服务器。时间戳服务器首先拿到一个准备加时间戳的区块的哈希值,然后广播这个哈希值,就好像报纸或者 Usenet23。时间戳可以证明数据在当时是存在的,这样他的哈希值才可能写入。每一个时间戳包含了前一个时间戳的哈希,这样就形成了一个链,后面的每一个时间戳都包含前面所有时间戳的部分信息。

工作证明

为了实现一个基于点对点网络的分布式时间戳服务器,我们需要一个类似 Adam Back 的 Hashcash 4 中的工作证明系统,而不是报纸或者 Usenet。工作证明会检查哈希值(比如 SHA-256)是不是以若干 0 比特开头。找到这样一个哈希的平均时间与需要 0 比特的位数呈指数关系,但是验证过程只需要执行一次哈希算法。

为了实现上一节提到的时间戳服务器,我们通过一个区块中递增的整数(nonce)实现工作证明,直到找到一个整数刚好使区块的哈希值以若干 0 比特位开头。一旦已经花费了CPU算力得到了满足工作证明的哈希,这个区块就无法被改变,除非重做工作证明(译者:即重新投入一次CPU资源)。

工作量证明解决了在多数决策中确定代表的问题。如果多数决策采用“一个地址一票”的方式,任何掌握多个 IP 地址的组织都可以破坏规则。工作量证明本质上是“一个CPU一票”。(译者:其实不完全是,本质上是一度电一票,这就是物理世界和数字世界的连接点)多数决策的代表就是最长的工作量证明链,也就是投入工作量最多的链。如果大部分的 CPU 资源被诚实节点控制,诚信的链就会变得最长且可以抵御攻击。为了修改一个区块,黑客需要重做该区块的工作量证明以及改区块后续的所有区块的工作量证明,并且追赶且超过诚实的节点。我们后面会证明,一个慢的黑客实现这种攻击的成功几率会随着诚实链的增长成指数级降低。

为了应对硬件速度和节点数量的增加,工作量证明的难度(译者:即 0 比特的位数)会随着出块时间进行调整。基本上确保网络每小时出相同多的区块(译者:6个每小时)。如果区块增加速度过快,难度会相应提升。

网络

运行比特币网络的步骤如下:

  • 新的交易被广播到所有节点(译者:尽可能多的)
  • 每个节点(译者:矿工)选择准备打包新区块的新的交易
  • 每个节点(译者:矿工)开始工作量证明(译者:即寻找整数)
  • 当一个节点发现了整数,它会把这个区块广播到所有节点(译者:尽可能多的)
  • 节点(译者:全节点?还是矿工)会检查新快的所有交易是不是合法以及是否存在双花,一切正常就接受该块
  • 节点(译者:矿工)接受新区块后会在此块基础上继续工作量证明

节点永远采纳最长的链作为“正确”的链,并且在此基础上继续增加区块。如果两个节点同时(译者:延迟意义上的)广播了不同的区块,有些节点会接受前一个,有些则接受后一个。这种情况下,他们会在第一个接受的链上工作,并存储第二个链,以备第二个链变得更长时,以第二个链作为基础工作(译者:就是舍弃之前工作的链)。这种僵局一般会在新的区块被发现,导致某个链变得更长时打破;所有再短链上工作的链都会转向新的更长的链。

新的交易记录不必广播到所有节点,只要他们可以被送达一些节点即可,不久他们就会被加区块。区块的广播也对信息丢失不敏感。如果一个节点没有接到区块,他会请求区块,当他收到新的区块后,就会发现之前错过的区块。

激励

按照惯例,每个区块的第一个交易记录是一个特别的交易(译者:Coinbase),这个交易的拥有者(译者:第一个拥有者)是这个区块的创建者(译者:即成功破解工作量证明的地址)。这样就提供了节点运行而维持网络的激励,并且提供了初始的代币分发,因为比特币网络没有中心机构决定代币的分发(译者:太美妙了)。这种持续的代币增发机制类似有金矿,金矿会投入资源开采更多的黄金加入流通。比特币网络中,CPU 时间和电力就是开采的成本。

另一个激励机制就是交易费。如果一个交易的输出比输入小,差价就是交易费,该交易费就会被包含在包含该交易的区块中。一旦所有预订的代币全部进入流通(译者:2千1百万),交易费将会是唯一的激励机制。换句话说,代币没有通胀问题(译者:通缩这么办?)。

激励机制鼓励诚实的节点。如果一个贪婪的黑客聚集了比诚实节点更多的 CPU 资源,他需要选择作弊,或者成为诚实的节点获取区块奖励(译者:coinbase 或者 交易费)。他应该发现遵守规则更有利可图,这些规则使他获得的新硬币比其他人的总和还要多,而不是破坏系统和他自己财富的有效性。

回收硬盘空间

在不运行全节点的情况,我们也可以验证支付。用户只需要存储最长工作量证明链的区块头信息,该信息可以通过查询网络中的其他节点获得,知道它确认自己拿到了最长的链。然后,他可以获得 Merkle 分支(译者:Merkle 是一种数据结构),该分支连接了这笔交易和他被加入时间戳的区块。他不能查看自己的交易,但是通过上述连接,他可以看到网络中有节点已经接受了他的交易,然后他可以查看最长公链后续的区块来确保网络已经确认了他的交易。

只要诚实节点控制网络,他就是可以确认这个验证是有效的,但是这种验证会相对不可靠,如果网络被黑客的节点控制。虽然网络节点可以自己验证交易,但只要攻击者能够继续控制网络,这种简化的方法就会被攻击者伪造的交易所欺骗。防止这种情况的一种策略是在网络节点检测到无效块时接受来自网络节点的警报,提示用户的软件下载完整的块并警告交易以确认不一致。当然,运行自己的节点是实现更独立的安全性和更快的验证的最佳方案。

组合与拆分

尽管我们可以独立地处理每一个代币,为每一笔交易创建一个记录也是不明智的。为了实现交易的组合和拆分,一个交易记录可以包含多个输入和输出。一般情况下,通常会有来自较大先前交易的单个输入或组合较小金额的多个输入,并且最多两个输出:一个用于支付,另一个将零钱(如果有的话)返回给发送者。

需要注意的是,扇出(fan-out)并不是问题。一个交易依赖于多个交易,而这些交易依赖于更多交易。因为我们不需提取交易历史的完整独立副本。

隐私

传统银行是通过控制信息的访问权限实现隐私的。尽管比特币网络会广播所有的交易,仍然可以保证隐私。因为公钥是匿名的。大众可以看到一个地址向另一个地址转账,但是这笔交易不会跟任何人产生联系。这跟股票交易所的信息披露有些像,每笔交易的时间和大小都会被记录并且公开,但是不会公开交易双方的身份。(译者:有意思,中本聪似乎了解股票市场的运作)。

另一个保护隐私的方法:每一笔交易都可以使用一个新的钥匙对(译者:公钥跟私钥),这样就无法把这些交易联系到同一个人。当然,对于多输入交易,一些联系是无法避免的,因为输入的持有人可能会泄漏一些信息。风险在于,如果一个人的公钥与身份链接泄漏,可能会影响该持有人后续交易的隐私性。

计算

现在我们假设一个攻击者试图更快的生成一条不同于诚实链的链。即使这种情况发生了,也不会让系统面临一些随机的变化,比如凭空创造一个代币或者获取从来不属于攻击者的代币。节点(译者:全节点)不会接受非法交易记录,诚实节点也不会接受包含这样交易的区块。攻击者只能改变自己的交易记录,收回他之前支付的代币。

攻击者节点和诚实节点之间的竞争可以用 Binomial Random Walk 模型模拟。诚实节点成功添加一个区块,增加 +1;或者攻击者节点增加一个区块,-1。

攻击者成功修改记录并且赶上诚实链的几率与赌徒的破产问题(译者:一个拥有有限赌本的赌徒玩一场公平的游戏(即每次游戏双方的期望值都是零),在一个拥有无限赌本的对手面前,最终将破产。)类似。攻击者节点赶上诚实节点的概率计算如下:

  • $p$ 诚实节点找到下一个区块的概率
  • $q$ 攻击者节点找到下一个区块的概率
  • $q_z$ 攻击者节点赶上诚实链的概率

  • $q_z = 1$ 如果 $p <= q$

  • $q_z = (q/p)^z$ 如果 $p > q$

我们应假设 p > q,攻击者追赶诚实链的几率呈指数下降。在对攻击者不利的情况下,如果他没有足够幸运,那么他会进一步落后,他的机会就会变得微乎其微。

现在我们来分析一个收款人需要等多久才能确认他的交易不会被改变。我们假设攻击这是付款人,他想要让收款人相信他一直完成支付,然后一段时间后他通过攻击改变这笔交易。如果该情况发生,收款人回收到警报,而攻击者希望攻击已经完成。

收款人生成了一个新的钥匙对,仅在交易发生前,把公钥给了发款人(攻击者)。这可以防止攻击者提前准备一个区块链,然后是不断地处理它,直到他幸运地领先足够远,然后在那个时刻执行交易(译者:然后才公布他的链,在此之前网络不知道这条链的存在)。一旦交易发出,攻击者开始秘密的在另外一个链进行工作量证明,而这条链包含了一个被改变的交易(译者:他自己的交易,大概率是降低支付金额)。

收款人等到他的交易被加入区块并且$z$个此后的区块已经被加入公链。他并不知道攻击者的秘密连已经进行了多少,但是他可以假设诚实的区块需要平均时间加入(译者:10分钟),黑客可能的进度可用比松分布模拟:

$$\lambda = z * (q/p)$$

我们将泊松密度乘以赶上公链的概率:

整理:

该公式的 C 语言代码:

运行结果如下:

如果求解 p < 0.001 的情况:

(译者:可以看到,在攻击者出块概率为 10% 的情况下,等待 5 个区块,黑客成功的概率仅为 0.1%)

结论

我们提出了一个不需要第三方的电子支付系统。首先,我们介绍了常见的数字签名方法,该方法有利的解决了资产的所有权问题,但是却无法解决双花问题。为了解决双花问题,我们提出了一个采用工作量证明的点对点网络来记录交易历史,而且该记录让攻击者难以改变,只要网络有大部分诚实节点控制。比特币网络的稳定性来源于他非结构化的简单性(译者:多么美妙,如今区块链发展越来越复杂,但是这岂不是丢掉了区块链的核心,即稳定性)。节点完全自主独立的运行,几乎不需要同步。他们不需要被识别,因为信息并不是分发到某个特定的节点,而是任何节点。节点可以随时加入或者退出网络,然后接受最长工作量证明链作为离开期间的历史。他们通过 CPU 资源进行投票,表达他们接受或者拒接区块的意愿。任何规则和激励措施都可以通过这种共识机制来执行。


  1. http://www.weidai.com/bmoney.txt 

  2. https://nakamotoinstitute.org/literature/secure-timestamping-service/ 

  3. https://www.anf.es/pdf/Haber_Stornetta.pdf 

  4. http://www.hashcash.org/papers/hashcash.pdf