粗谈比特币:系统设计

本文试图从功能系统层面去理解比特币的设计理念,关于比特币的原理和细节只做选择性的说明,不完善的地方请参照比特币白皮书。不考虑具体实现细节。
可能影响理解的前驱知识:非对称加密、哈希算法

点对点的电子货币系统

要了解比特币系统,首先我们要清楚中本聪设计比特币的出发点是什么。正如白皮书的标题:Bitcoin: A Peer-to-Peer Electronic Cash System 所述,中本聪的设计的目标就是实现一个点对点的电子货币系统,更深入一点讲,就是发行一个去中心化的电子货币(中本聪的核心目标是*去中心化*,一切设计都是围绕这个中心的)。

(“点对点”不意味着“去中心化”,但去中心化理所当然要进入分布式的场景。目前看来,点对点或者分布式的实现形式似乎是达成去中心化的必要条件)。

虽然关乎比特币缔造者的追求,本文无意于讨论去中心化电子货币的现实意义。
一个去中心化的电子货币系统,首先是一个电子货币系统,然后它满足去中心化的特点。
广义上说,我们身边有许多电子货币系统,在我们使用支付宝、微信支付进行转账付款的时候,我们相当于在使用这些企业提供的电子货币系统了(只不过他们的代币是与人民币1比1兑换的)。抽象地讲,在假使有一个可信的中心的情况下,只要由中心保证货币的发行和按序正确地记录每一笔交易,我们就可以基于此搭建一个可信的电子货币系统。

电子货币没有实体,所以只需要记录每一笔交易,即确定一个全局的账本,就可以由此推出每个账户的余额。而对于每个账户实体的抽象形式,一个直观的方法是使用状态机,这样每一笔交易都可以看成是交易申请作为输入引起的状态机的状态转换,以太坊的货币系统即采用这种形式,详见以太坊白皮书。

简言之,一个中心化的电子货币系统,需要一个可信的中心发行货币,维护一个全局账本,并对每笔交易提供检查和记录。那如果是去中心化的电子货币系统呢? 从设计上讲,一个彻底的去中心化的电子货币,从货币的发行到交易的检查、账本的维护,理应统统交由一个由分布式节点(miner)组成的网络。可以说,所谓的*去中心*就是利用这些分布式节点去模拟一个理想节点,去完成中心化系统中可信中心完成的事情。这个理想节点的背后是一个个相互竞争的分布式节点,由此就可以达到去中心、去第三方信任的目的。
由此,对于一个去中心的电子货币系统,我们可以描绘这样一个雏形:一个货币系统通过分布式节点组成的网络去模拟“可信中心”,用户则向这个分布式节点网络发起交易。比特币系统
为了便于描述,本文将比特币系统划分为两个功能子系统进行介绍。一个在上层,面向用户的交易系统:功能近似于普通的电子交易系统,为用户提供交易服务;一个是在下层,面向分布式的服务器节点,目标是达成共识,提供对上层的服务支持。

比特币交易系统

本文将比特币面向终端用户(非miner),提供转账(交易)功能的功能抽象层次称为比特币交易系统。

账户模型

对于电子支付系统,一种*容易理解*的方法是用状态机去建模账户模型(与我们生活中的账户模型非常相似)。即每个账户用一个状态机表示,用状态的变化对应账户余额的变化。
通俗地讲,就是账户里有余额,交易的发生代表着账户间余额的变动。以太坊即采用的这种形式。
在这种设计里,只有“帐”,没有“钱”。只要记录下每一笔交易和所有账户的状态(余额),这个系统即可正常运转,并不存在一个价值(多少多少钱)的实体,没有“钱”的概念。
借用一种说法,这是一种*基于账户*或者说*账户为中心*的设计,称为账户余额模型。

现在的银行支付系统、证券交易系统,包括互联网第三方支付系统(比如支付宝等),其核心都是基于账户(account based)的设计,底层数据都是由关系型数据库(RMDB:Relation Manage DataBase)支撑。

出于某些原因,比特币的设计并不是基于账户的,而是基于价值的实体(比特币里的钱:UTXO)的。用大白话讲,比特币里的交易不是把多少钱从A划到B的账上;
而是A把多少钱,这个实体,实实在在地转交给B。这反而更符合我们的生活经验:拿着钱而不是存折去做生意。

