53

文章目录

  1. 引言
  2. 正文
    1. 交易
    2. 时间戳
    3. 工作量证明(Proof-of-Work)
    4. 区块链网络的工作步骤
    5. 激励机制
    6. 节省磁盘空间
    7. 简单支付验证
    8. 化整(零)为零(整)
    9. 隐私与安全
      1. 隐私性
      2. 安全性
  3. 结束语
  4. 引用

引言

一个纯P2P的电子现金系统可以让一方不通过任何金融机构而直接向另外一方付款。虽然数字签名提供了部分解决方案,但是如果其仍然依赖于可信的第三方来防止双花(Double Spend)问题,那么这种方案就失去了主要的优点。本文提出了一个新的解决方案,使用一个P2P网络来解决双花问题。该网络可以为交易打上时间戳,并且将交易的哈希值放到一个使用工作量证明的链上。攻击者想要攻击某个区块,需要完成该区块一起之后所有的区块的工作量之和才有可能攻击成功,在有限算力的情况下,攻击极难成功。因此,交易可以被认为是不可逆、不能被篡改的。

该系统的数据存储采用一种链式结构,最长链不仅作为所发生事件序列的证明,而且还可以作为最多CPU工作量的证明。只要大多数CPU计算能力没有一起合作攻击该网络,那么他们就可以生成最长的可信链,并且可以超过攻击者的。

系统使用一个完全分布式的P2P网络进行消息的传播,网络中的节点可以自由离开或者加入该网络。

正文

通常的交易系统都是基于账户的,比如银行,每个人的账户中都有个人的余额。支付时,从账户中支出钱到另外一个账户。而比特币使用的是另外一套体统,这个支付系统是基于交易的。也就是每一笔支付都是从上一个交易的输出中支出。

下面我们详细介绍交易的结构。

交易

交易结构

交易结构如上图所示。

我们重点关注交易中的几个字段:

  1. 输入交易。输入交易是支付行为的资金来源。
  2. 输出地址。输出地址表示资金的去向。比如上面的交易1的输出输出地址就是用户2。这个地址通常使用公钥的哈希值来表示。
  3. 交易额。该字段表示交易的金额。
  4. 用户签名。用户签名用于证明支出方对于输入交易的所有权。由于输出地址中填写的是用户公钥的哈希,只有拥有该公钥对应的私钥才能花费该交易中的余额。

我们假设用户2需要向用户3支付。从上图中我们可以看出,交易1的输出地址为用户2。那么用户2创建了一个交易2,结构如上图中间那个交易。该交易的输入交易引用了之前的交易1,输出地址填写了用户3的地址,交易额中填写了需要向用户3转账的金额。创建了交易2之后,用户2使用自己的私钥对交易进行签名。用户2签名之后,便可以将该交易发送到P2P网络中,等待交易确认,该交易便完成了。下一次用户3需要向其他用户支付时,便可引用交易2 (如图中的交易3)。

该过程尚未解决双花问题。若需要解决双花问题,就需要让用户知道所有的交易,并且可以让用户对于交易的历史记录达成一致。那么就需要一种规则,在出现了双花的情况下,可以决定交易的先后顺序,先出现的交易有效,后出现的交易无效。这就需要一个时间戳系统。

时间戳

文中提出的系统引入了一个时间戳服务器。这个时间戳服务器将多个交易合成一个块之后,对这整个块打上时间戳。每个块中会包含上一个块的哈希,这样就形成了一个链(如下图所示)。

区块链

这个区块链系统虽然解决了时间戳系统,但是又引入了另外一个问题:很容易产生分岔,也就是如果有多个区块引用了同一个区块,那么以谁的区块为标准呢(如下图所示)?

分岔

这个问题可以通过下文描述的工作量证明来解决。

工作量证明(Proof-of-Work)

为了限制区块可以被随意生成,文中提出了工作量证明机制。

为了产生一个区块,时间戳服务器需要计算整个区块的哈希值,让哈希的开头以$N$个0比特位开始。由于哈希值完全随机,因此哈希的计算量会随着哈希值开头需要0的比特位数量成指数级增长。为了实现对于区块可以计算许多个哈希值,在区块中引入了一个Nonce值(整数),nonce值每变化一次就可以重新计算一次哈希。

Nonce值

引入了工作量证明之后,如果一个用户想要生成一个区块,那么该用户必须重新计算该区块的哈希。在整个P2P网络中,接收最长的链作为主链。一个攻击者如果想要篡改一个交易,那么就需要重新完成该交易所在区块以及其之后所有区块的工作量。

由于现在的硬件速度越来越快,为了防止区块产生越来越容易,区块链网络会每隔一段时间调整一下计算哈希的难度(通过调整哈希值开头0比特的数量)。

区块链网络的工作步骤

  1. 所有新的交易被广播到整个区块链网络
  2. 区块链中每一个时间戳节点将搜集到的交易包含到一个区块中
  3. 节点不断计算区块的哈希,以满足当前区块的难度要求(哈希以N个0比特开头)【工作量证明】
  4. 节点找到一个满足工作量证明的区块之后,就将该区块广播到整个区块链网络
  5. 其他节点会验证该区块以及区块中所有交易的有效性,验证完成之后,如果通过验证就将该区块链接到前一区块之后;如果验证失败,那么就拒绝该区块
  6. 各个节点在将接收到的最新区块的哈希值,作为当前区块的前一个区块的的哈希值,进行当前区块的生成

