解构区块链
上QQ阅读APP看书,第一时间看更新

2.2 比特币基本概念

比特币系统的核心是一种区块链(Blockchain)架构。密码学技术的综合运用构造出区块链,比特币的记账等功能依靠区块链来实现,比特币运行所需要及生成的所有数据都记录在区块链上。

2.2.1 比特币区块链

比特币区块链由区块(block)和链(chain)串联构成,如图2.2所示为比特币区块链的基本结构。

图2.2 比特币区块链基本结构示意图

区块就是一个数据块,由区块头(block header)和区块体(block body)两大部分组成。区块头为定长80字节,用于存放控制信息;区块体为可变长度,用于存放交易记录。区块体与区块头之间存在内在的数字化联系,不妨称之为一种数据缠结(data tangle),对变化十分敏感,区块体内容哪怕发生1比特的改变,区块头都能够检验出来。

链是相邻两个区块之间的数据关联关系,与区块头、区块体之间的数据缠结类似,其作用是当上一个区块头有任何变化,下一个区块头都可以检验出来。以此类推,欲篡改一个区块的内容,就必须篡改之后所有区块头,显然计算工作量很大,所以越靠前(越早)的区块就越安全。

从编号为0的第一个区块(即创世区块)开始,所有区块依次以链相连,在时间轴上按序排列,形成唯一的一条区块链。每经过一个区块生成周期,就生成一个新的区块,区块链就这样不断延长。比特币系统规定了区块生成周期为10分钟左右,之所以不能完全固定时间,是因为区块的生成受到一些不定因素的影响,例如运气。

既然区块是用于保存交易记录的,又采用数据缠结方式固化了内容,而且各区块顺序相连,不妨将比特币区块链想象为一本账本,如图2.3所示,一个区块就相当于一页,上面记录了各种资金往来交易,内容不能修改,每页都被编上页码,不乱序、不缺页,然后被牢牢地钉在一起,每过10分钟被钉上新的一页。

图2.3 比特币账本示意图

2.2.2 比特币生成

比特币系统采用如下规则生成比特币:当一个新的区块被生成出来并被检验无误后,系统认为由于该区块收纳了一系列交易记录,付出了记账的劳动,就奖励该区块生成者若干数量的比特币。因此:

• 比特币是由系统自动生成并发放的;

• 比特币是对记账有功者的奖赏;

• 比特币是随新的区块同步增加的。

比特币系统初始上线时,随着每个区块的产生可同步产生50比特币的奖励金,随后以4年为奖励周期,奖励金数量依次减半。以每年365天计,第一个4年周期的比特币发行数量为:

比特币发行总量可计算为(设i为周期序号,i=0,1,2,…):

如图2.4所示,新比特币的生成增量呈不断减半下降趋势。经过32个周期(即128年),每个区块奖励比特币的数量下降到50×0.532BTC≈1.16聪,由于1聪为最小计量单位,下一周期的0.58聪奖励因不足1聪而无法发放,此时约为2140年,比特币停止增加,数量达到最大值约2100万比特币(即第一个周期发放数量的2倍)。

图2.4 比特币生成数量变化示意图

“我想‘倒过来’看比特币的发行。”Alice的思维方式往往出其不意,“假定有一个保质期100多年的2100万克重的蛋糕。先切出一半,在4年内按固定周期、固定分量奖给考试第一名的学生;下个4年,在剩下的蛋糕上切出一半来奖励学生,但每次奖励的分量减半了;依此类推,最后无法再切分了,差不多就算分完了这个蛋糕。”

Bob听得一愣一愣的,虽然认同这个说法,还是忍不住揶揄道:“保质期100多年,外加考试第一名才有的吃,听上去一点食欲也没有。”

比特币系统采用这种发币增量阶梯式下降方式具有明显的作用:初始时令比特币数量快速增长(前8年已发放总币数的3/4),既以高额奖励达到吸引更多人加入的目的,又使得有足够可流通的虚拟币数量;而逐步放慢增速,则有利于控制新币发行节奏,避免过度投放新币带来的通货膨胀等问题;总量限制一方面是最小币值、发放规则所必然造成的,另一方面也是出于防范无限制投放引发的货币贬值等问题。至于是否会造成通货紧缩等问题,还需要经济学家来回答。