比特币中扮演“钱”这个角色的实体叫 UTXO (Unspent Transaction Output),在下一小节再做介绍,我们暂时把它想象成一组有所有权的代码(可以当钱花)。

简言之,基于账户的设计,账户是一个基本概念,价值(钱)的流动只是账户余额的变化,价值没有实体存在;基于价值的设计,价值(钱)作为基本概念,价值的流动就是钱所有权的变化,所有权的主体近似于“账户”这个概念。
在比特币里,这个 UTXO所有权的主体我们称之为“地址”。比特币用非对称加密技术解决了 UTXO 的所有权的问题。实际上比特币的“地址”是一个公钥哈希。“地址”不是账户,不存在账户余额这个属性,它就是一个所有权的主体,类似于一个名字或者说标记,拥有者通过“地址”对应的私钥作为证明。每个UTXO上都会有这样的标记,表明这个UTXO的归属,拥有者在花费这个UTXO时凭借私钥证明归属。

非对称加密技术是一个现成的归属权证明的解决方案。可以用公钥作为标记,私钥作为证明。考虑到私钥的安全,比特币推荐使用公钥的哈希作为标记,实际上
“地址”就是这样一个公钥哈希。
比特币会在“地址”花钱时做检查,如果只收款,“地址”对外暴露的可以只有一个公钥哈希,但付款时必定要暴露完整的公钥。 基于一些密码学常识我们知道,通过公钥哈希去倒推公钥是不现实的,但从公钥计算私钥存在多项式时间复杂度的量子算法(是的,可以说中本聪考虑到了量子计算对非对称加密技术的威胁)。

不难看出,归属权只需要在发起交易时检查证明。比特币用“脚本”(script)扩展了多种交易形式的归属权证明,拓宽了交易形式的同时,为智能合约的发展提供了土壤。 当然,基于账户的设计在交易时同样要检查归属权。区块链上的所谓“智能合约”,其实就是对这种检查的拓展。

相比较与状态机建模中的“账户”,“地址”的设计无疑是相当简陋的,不过对于一个交易系统而言这已经足够了。但对于普通用户而言,由于UTXO和“地址”的一些特性,直接操作 “地址”的用户体验肯定是糟糕的。所以一般会在“地址”上新建一个抽象层,统一管理私人持有的所有“地址”,习惯称之为“钱包”(wallet),钱包是可以有账户机制的,钱包独立于比特币系统,只是一个辅助管理秘钥的工具。钱包客户端有好多种,官方版本为Bitcoin Core。

实际上,“地址”在使用过一次UTXO后,其公钥就已经暴露了。除了这个原因,出于更好的私密性的需求,比特币更推荐“地址”的一次性使用。

一个总结[1][2]

  • UTXO模型的优点(比特币为例):
    • 如果用户启用了新的地址用于转账和交易,新地址与原地址之间的关系很难被追踪,更好地保证用户的隐私
    • 无需维护余额等状态值。
    • UTXO是独立数据记录,可以通过并行极大的提升区块链交易验证速度。
  • 账户余额模型的优点(以太坊为例):
    • 可以快速获取账户的余额,而比特币需要将指定地址所拥有的所有UTXO中的未花费交易总值整合。
    • 节省空间,因为每笔交易只有一个输入一个输出。
    • 由于在区块链层级没有*币的来源*这一概念,很难实现对来源的追踪和回溯。
    • 因为创建交易时不需要对过去的 UTXO 进行签名,可以从任何一个时间点开始同步区块的状态,利于编写轻量级客户端。

无论是 UTXO 模型还是账户余额模型,都能够很好地解决区块链世界中的*安全*问题,保证交易的合法,从原理上杜绝一些可能的攻击行为,实现原理的不同其实也只是由于出发点不同,在设计时权衡了利弊。

价值流动

UTXO 链 简单的状态机 交易=价值的流动 交易 脚本

比特币分布式服务系统

检查 脚本 共识 PoW 人头投票与拜占庭

后记

断断续续写了大半年,很惭愧,先整理一部分,希望早日填坑。
本文只代表个人观点,欢迎交流指正。转载请标明出处。

  • TODO: 2.2 价值流动, 3 比特币分布式服务系统 2018/11/12