
第二节 区块链技术原理:以比特币为例
比特币是一个互相验证的公开记账系统,具有总量固定、交易流水全部公开、去中心化、交易者身份信息匿名等特点。其“未花费过的交易输出”(Unspent Transaction Output,UTXO)的绝佳设计,解决了ECash数据库无限膨胀的问题,使数字货币技术出现新的飞跃。人们将这一前沿技术称为区块链技术(Blockchain Technology),或称为分布式账本技术(Distributed Ledger Technology,DLT)。区块链技术综合采用了密码学、分布式数据库(大规模数据存储与处理)、高性能计算与通信(P2P网络)、共识机制(分布式一致性)、智能合约等技术。本节以比特币为例,阐述区块链技术原理,为后文的经济分析提供技术基础(3)。
一、比特币概览
比特币是一个分布式的P2P网络系统,没有中心服务器,不存在中央控制点和服务,网络中所有节点彼此对等,节点之间相互连通,节点遵守共同的协议规则,协同处理交易,每个节点在对外提供服务的同时也使用网络中的其他节点所提供的服务(4)。
比特币被设计为一种点对点的电子现金系统,它选择P2P的网络架构既是这种核心特性的反映,也是该特性的基石。去中心化控制是比特币设计时的核心原则,基于P2P网络协议设计的比特币协议更加可靠和开放,避免被少数人操纵和破坏。
比特币使用密码学来确保货币流通各个环节的安全性,使比特币只能被真实的拥有者转移或支付,并实现货币所有权与流通交易的匿名性。
比特币通过区块链网络提供一个公共可见的账本,用来记录交易历史。每笔新的交易记录需广播到比特币网络中,经矿工节点打包进区块后才成为有效交易。每个交易包括一些输入和输出,未经使用的交易的输出UTXO可以被新的交易引用作为合法的输入。一笔合法的交易流程,是引用某些已存在交易的UTXO,作为交易的输入,并生成新的输出的过程。在交易过程中,转账方需要通过签名脚本来证明自己是UTXO的合法使用者,并且指定输出脚本来限制未来对本交易的使用者(为收款方)。对每笔交易,转账方需要进行签名确认。并且,对每一笔交易来说,总输入不能小于总输出。交易的最小单位是“聪”,即0.00000001比特币。
比特币不存在传统意义上的一个中央货币发行系统,而是通过预设的算法发行。随着比特币总量的增加,新币制造的速度减慢,总量上限被设置在2100万个。不过,如果获得足够挖矿算力和用户的支持,包括改变发行上限在内的所有规则都可以修改,此为“分叉”,至于分叉后是否还可称为“比特币”,市场/社区是否认可,则是另外一回事。不同分叉仅在于认同群体的数量多寡,以及被动或者主动的差别。
不同于传统货币,比特币是完全虚拟的,没有实物货币或有形资产背书,其交换价值来自群体自发形成的共识。从技术角度看,比特币隐匿在工作量证明保护下的交易流水账本中。比特币用户拥有的仅为可在比特币网络中证明自己交易权的密钥。
比特币常被误认为是一个匿名的支付网络。但事实上,比特币可能是世界上最透明的支付网络。所有的历史交易记录完全公开,所有人都可以下载查看,验证分析。比特币依靠“假名”保护交易者的隐私:交易地址用户自主生成,地址背后的真实身份信息无人知晓。但借助关联分析、交易回溯等手段有可能获知用户信息。
二、比特币钱包和地址
比特币的所有权是通过数字密钥、比特币地址和数字签名来确立的。数字密钥实际上并不是存储在网络中,而是由用户生成并存储在比特币钱包中,且由用户通过钱包软件管理和使用密钥。用户使用密钥实现对比特币的所有权和支付行为的确认。
每笔比特币交易都需要一个有效的签名才会被存储在区块链。只有有效的数字密钥才能产生有效的数字签名,因此拥有比特币的密钥副本就拥有了该账户的比特币控制权。密钥是成对出现的,由一个私钥和一个公钥所组成。公钥就像银行的账号,而私钥就像控制账户的PIN码或支票的签名。比特币的用户很少会直接看到数字密钥,一般情况下,它们被存储在钱包文件内,由比特币钱包软件进行管理。
(一)私钥和公钥
私钥就是一个随机选出的数字而已。一个比特币地址中的所有资金的控制权取决于相应私钥的所有权和控制权。私钥必须始终保持机密,因为一旦被泄露给第三方,相当于该私钥保护之下的比特币也拱手相让了。私钥还必须进行备份,以防意外丢失,因为私钥一旦丢失就难以复原,其所保护的比特币也将永远丢失。
具体来说,私钥是一个随机生成的256位二进制数,位于1和n之间(n=1.158×10^77,是比特币系统使用的椭圆曲线的阶)。
通过椭圆曲线乘法可以从私钥计算得到公钥,这是不可逆转的过程:K=k×G。其中k是私钥,G是椭圆曲线点群的生成元,而K是所得公钥。
(二)比特币地址
比特币地址是由公钥经过两次哈希运算后得到的20字节的数据,再经过Base58Check编码后生成的。
(三)钱包
钱包是私钥的容器,通常通过有序文件或者简单的数据库实现。钱包的类型如下。
非确定性钱包:它仅仅是随机生成的私钥的集合。由于重复使用同一个地址会降低隐私的安全性,一个用户可能会需要生成许多的私钥,对应许多不同的公钥,这样就能有多个不同的比特币地址。在非确定性钱包中,每生成一份新的私钥,就要保存一份备份。否则一旦丢失,对应地址的比特币就无法再找回。
分层确定性钱包:为了避免保存多个密钥,比特币开发团队在BIP32中提出了分层确定性钱包(HD Wallet)的解决方案。这种钱包的私钥不是由随机熵源直接生成的,而是由随机种子经过单向哈希函数衍生出的。私钥又能通过单向哈希函数继续衍生出新的子私钥,子私钥继续能衍生出新的孙私钥,依次类推,可以产生出无穷的私钥。
三、交易流程
比特币交易结构中含有比特币交易参与者价值转移的相关信息。每个比特币交易都是在比特币区块链上的一个公开记录。比特币的交易流程如下。
(一)创建交易
比特币合法交易的创建需要被资金所有者(们)签名。如果它是合法创建并签名的,则该笔交易现在就是有效的,它将被广播到比特币网络并被传送,直至抵达下一个登记在公共总账薄(区块链)的挖矿节点。
(二)发送交易至比特币网络
比特币网络是一个点对点网络,这意味着每一个比特币节点都连接到一些其他的比特币节点(这些其他的节点是在启动点对点协议时被发现的)。一旦一笔比特币交易被发送到任意一个连接至比特币网络的节点,这笔交易将会被该节点验证。如果交易被验证有效,该节点将会将这笔交易传播到这个节点所连接的其他节点;同时,交易发起者会收到一条表示交易成功的返回信息。如果这笔交易被验证为无效,这个节点会拒绝接受这笔交易且同时返回给交易发起者一条表示交易被拒绝的信息。
(三)交易的传播
每一个收到交易的比特币节点将会首先验证该交易,确保只有有效的交易才会在网络中传播,而无效的交易将会在第一个节点处被废弃。
每一个节点在校验每一笔交易时,都需要对照一系列的标准,例如交易的语法和数据结构必须正确;输入与输出列表都不能为空;交易的字节大小是小于MAX_BLOCK_SIZE等。这种交易节点包含有全部交易信息、可独立完成验证的方式称为全节点验证。
如果节点受条件限制无法保存全量区块链信息,可以选择只保存区块头信息,通过简易支付验证(Simplified Payment Verification,SPV)的方式使节点能参与验证,这样的节点就是SPV节点。由于SPV节点不保存完整的区块链信息,故不能独立地进行验证。SPV节点采用的是“支付验证”的方式,只判断用于“支付”的那笔交易是否存在于某个区块,并得到了多少的算力保护(多少确认数)。
(四)交易的结构
一笔比特币交易是一个含有输入值和输出值的数据结构,该数据结构植入了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。图1-1所示为交易的数据结构。

