何必非要 “ 区块链 ”——浅析央行数字货币基于UTXO模型的设计路线

《何必非要 “ 区块链 ”——浅析央行数字货币基于UTXO模型的设计路线》

作者 黑石Kingslayer

央行数字货币DCEP喊了几个月的“呼之欲出”但似乎总是千呼万唤不出来。事情往往是这样,想象的简单,但执行起来,又是另一番光景。就像现在的区块链热一样,本意是技术革新绕过现有货币格局推进人民币国际化,监管当局现今却忙于辟谣和打击诈骗。

笔者近期拜读了万向首席经济学家邹传伟为财新专栏撰写的DCEP分析文章,文章推测DCEP将使用基于UTXO模式的中心化账本,独毕我忽有茅塞顿开之感。

(1)何必非要去中心化

谈到区块链,我们往往联想到不可篡改、去中心化和可追溯三个特性。区块链的概念源自于Bitcoin,以中本聪为代表的密码朋克巧妙的将原有的密码学技术整合,引入博弈论的技巧进一步优化了分布式通信系统中的拜占庭将军问题。密码天才们的思想是叛逆的、是极致的,也往往anti-politic,从这点出发,区块链天生“反骨”,演变到现在,似乎区块链天生就必须去中心化,与现有的中心化、寡头垄断化互联网对立(从这点出发,笔者最欣赏Gavin Wood,关于Web3.0的构想简直令人神往)。故而当前主流公链也纷纷标榜社区的自治性和公平性,通过白皮书阐述自己如何通过优化共识机制和博弈机制来避免独裁和作恶,代议制,这种最原始的民主权利形式对于崇尚自由、渴求表达的互联网公民来说,有着无限的吸引力。

但上述这些不是我们近期在新闻中、在媒体上讨论的区块链技术表现形式。笔者对于从政府主导区块链发展这件事情上,一开始持有消极的态度,也一直围绕一个核心问题在思考:政府层面区块链的应用如何有效设置出块节点,在节点集中且非中心化的条件下,如何保证区块链不会发生硬分叉?节点间又是否需要博弈呢?这种思想是将去中心化的共识机制与区块链簿记账本技术绑定在了一起,现今想来,何必非要去中心化的共识,何必考虑节点的博弈,为何不能放下“骄傲”呢,这些在当前的区块链政府应用中,是最不值得考虑的因素。一旦舍弃了共识的复杂度,TPS会实现指数型跃升,唯一需要考虑的是合理设置有限个节点实现数据冗余并保障节点安全性避免硬分叉(就央行数字货币而言,如何确认交易发生的最终性以及是否延续最长链原则,也是需要思考的问题)。

(2)关于UTXO的阐释

我们回到央行数字货币和UTXO上来,出于对央行数字货币基于UTXO路线的阐述,我们先阐释UTXO。UTXO,Unspent Transaction Outputs,意思是未被花费的交易输出,它是Bitcoin底层区块链簿记技术的概念之一。

Transaction本身

Bitcoin的区块链账本最主要记录的内容就是transaction,交易一旦被打包进区块并通过共识机制上链后(一般需要6个区块高度的确认),交易的最终性就得到了确认。在传统的账户交易体系中,资金的持有量以账户的余额形式体现,资金的转出和转入直接体现为账户余额的增减,这种形式非常直观,几乎所有的Bitcoin钱包也参考这样的形式展现。然而,在底层的区块链账本层面,交易发生的细节却截然不同。

在Bitcoin的区块链系统中,transaction是一组被传递的脚本代码,代码包含transaction input和transaction output两部分,第一笔产生Bitcoin的交易为创世区块的coinbase transaction(实际上每个区块被确认时,区块的记账权所有人都有权发起一次coinbase交易,并将挖掘出该区块的奖励发送给自己)。这种特殊交易的input称为coinbase,比较特殊,不在此文的分析范围,因此本文在后续行文中提到的交易都不包含coinbase交易。第一笔交易的output在被下一笔交易消费前就成为了Bitcoin区块链上的第一笔UTXO。

除coinbase交易外,普通交易的input通过哈希指针(指明UTXO所在交易的哈希值及其序号)指明了哪笔UTXO将被消费,并包含了该笔UTXO的解锁脚本来验证所有权。

交易的output包含两个方面,一是该output中Bitcoin的数量,通过最小单位satoshis来表示,二是与input中解锁脚本相匹配的锁定脚本。

基本的概念

