2.3 比特币区块链的运作方式

比特币区块链是第一个成功的区块链项目,其运作方式与传统的支付系统完全不同。本章将通过介绍比特币网络和区块链的交易流程及运作方式,展示交易在比特币分布式共识机制中“被信任”和“被接受”的过程,以及如何成功地被存储在区块链中。

2.3.1 区块链如何运作

比特币区块链的运作并不复杂,共涉及3个概念:首先是交易,每一次对账本的操作都会导致账本状态的改变;其次是区块,每记录一段时间内发生的所有交易和状态结果,都是对当前账本状态的一次共识;最后是链,区块是按照发生时间顺序串联起来的,是整个账本状态变化的精确日志记录。

在运行中,先假设存在一个分布式记账的账本,在这个账本中只允许添加,不允许删改,账本的基本结构是一个线性的链表,链表由一个个“区块”串联而成,后继区块记录前导区块的哈希值,当加入新数据时,必须放到一个新的区块内,而这个块中的交易是否合法,要通过计算哈希值的方式快速检验出来,任何一个节点都可以提议建立新的区块,但是必须通过一定的共识机制来对最终选择的区块达成一致。

举个简单的例子来解释一下区块链的运行机制,这个过程主要分三步:

第一步是账本公开,我们把区块链假设成一个封闭的区域,这个区域中的每户人家都是区块链上的一个节点,每个节点都拥有记载着这个区域每一笔交易的账本,而且这个账本是公开的。只要这个账本的初始状态是确定的,并且每一笔交易的记录都是可靠而有序的,当前每个人持有的钱都是可以推算出来的。

但是,参与的用户必然不想让区域内所有人知道自己到底有多少钱。因此,在区块链中交易是公开的,但是参与的每个节点都是匿名的。节点之间不使用真实身份进行交易,而使用自己的唯一ID。当两个节点发生交易之后,交易的报文中会显示此ID的数字签名,以确保交易是在双方之间展开的。

第二步是身份签名。假设在这个区域中老李和老王是区块链中的两个节点,老李的ID名为BLOCK,老王的ID名为CHAIN。如果老李要向老王支付1比特币,那么老李首先要询问老王的ID,这时区块链中就会产生一个交易:BLOCK要向CHAIN支付1比特币,于是老李要写一张交易单给老王。

在区块链中,为了追溯资金的来源,在这个交易单上除了记载付款和收款信息,还要写上比特币的来源信息,如这个比特币来源于账本第一页。交易单写完后,老李还要加上自己的签名,即私钥加密,以便老王验证比特币的来源。老王收到签名后,会有老李的ID对其进行签名验证,以证明交易单是老李发的,如图2-1所示。

图2-1 老李老王的交易过程

第三步是矿工挖矿。在一个传统中心化的系统中,老李是否有足够的钱支付给老王,这个过程要通过第三方中介机构(如银行)来确定。而在区块链系统中,做这个工作的是矿工组织。

当老李给老王发送交易单时,他们两个的交易信息会广播给矿工组织,而矿工组织的每个矿工小组收到交易信息后,就负责把交易补充到账本中去。

矿工小组的具体工作就是生成账单,如图2-2所示。当矿工小组收到老李和老王的交易信息时,在交易清单上记录上这个交易,接着矿工小组的成员找到当前账本的最后一页,将编号抄写在“上一账单编号”一栏中。随后矿工小组的成员会把交易清单、上一账单编号及随机数通过哈希运算,生成一个本账单编号。由于交易清单和上一交易编号是不能改变的,因此,矿工小组成员必须不断变化随机数值来生成符合规定的账单编号。

图2-2 矿工小组生成账单

此外,区块链会自动调整账单编号规则,使其在10分钟之内生成。矿工小组得到一张账本纸(区块)以后,必须马上向其他小组确认自己的工作成果才能得到奖励。

其他小组在接到账本纸后,必须立刻停下挖矿工作,对账本进行确认。首先将送来的账本纸放入编码生成器中,来确认账本编号是否有效。然后将账本纸上的“上一页账单编号”和这个小组目前保存的有效账本最后一页进行编号比对,如果相同,则确认;如果不同,则需要顺着已有账本向前比对,直到找到这个编号的账本纸;如果没有找到,则这个小组会将此页丢掉,不予确认。最后还要确认当前每笔交易的付款人有足够的余额支付这笔钱,来保证交易清单的有效性。当完成了所有验证并通过后,这个小组就认可了其他小组发来的账本纸有效。

