比特币的运行机制

去中心化的比特币系统

要讨论完备的去中心化的比特币(货币)系统运行机制,需要结合技术和金融进行探讨。这里先简单地提出几个问题:

  1. 谁来发行新的比特币
  2. 谁来记账/维护账本(交易记录)
  3. 谁来批准交易的有效性
  4. 谁来制定比特币的运行规则

下面,结合比特币的交易来简单的理解整个系统。

比特币的交易流程

考虑业务场景:拥有一定数量比特币的A需要给B支付m数量的比特币。因为在比特币体系里,各个参与者不知道对方的身份,通过何种方式取信于对方:证明自己拥有一定数量的比特币或是已经支付/收到m数量的比特币?又是通过何种方式转移比特币的所有权呢?
首先,基于密码学知识,交易者生成一对密钥对。其中,公钥的Hash值作为地址addr,用于接受币;私钥用于对数据签名。当A发送m数量的币给B,这个交易包含的内容主要是:

  1. A证明自己拥有足够数量的币n
  2. A把m数量的币通过自己的地址addr发送给B的地址和找零地址(实际中支付的币未必等于拥有的币;找零地址可以是发送地址addr)

要证明某个地址拥有足够的比特币,可以通过区块链指针来查找某个地址是否有足够的币。要证明A对该地址的拥有权,那么只要使用对应的私钥签名,当该签名信息通过验证就可以证明A的拥有权。
地址addr拥有n数量的币表明之前的某个交易输出地址为addr,币数量为m。因此,当A将地址addr中的币发送给B的地址时,要把之前的那个交易信息作为输入参数,然后指明输出的地址和相应的数量。这样就创建好了一个交易。创建完成之后,A需要使用地址addr对应的私钥对这个交易进行签名,然后发送到比特币网络。
当比特币网络中的节点接收到该交易,并且当某个“被选中”的拥有写入区块链数据权利的节点将该交易打包进区块再添加到区块链中,然后其他节点(一般等待6个节点的确认)也接受该区块时,该交易在比特币网络中才算完成。
在密码学知识没有漏洞的情况下,发送交易到比特币网络之前的操作都是无懈可击。那如何确认由哪个节点来负责添加新的区块到链上呢?这就涉及到分布式共识和激励。

分布式共识

所谓共识,从技术上就是指一个有N个节点的系统,每一个节点都可以输入,其中有部分节点有故障或是恶意的,那么一个分布式协议具有以下两个属性:

  1. 输入值的中止必须经所有诚实节点来确定
  2. 该输入值必须由诚实节点生成

从理论研究的结果来看,分布式共识在一些情况下是不可能达成的。比方说,业界有著名的拜占庭问题,当超过1/3的节点是“叛徒”时,就无法达成一致。还有Fischer-Lynch-Paterson不可能结果的结论:简单地说就是在一个多进程的异步系统中,只要有一个进程不可靠,那么就无法在有限的时间内使所有进程达成一致。当然,通过对某些条件的妥协,研究者提出了一些算法来实现共识,如Paxos算法。但是以上关于分布式共识的内容是理论研究结果,比特币是一门兼具实践的系统,它通过奖励机制和良好的随机性,在实践中实现了分布式共识并且运行良好。
比特币共识的简化版可以理解为:

  1. 一个交易被广播到所有节点
  2. 每个节点都将监听到的交易放进区块
  3. 在每个回合,一个随机的节点可以广播它的区块
  4. 其他节点经过验证后,可以选择接受该区块
  5. 所有节点把该区块的哈希值放入自己的区块中,以此表示对该区块所在链达成的共识

通过将上一个区块的哈希值打包进待创建的区块中,就表示节点对上一个区块的确认,简言之达成了共识。当大多数节点都自动在经过确认的区块上进行下一次共识,区块链也由此越来越长。
那么思考下,节点为什么会愿意接受某个区块并把区块的hash值放入自己的区块中(该行为表示节点将该区块作为区块链的末端,当前节点的行为在该链展开)?这就涉及到了比特币的奖励机制。

奖励

奖励机制不仅仅是一个技术问题。很显然,分布式的网络中必然存在恶意/坏节点——就好像不是每一个人都守法/具有高尚的道德。因为比特币网络的匿名性——仅仅知道一个哈希地址,无法对恶意节点的行为进行惩处。但是,对于遵守规则的节点,我们可以进行激励。当某个节点成功的拓展了区块链后,系统奖励一定数量的比特币(比特币2009年开始运行,开始奖励50个比特币,每过4年减半,2018年大约为12.5个)。在这种情况下,为了维护自己的利益,每个节点都会为了奖励而尽量地遵守规则:

  • 遵守规则可以得到比特币作为奖励
  • 拥有比特币的节点会为了维护既得利益,而愿意维护该规则

另外需要提及的是,比特币中另一种奖励形式就是交易费:某个交易的输入和输出之间的差值即为给节点的奖励。理论上,输入不必大于输出,但是节点会优先打包交易费高的交易进入区块。
接下来回到第一种奖励机制,既然通过创建区块的形式可以获得比特币奖励,那么“随机”的节点恐怕不能服众,各个节点会争先恐后地抢夺该资格。那么,如何制定规则来选择节点创建区块呢?这就涉及到工作量证明。

工作量证明

通过随机的方式肯定无法选择节点来创建区块,我们希望能随机性地找到这样一种方式来确定某个节点来创建区块:

  • 根据占有某种资源的比例来选取
  • 该资源是无法被垄断的

在比特币中,工作量证明意味着要找到一个随机数使得满足下面的条件:

H(nonce||prev_hash||tx||...||tx) < target
  • nonce: 随机数
  • prev_hash: 上一个区块的哈希值
  • tx: 要打包进区块的交易
  • target: 目标值

根据前述的哈希函数的谜题友好性,除了逐一计算外,没有更好更快捷地方式找到该随机数。因此,哈希函数的特性决定了拥有较高算力的节点具有较高的概率获得创建区块的资格。而较高的概率并不意味着一定,因此某种意义上又带有微小的随机性。当找到了这个随机数,其他节点进行验证又是很容易的一件事,不需要消耗太多的资源。
此外,比特币还有一个特性就是会动态的调整区块的生成难度,从而保证大约10分钟生成一个新区块。

假想攻击

设想几个攻击来检查比特币系统的安全性。

  1. A谎称拥有地址addr,并试图转移地址内的币到另一个地址 A必须提供使用地址对应私钥签名的信息来证明所有权

  2. 多次支付:A把m数量的比特币发送给B后,又发送给C

  3. A拒绝来自B的交易 除非A能控制所有节点,否则其他节点就有可能打包B的交易并添加进区块

补充说明

  • 地址是从公钥而来,但不只是对公钥进行SHA256运算
  • 比特币的总数是一定的;以后的奖励纯粹来自交易费

参考资料

区块链技术驱动金融
bitcoin源码
Mastering Bitcoin:该书有网友翻译的中文版,很容易搜索到,但翻译质量一般,最好对照原文阅读。