2.2.3 比特币交易

发行了新币,就要能够进行交易,货币才有价值。比特币采用了发行、交易统一的独特方式,降低了系统复杂性。

交易(transaction,Tx)一般是指资金的流转,即从付款方(持有方)支付给收款方。无论是两方的交易、还是多方对多方的交易,都可描述为一次货币持有者属性的转移。

发行新币则被作为一次特殊的交易(称为发币交易),付款方是“系统”,或可理解为没有普通的付款方,而是收款方“自动”收到一笔奖励金。

比特币系统设计了如图2.5所示的交易记录的结构,由交易输入(Tx input,记为Tx_in)、交易输出(Tx output,记为Tx_out)、交易条件三个要素组成,表示在符合条件的情况下一个或多个付款人支付给一个或多个收款人。需要注意的是,交易输入、输出的含义与人们平时惯用的“收入是钱的输入、支付是钱的输出”恰好相反(交易输入指的是付款方、交易输出指的是收款方),却完全符合计算机技术的用法,把交易作为一个事件(模块)来看待,那么输入就是来源,从交易行为而言,来源就是支付的钱。

图2.5 比特币交易简化结构

Bob凝视着比特币交易结构图,忽然嚷嚷起来:“Alice,你发现没有,交易居然没有说明金额!付款方到底支付了多少钱?这都不说清楚还算什么交易?”

Alice说:“对哦,难怪我看了也是怪怪的,总觉得什么地方不对劲!而且好像也没有说明交易时间,是不是交易信息不够完整啊?”

比特币交易吸取了复式记账法的思想精髓:清晰体现钱的来源和去向,且收支平衡。据此比特币系统制定了以下两条规则(如图2.6所示):

(1)规则一,当前交易输入来自各付款方以前的交易中获取的收入(交易输出),且当前交易输入总和等于以前的相关交易输出总和。

(2)规则二,当前交易输出总和等于当前交易输入总和。

图2.6 比特币交易多输入输出示例

Bob不仅美美地收到了11.20BTC,而且疑问也得到解释。交易金额并非没有,而是被规则一所隐含了。换句话说,只要是以前的相关交易,收入的比特币都要在当前交易中花完。每个付款人必须要拿得出足够的钱才能在当前交易中付款,一笔前交易收入的钱不够,就要用多笔来“凑足”。支付后多余的金额,则通过“支付给自己”(即找零)来解决。

这样的“交易链”会一直持续下去。一个人可以在不同的交易中获得收入,这些收入要么在某次交易中被全部用掉了(找零体现为另一个交易),要么还没有用过。可见,每个人的总资产就是所有“未花出去的收入”,即未花费的交易输出(Unspent Tx Output,简称UTXO)。因为资产分散在历史上不同的交易中,所以,在比特币系统中没有常规的余额(balance)或钱包(wallet)的概念,而是以UTXO来表达,需要搜索所有交易才能统计出来。此外,一个人可以拥有多个虚拟“身份”,除自己外,没有人知道图2.7中的P1P8是不是属于同一人的。

如图2.7所示,交易间形成错综复杂的网络,但具有很强的规律:每个交易必有输入;交易链一定是时间递增延续(不会花费未来的收入);一个交易输出只能传递给唯一的交易(不可拆分支付,也不可双重支付)。例如,P1用户有5个交易的输出未被花费,交易链停止延伸形成端点,其总和即为P1的UTXO,同时也是所谓的余额。假如P1要花钱,就只能用这5个之内的一个或多个输出,且不能超过UTXO总额。

图2.7 比特币交易链及UTXO示意图

Alice就不如Bob幸运,不但在一个莫名其妙的交易中付了2.83BTC,所提的疑问还没有答案。主要是关于“交易时间”的解释实在没那么简单。

比特币系统认为一个交易如果没有通过共识机制得到全网验证、认可并固化,则其很易被放弃、毁约、篡改,是脆弱而不稳定的,只有当交易被收纳到比特币账本页上并且区块入链,才能真正确认这笔交易的成立。因此,UTXO只认可入链后的交易,那么所谓交易的时间信息实际上是借用交易所在区块的生成时间。