其他小组确认该区块有效以后,这个区块就会进入主账本,后面的挖矿工作就会再基于这个更新之后的账本进行。

对于这个矿工小组来说,如果后面收到其他小组送来的账本纸中的“上一账单编号”是自己以前送去的账单,那么就表示已经有小组是基于他们交完账单以后新生成的主账本工作了,这就表示他们的工作被其他小组认可,而老李和老王看到大多数小组认可,就认为这个交易已经成功。

总结一下,在区块链中比特币的交易过程如下:

A利用自己的私钥对比特币的来源和下一位所有者B签署一个数字签名,并将签名附在交易单后面。

这个交易单通过P2P网络传播到了全网,B和矿工组织都会收到这张交易单;矿工组织通过哈希运算,解出对应的随机数,生成符合条件的哈希值,然后去争取创建新区块并获得比特币奖励。

矿工节点找到解时,会向全网通告该区块记录的盖有时间戳的交易,并由其他节点核对。

当其他节点核对区块确认无误后,他们就会将该区块认定为合法,然后去争取下一个区块,这样就形成了一个合法记账的区块链。

2.3.2 双重支付如何解决

双重支付是什么呢?它是同一笔钱(数字货币)被重复支付两次。仍以上文区块链为例,除了老李和老王是区块链中的两个节点,又增加了老张节点。如果老李写一个单子并加上自己的签名,付给老王之后,他又复制了这个单子和自己的签名给了另外一个人老张。老王和老张确认了老李的签名正确后都认为自己收到了这笔钱,这个过程就产生了双重支付的问题。

双重支付问题在物理货币世界并不现实,因为黄金、白银无法复制。如果是纸币的话,签上名交付对方之后,就无法再次使用了(无法同时再将此票据给他人)。在传统电子货币世界中,通过每次将使用过的电子货币返回货币发行机关,发行机关对返回的电子货币进行确认,再发行同等金额的新电子货币来避免双重支付。这就造成了整个金融体系完全依赖发行机关来运行,而且每一次交易都必须经过发行机关。这意味着所有节点的所有交易都必须经过一个中心网络来监控并强制阻止双重支付。但是这样既不能彻底解决双重支付问题(避免复制数字货币的行为),也避免不了交易中介纠纷和交易成本增加等问题。

那么,比特币是如何解决双重支付问题的呢?

我们知道比特币付款人(如老李)会对前一次的交易和下一位拥有者(老王或者老张)的公钥签署一个数字签名,将这个签名附加在比特币的末尾发送给下一位所有者(老王或者老张)。由于没有第三方机构去进行监控,所以,需要一个机制去确保比特币之前的所有者没有对更早发生的交易实施签名。

这个机制就是历史交易经过全网公认、面向全网公开的共识机制,它包括的内容如下:

(1)所有节点的历史交易全网公开,每个账号中有多少比特币,并不是由一个数据来表示的,而是根据历史交易得出来的。这个历史交易链是经过全网公认的唯一的合法交易,这样收款人因为拥有全网公认的作为第一位收到该比特币的交易历史证据,从而避免了双重支付的风险,付款人也因为全网公开交易的历史记录而避免双重支付的行为。

(2)每笔交易都有时间戳(Timestamp),所有交易具有时间先后顺序,每一笔交易数据在一个精确特定的时间点发生。当前面一笔交易成功在整个交易链被公认后,下一笔交易就基于上一笔交易生成,整个交易就是一个具有精确时间顺序信息的交易链。

(3)每笔交易都需要投入计算资源来确认,比特币采用工作量证明(Proof of Work)机制,由矿工投入计算力打包交易,如果有人想篡改某个区块上的交易,需重新计算历史的全部区块,这样的算力在数学上是不可能的。因此,这个大多数节点公认的交易记录链无法被篡改。

整个比特币系统中的每一个节点都会获知每一笔交易的发生,并形成具有精确时间顺序信息的历史交易链,全网公认这笔交易是首次出现时,这笔交易才能发生。矿工通过贡献算力把每笔交易加入不可篡改的公共账本中,并获得挖矿奖励。比特币就是通过这种巧妙的方式,解决了双重支付问题和拜占庭将军问题。