我们还是回到UTXO上来,实际上UTXO是全部尚未被某笔已发生交易中的input所引用的output的集合。简单来说,就是如果一笔交易的output尚未被另一笔交易(已被确认)的哈希指针引用,即未被“消费”,则该output就可以被称为UTXO。Bitcoin区块链的全节点会追踪整个区块链网络中的全部有效的UTXO,形成UTXO的集合(UTXO set)并进行保存和动态更新。任何一笔有关Bitcoin交易的发生,都意味着UTXO集合的变化,也就触发了全节点中UTXO set的更新。当我们说用户的钱包收到一笔Bitcoin转账的时候,实际上是钱包在区块链中识别到了一笔与该账户密钥对应的UTXO,该账户的私钥可以对该UTXO进行签名并以此作为transaction input的前提构造新的交易。而钱包中某个账户所持有Bitcoin的余额,是该钱包在区块链账本中搜集到的所有可以被该账户“花费”的UTXO的集合。

UTXO所包含的的Bitcoin数量

在Bitcoin的币值单位表示方面,理论上Bitcoin的币值可以精细到小数点后八位。一笔UTXO所包含的Bitcoin数量在构造交易的时候被确定,一旦交易生成,该数值便无法再更改,UTXO只能作为整体被消费,不能拆分消费。我们可以将UTXO比作面值不同的纸币,纸币可以被兑换为更多的小面值纸币,满足不同消费需求。

考虑如下场景(单一input,多个output),如果我们需要支付1Bitcoin,但我们只有20Bitcoin的UTXO,我们将构造这样笔交易:消费20Bitcoin的UTXO,产生两个tranaction outputs,一个包含1Bitcoin支付给目标方,另一个包含19Bitcoin支付给你自己。这种过程就像是付出了面值为20元的纸币,兑换成面值1元和19元的两张纸币,1元用于支付,19元自己留存。

考虑另一场景(多个input,单一output),如果我们需要支付5.5Bitcoin,而我们恰巧有2个2Bitcoin的UTXO,1个1.5Bitcoin的UTXO,则将上述三个UTXO作为输入,产生一个5.5Bitcoin的输出。

在实际操作中,用户只需要输入需要支付的Bitcoin数量,其余关于UTXO的分拆和组合是通过钱包自动进行的。随着交易的不断发生,不断有旧的UTXO被消费并移出全节点的UTXO set,又有新的UTXO被生成并加入UTXO set,因此Bitcoin的价值也随着交易的发生在不同账户地址间转移。

(3)进一步的深入思考

关于链上数据可追溯。通过上一节UTXO模型的阐述,可以想见,如果DCEP采用UTXO模型,则任何一笔DCEP的UTXO都可以定位到其所在的交易,进而通过Input中的哈希指针和序号定位前一步的UTXO,一直向前追溯直至coinbase交易。因此,这就形成了一条资金链,任何一单位的DCEP自其由coinbase交易产生起,其转移的形式和转移的目的地在区块链上都是清晰可见的,这就是数据的可追溯。

新币和旧币的问题

一旦采用了基于UTXO的模型,DCEP就会涉及到新钱和旧钱的问题,所谓钱的新旧,就是指一单位DCEP价值其所涵盖的UTXO历史的长短。举个例子,如果你的钱包收到了1DCEP,实际上你是拥有了包含1DCEP的UTXO,这个UTXO所包含的1DCEP的价值可能来自于很多小单位UTXO的组合共同作为transaction的input,也可能是单个大额的UTXO拆分而来,无论如何,上述前一步的UTXO又与再前一笔的UTXO产生联系,因此你此时拥有的1DCEP的价值是通过很多历史的UTXO传递而来的,这就像纸钞经过了很多人的手才到了你的手里,此时你手里的钱是旧钱;考虑另一种情景,如果你刚刚拿到的1DCEP的UTXO,是通过coinbase交易产生而来,或者距离coinbase交易仅有几步的追溯,那么你手中的这1份DCEP的UTXO历史就短,此时的钱,是新钱。

为什么要区分新钱和旧钱呢?钱越新,其关于UTXO的历史越短,这笔DCEP经过非法交易或者灰色领域的可能性就越小,就越干净,因此我们都喜欢新钱,排斥旧钱。考虑到市场上劣币驱逐良币的原则,新币就会被人们储藏起来逐渐退出流通,最终充斥在市场上的就会是“锈迹斑斑”的旧钱。在实际运行中,其实我们不太需要考虑这些问题,因为我们看不到区块链链上的内容,展现给我们的只是钱包上的数字而已,需要考虑这些的,往往是DCEP节点参与者的金融机构。

后记:最近时间多些了,文章更新的频率也会更快些,感谢一直默默支持的朋友,每一次的阅读,对我来说,都是莫大的激励,欢迎公众号留言,共同探讨未来、发现未来。

点赞