比特币系统还设计了“交易条件”的选项。交易双方可以商定一个交易为“无条件生效(立即生效)”,也可以商定一个交易“生效时间(锁定时间)”作为条件。如图2.8所示,生效时间可为时间戳,或为区块链“高度”(区块序号),即在到达这个生效时间前,交易不会被收纳入链,处于被锁定状态,是无效的,交易输入对应的前一交易输出被冻结,当前交易输出同样被冻结不能使用,直到到达生效时间并上链确认后,才成为一条有效交易。在这种情形下,交易记录中的交易时间信息也就没有太大必要了。

图2.8 比特币交易的生效条件示意图

为弄清比特币交易的产生与交易的确认之间的差异,Alice还需要寻求Bob的协助来演绎。Alice扮演Java咖啡店老板,Bob扮演一个爱贪小便宜的滑头顾客。

“老板,来一杯拿铁,打包带走。”Bob总共只有0.4BTC,但谁让他是“月光族”呢!

“好嘞。请付0.28BTC。”Bob刷了手机二维码,显示支付成功。一笔比特币交易被系统生成了。“请稍等,咖啡做好后马上给您送到座位上。”Bob知道比特币交易虽然已经生成,但可能要十分钟(或许更久)后才会被收纳进区块链,还知道咖啡店不可能等上这么久才去做咖啡。这不,Alice已经开始做他的拿铁了。于是Bob没有坐下,转身到隔壁凯特快餐店,支付了0.3BTC买了一个比萨。几分钟后,Bob端着拿铁和比萨走了。

当晚Alice和凯特盘点账目时,其中一人会发现交易并没有被确认,出现了坏账。Bob利用“时间差”成功进行了“双重支付”。

2.2.4 比特币地址

每个人在现实世界、虚拟空间都拥有一些标识,用来进行唯一性定位。例如,身份证号码、快递收货地址、手机号码、银行账号、电子邮件地址、电脑MAC地址、互联网IP地址、即时通信号码等。这些标识可以是自然语言、编码字符串或二进制数据。比特币系统中同样需要一种标识,用来唯一性识别转账资金(或奖励金)的收款人以及验证付款人确实是UTXO的主人。

现实世界的个人标识通常具有实名性,可以明确指向一个真实存在的人或地点,即便进行伪装,总会残留下蛛丝马迹。虚拟空间里则更为复杂,金融系统、通信运营商等出于安全考虑强制要求实人鉴别,但电子邮件、论坛账号等往往是匿名的,有些人更是采用频繁更换上网终端、伪造设备地址、多级跳转等手法隐藏自己的踪迹。深网(DeepNet)即运用洋葱路由(The Onion Router,TOR)机制,在互联网上构造独立的通信路径和多重加密传输信息,从而形成一个非常隐秘的网络空间。

比特币采用的是匿名交易的体制,为此运用现代密码学技术设计了一套既可保障资金安全又可避免暴露身份的方法。

比特币分配给用户一个唯一性的地址(Bitcoin address),别人可以把货币转账到这个地址,而持有者可以用这个地址来使用货币。一个人可以拥有并使用多个比特币地址,但交易的每个输入或输出只能用其中之一。

如图2.9所示,比特币地址是对加密算法的密钥进行转换并编码而来,由26~35个数字和字母(分大小写)组成,一般以1或3开始。例如:

• 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM

• 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2

• 3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy

图2.9 比特币地址与秘密钥匙关系示意图

比特币地址与其持有者的真实身份没有关系,用户甚至可以离线生成比特币地址。用户暴露在比特币网络上的只有地址,没有账号。如果要付款,转账到这个地址就好;如果要收钱,用这个地址的钱进行支付转账,能成功付款就好。

因为用户不需要将比特币地址与“账号”进行关联,这就最大限度地排除了账号注册和登录可能留下的身份印记。如图2.10所示,为了正确识别一个地址的持有者,比特币系统在生成地址的同时,给予用户一个对应于该地址的唯一“秘密钥匙”,当用户需要动用某个地址的UTXO来付款,就要用自己掌握的“秘密钥匙”生成一份“证明文件”,表明这笔钱的拥有者“名分”,其他用户可以用此“证明文件”来验证真伪。如果没有持有这个“秘密钥匙”,无法生成“证明文件”,就无权动用这笔资金。

图2.10 比特币系统身份隔离机制