图1-1 交易的数据结构
比特币交易的基本单位是未经使用的一个交易输出,简称UTXO。UTXO是不能再分割、被所有者锁住或记录于区块链中的并被整个网络识别成价值单位的一定量的比特币。比特币网络监测着以百万计的所有可用的(未花费的)UTXO。当一个用户接收比特币时,金额被当作UTXO记录到区块链里。这样,一个用户的比特币会被当作UTXO分散到数百个交易和数百个区块中。
被交易消耗的UTXO被称为交易输入,由交易创建的UTXO被称为交易输出。
交易输入是指向UTXO的指针。想要使用UTXO,还必须提供与锁定脚本匹配的解锁脚本。通常来说,解锁脚本是一个使用者的签名,用来证明对这份UTXO的所有权。
表1-1为交易输入的格式。
表1-1 交易输入的格式

交易输出一般会创造一笔新的UTXO。也就是说,给某人发送比特币实际上是创建新的UTXO到这个人的地址,并能被他在以后使用。
每一个全节点比特币客户端,在一个储存于内存中的数据库保存全部的UTXO,该数据库也被称为“UTXO集”或者“UTXO池”。新的交易从UTXO集中消耗(支付)一个或多个输出。
表1-2所示为交易输出的格式:
表1-2 交易输出的格式