每个节点总是接受最长的区块链作为自己的主链,以开始生成区块。在区块收到分岔的时候,总是在自己首次收到的区块基础上进行新区块的生成。这个分岔会在新的区块生成之后消失(因为新的区块终结了同等长度区块的存在)。从而在其它较短分岔上计算新区块的节点都会转向这个最长链,来进行新区块的计算。

激励机制

比特币的激励由两部分组成:

  1. 挖矿奖励
  2. 交易费

每一个新生成的区块中的第一笔交易就是给生成区块的用户发放一定量的比特币奖励,这个可以激励用户去生成新的区块。而另外一部分奖励是交易费。使用区块链网络进行的每一笔交易都需要缴纳一定数量的交易费,这样可以保证交易被生成区块的用户在区块中包含该交易。一个交易中包含输入和输出,输入输出金额之差$value_{input} - value_{output}$被作为交易费发放给区块生成者。

激励机制可以帮助区块链的参与者遵守区块链的运行规则。如果一个用户拥有区块链全网一半以上的计算能力,那么他会发现遵守区块链的运行规则可以获取更大的经济利益。

节省磁盘空间

一旦一个比特币所对应的最新的交易已经被足够多的区块所确认(表示该交易基本无法被篡改),那么该交易之前所引用的所有交易数据都可以从磁盘存储中删除。为了防止这种数据删除的操作会改变区块的哈希值,区块中交易的组织采用了默克尔树的结构。具体结构如下图所示:

优化磁盘存储

由于默克尔树采用了树形结构,删除底层的交易并不会导致根哈希的改变。因此,存储在区块头部中的默克尔树根不变,从而其对应的哈希值也不会失效。

简单支付验证

对于一个普通用户来讲,他可能仅仅想要使用区块链的支付功能,而不想存储区块链网络本身。存储整个区块链会消耗大量的存储空间(几百个G)。区块链网络支持一种快速验证交易的机制,在此机制下用户仅需存储很少内容就可以验证交易。

简单交易验证只需要用户在本地存储区块链的头部,而无需将交易数据本身记录下来。用户确认一个交易被区块链网络接受了,可以包含如下步骤:

  1. 区块链中的某个区块包含了他的交易
  2. 包含该交易的区块后面已经被足够多的新区块覆盖,以防止被攻击

当仅仅存储区块链头部时,我们很容易验证上面的第二条:只需向区块链网络请求最新的区块头部,就可以看到一个区块后面跟着多少新的区块。

那么如何验证上面的第一条,即如何验证交易被区块包含进去了呢?我们可以利用默克尔树的特性,生成一个证明来确认交易已经被区块包含。以下图中的交易3为例,说明默克尔树证明的原理:

默克尔树证明

交易3在区块中的证明包含三个部分(哈希01,哈希2, 交易3),在图中用红色背景表示。显然我们可以通过这三个值得到默克尔树的根哈希。得到根哈希后,就可以检查与区块头部中的哈希是否一致,这样就验证成功了。

化整(零)为零(整)

上面我们展示的区块链交易都是一个输入一个输出。区块链网络支持多个输入多个输出。比如一个人有很多交易,这些交易里面的余额都比较少,那么用户就可以同时引用这些交易作为输入。

在典型的应用场景下,一笔交易会有两个输出:一个输出是支付给收款人;另一个输出用于将余下的钱返回给支付人(相当于找零)。也有一些场景需要将比特币发送给许多接受者,比如矿池发送奖励给矿工的时候,就会从一个账户发送给多个账户。这些区块链网络都是支持的。

隐私与安全

隐私性

比特币中的地址为公钥的哈希,在正确使用的情况下(如:每次使用都生成新的地址),很难将比特币网络中的用户与现实生活中的用户联系起来。

安全性

正常情况下,用户产生区块的概率与其所拥有的算力水平成正比。比如一个攻击者拥有比特币全网$1/3$的算力,那么每次他都有$1/3$的概率产生新的区块。如果另外拥有$2/3$的节点先生成了区块,那么攻击者需要在其他人产生新的区块之前,连续生成两个区块,才能让其生成区块所在的链成为为全网最长的链,这样的概率为$\frac{1}{3} \times \frac{1}{3} = \frac{1}{9}$。显然攻击者想要改变的区块深度越深,他成功的概率越低,攻击成功的概率会随着所攻击区块深度的增长成指数降低。

下表给出了在攻击者拥有不同攻击算力的情况下,攻击成功率在小于$0.1\%$所需区块的深度情况。

攻击者算力比例 区块深度
0.1 5
0.15 8
0.20 11
0.25 15
0.30 24
0.35 41
0.40 89
0.45 340

结束语

该白皮书提出了著名的比特币系统,开区块链之先河。比特币之后又出现了大量的加密货币,目前已经有了极高的市值。不仅在加密货币领域,比特币还为人们引入了一个新的系统架构---区块链。当前,区块链已经在许多领域落地,在各领域的影响力也在不断的扩大。

引用

[1] Satoshi Nakamoto, Bitcoin: A Peer-to-Peer Electronic Cash System, https://bitcoin.org/bitcoin.pdf