“秘密钥匙”几乎是比特币拥有者与比特币系统的唯一联系,可见其十分关键。然而,成也萧何败也萧何,由于比特币系统的匿名性,一旦“秘密钥匙”因电脑损坏而遗失或被破解,则根本不存在“挂失”“找回”等恢复途径,相关联的UTXO就再也无法认领。就是出于这一原因,比特币网络中有大量的比特币(永远不知道是哪些、有多少)好像断了线的风筝,失去了控制、找不到主人,永远无法被花出去了。

2.2.5 比特币网络

比特币系统采用P2P对等网络技术构建,自成完整体系,形成虚拟币产生、保存和交易的闭环。比特币系统运行在互联网上,利用网络实现信息交换,构成一个相对封闭、独立的应用网络。

如图2.11所示,比特币网络由安装了比特币系统软件的比特币结点(node)联网组成。所有比特币结点完全一致、相互平等,没有管理中心、控制中心,也没有特权结点之分。每个比特币结点上保存了完整的比特币区块链,形成分布式、全冗余的数据存储体系。这种“全量复制”存储方式的优势在于:

图2.11 比特币网络和结点示意图

(1)每个结点可不依赖于其他结点,甚至在离线的情况下,都可以本地化查询所有数据,同时避免了许多低效的网络访问。

(2)新加入的结点可从任意现有结点上获取完整区块链数据。

(3)差错(或造假)数据很容易运用相互比对和共识机制来发现。

可见,比特币区块链的全冗余存储是保障数据一致性、安全性的重要措施之一,属于用空间换时间(效率)、换公正(可信)的方法。在小规模系统中完全不成问题,然而当系统庞大到一定程度,全冗余不可避免会带来巨大的资源浪费,特别是随着区块链不断延伸、网络结点日益增多、交易数量逐步上升,区块的账本空间、结点的存储空间都显得不堪重负。这里比特币系统又陷入了矛盾和悖论之中:体系自然越持久、越兴旺越好,而由此造成的数据堆积却会严重拖累、拖慢体系的发展,为此又不希望体系太繁荣。

“我只要一朵云彩,却要拥有整片天空!”Alice感慨道。

“天空你只是代为保管的。”Bob不太有诗情画意,说的话经常会煞风景。Alice不为所动,继续忧心忡忡:“比特币系统旨在保持‘绝对’的平等,但问题是我只有半个比特币,存储任务却和拥有一万个比特币的人一样重,你说这是不是另一种不平等?”

“这大概是平等的‘代价’吧?”Bob以问题回答问题。

Alice点点头,“很难想象,我的小电脑中塞进一家银行的所有用户数据和交易数据会是什么情景。”

比特币结点之间通过网络协议相互通信,例如发布交易记录、公布新区块、表决采纳区块入链等。比特币结点之间的对等特性使其无法依赖服务器等中心控制系统,所以比特币结点都是与有限数量的“邻居”即相近的结点交换信息。

新上线结点的第一要务是“找邻居”,否则该结点就是游离在比特币网络之外的孤点。初始状态下“找邻居”其实就是从现存网络中获取其他结点的IP地址或域名,实现方法有多种:

(1)早期的比特币软件利用IRC协议,自动连接网上聊天室,得到其他用户公布的IP地址清单,然后手工配置初始邻居地址。但这一方法目前已不再采用。

(2)通过DNS(域名解析服务),利用比特币软件内置的若干个“域名种子”(DNS seed)结点解析并自动获取本地的其他一些结点的IP地址。域名种子的解析内容由可靠的开发者进行维护。

(3)用查询命令连接已知的种子结点或可信结点,请求获取其他结点的IP地址。

一旦配置好了邻居结点,就标志着新结点成功连接到比特币网络。如图2.12所示,每个比特币结点与若干个其他“邻居”结点保持通信关系,最终形成复杂的网形网络。

图2.12 比特币结点关系和信息广播示意图

当一个结点需要发布区块或交易信息时,会采用如图2.12所示的全网广播方式。广播实现机制为洪泛法(flooding),即结点将信息发送给3到4个邻居,邻居结点继续转发给3到4个邻居,理想情况下(无转发循环)将形成一棵生成树(spanning tree),到达结点数为∑4i,一般几秒钟内就可覆盖全网所有结点。