通过这种方式,一定量的比特币价值在不同所有者之间转移,并在交易链中消耗和创建UTXO。一笔比特币交易通过使用所有者的签名来解锁UTXO,并通过使用新的所有者的比特币地址来锁定并创建UTXO。
四、区块和区块链
区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。它可以被存储在文件系统或数据库中。比特币核心客户端使用Google的LevelDB数据库存储区块链元数据。区块间通过哈希运算被从后向前有序地链接在一起,形成区块链。区块在区块链中的位置可通过“高度”来表示,它代表当前区块与首区块之间的距离。区块是交易信息的集合,它由包含元数据的区块头和构成区块主体的交易所构成。区块的结构如表1-3所示。
表1-3 区块结构

在这当中,数据区块头部信息的HASH值是下一个新区块的HASH值的参考目标数;父区块的哈希值,用来与该区块的父区块形成链接;第二组数据是难度、时间戳和Nonce,与挖矿和工作量证明相关;第三组数据是Merkle树根,用来有效地总结区块中的交易;最后一项交易详情记录了该区块中所有的交易信息。
五、挖矿
挖矿是一种竞争性共识机制。矿工们通过反复尝试求解一种基于哈希算法的数学难题来竞争获得记账权,这一过程被称为“工作量证明”(Proof of Work,PoW)。成功求解的矿工会获得区块写入的权利并得到两种类型的奖励:创建新区块的新币奖励,以及该区块中所含交易的交易费。该算法的竞争机制构成了比特币安全的基石。比特币系统通过挖矿过程的分布式确认、校验以及全网收敛到工作量最大的区块链来保证全局状态的一致性,从而实现了去中心化条件下的分布式共识。
这一共识过程由以下几个步骤构成:
步骤1:节点独立验证交易。交易的独立校验详见前述关于交易流程的内容。
步骤2:构成区块。验证交易后,挖矿节点会将这些交易添加到自己的内存池中,区块中的第一笔交易是一笔特殊交易,称为创币交易或者Coinbase交易。这个交易是由挖矿节点构造并用来奖励矿工们所做的贡献的。新构成的区块成为候选区块。而后,矿工不断更换区块头的填充随机数并计算这个区块头信息的哈希值,看其是否小于当前目标值。如果小于,则表示构建区块(挖矿)成功,准备写入账本。
矿工在尝试挖掘新区块的同时,也监听着网络上的交易,当从比特币网络收到当前区块的消息时,挖矿节点停止当前的证明,准备下一个候选区块。
步骤3:校验新区块。当一个矿工成功构建一个区块后,他立刻将这个区块发给它的所有相邻节点。这些节点在接收并验证这个新区块后,也会继续传播此区块。当这个新区块在网络中扩散时,每个节点都会将它加到自身节点的区块链副本中。
每一个节点在将收到的区块转发到其节点之前,会进行一系列的测试去验证区块的正确性,确保只有有效的区块在网络中传播。节点将对该区块进行验证,若没有通过验证,这个区块将被拒绝。检查的标准包括区块的数据结构和区块包含的交易是否合法有效;区块头的哈希值小于目标难度(确认包含足够的工作量证明)等。
步骤4:添加新区块。一旦一个节点验证了一个新的区块,它将尝试将新的区块连接到累计了最大工作量证明的区块链中。
(1) Chaum D. Blind Signatures for Untraceable Payments[M]. Advances in Cryptology. Springer US,1983:199-203.
(2) Nakamoto S. Bitcoin:a Peer-to-peer Electronic Cash System[EB/OL]. 2008.https://bitcoin.org/bitcoin.pdf.
(3) 姚前.数字货币初探[M].北京:中国金融出版社,2018:189-198.
(4) Andreas M. Antonopoulos. Mastering Bitcoin[R]. 2015.