文/中国人民银行上海总部张若雪
金融风险的产生,很多时候是因为资金去向不明。为了追踪资金的流向,加强监管是重要方面,如要求金融机构对资金单独建账,禁止开展资金池业务,禁止资金多层嵌套等。而这又牵涉到监管措施的落实。如何监督金融机构的行为,确保其如实上报资金流向?如何将一笔资金在不同账户之间的流转拼成一幅完整的图像?如何高效处理海量的资金流转数据,从中发现规律和问题?监管无疑将面临巨大挑战。那么,能不能利用技术手段解决这个问题,使得一笔资金的交易流转过程,清清楚楚、不可篡改、无限可穿透地呈现在监管面前呢?UTXO和区块链提供了可能的实现路径。
UTXO:基于交易的记账方式
UTXO是一种全新的记账方式,它基于交易,与基于余额的现行记账方式有本质区别。UTXO的全称为Unspent Transaction Output,是一个起源于比特币的概念,直译为“未花费的交易输出”。“输出”可以理解为将资金移至新的账户,与“输出”对应的概念是“输入”,“输入”是指资金的来源,通常是前一笔交易的“输出”。
举例来说,Alice的账户上有1000元,她要向Bob转账200元。现行记账方式一般是这样做的:(1)银行检查Alice的账户余额是否充足,如果充足则执行下一步;(2)将Alice的账户余额减少200元,将Bob的账户余额增加200元;(3)转账交易完成。
采用UTXO记账,一笔交易的输出就是另一笔交易的输入,转账是将资金从输入移至输出。以上面的例子说明。Alice要向Bob转账200元,她的账户现在有1000元,来自上一笔交易,是Joe向Alice支付的一笔劳务费,这就是一个“未花费的交易输出”。Alice使用这个UTXO作为输入,移到Bob的账户,这笔交易产生两个输出,分别是支付给Bob的200元和返回的800元找零:对Bob来说,这200元就是一个UTXO,来自和Alice的交易;对Alice来说,这800元找零也是一个新的UTXO。以此类推,Bob可以用这个UTXO作为输入,与Carl进行交易。
上面的例子说明了UTXO的另一个重要特点:UTXO可以是任意值,因为一笔资金交易可以是任意数额,但是它只要被创造出来了,在交易中就是不能分割的。我们可以将UTXO理解成一枚任意面额的硬币,硬币是不能切成两半使用的;如果这枚硬币金额太大,它仍会被当做一个整体支付给对方,但会产生找零;如果这枚硬币金额太小,那就再拿出几枚硬币以凑足交易金额。
采用UTXO记账,随着资金从一个账户移至另一个账户,形成了一条清晰的资金交易链(图1中的实线箭头)。这条资金交易链不会随着交易层次的增加而模糊,因为每一笔交易都有唯一的编码,交易编码把当前交易的输入和前一笔交易的输出衔接起来,这样一层一层清晰记录着资金从哪里来、到哪里去。为了叙述方便,我们把前一笔交易叫做“父交易”,当前交易是前一笔交易的“子交易”。一个子交易只有唯一的父交易,而父交易一般有两个子交易,分别是输出和找零。为了保证每一笔交易的编码都不重复,只需要让编码有足够的长度。
总的来说,现行记账方式下,账户像个水池,着重记录水位升降,资金进入账户就像水流入水池,流入水池的水全部混为一体,没有办法将不同来源的水区分开来,除非为不同来源的水分别建立水池,也就是为每一笔资金交易单独开设一个账户,这是很难做到的。现行记账方式可以显示账户之间的关系,就像水池之间有管道相连(有时这个管道也不清晰);但是无法跟踪一笔资金在不同账户之间的流转,就像把一杯水倒入水池以后,这杯水最终流向哪里很难判断。特别是,随着交易层次的增加,一笔资金流过多个账户以后,去向哪里就更难判断了。
UTXO记账方式下,账户像个存钱罐,一笔资金就是一枚硬币,每一枚硬币不但金额不同,而且具有唯一的交易编码,交易编码记录着这枚硬币的来历,因此,在这个存钱罐中,硬币之间是可以清楚区分的,每一枚硬币的交易历史都能追溯到源头。当这个账户向另一个账户转账时,账户不但记录余额变化,而且会记录使用了哪些硬币,转账交易一旦发生,账户之间的交易历史就会被记录到所使用的硬币上。因此,不同来源的资金之间不会混同,资金的流转无论经过多少层次,它的交易历史和流向都是清晰的。
资金穿透记账系统的架构
UTXO将交易前后衔接,随着时间的进行,一笔资金会在不同的银行账户之间流转扩散,因此,支持UTXO记账的系统应该是顺序读取和随机插入速度快,且能够将不同银行的交易信息高效组合起来。满足这个要求的数据结构是链表,区块链就是一种链表。把UTXO与区块链及加密技术结合,可以构造出这样的资金穿透记账系统,它不但能高效处理资金交易,清晰记录资金的流转全貌,而且能确保银行和客户的隐私不被泄露。这个记账系统的架构特点为:UTXO记账,节点分层,中心共识。
图2是这个系统的整体架构,全网节点分为三层:记账节点、区域节点、中心节点。
所有接入这个系统的银行,除了中心节点以外都是记账节点,一些记账节点同时还充当着区域节点;每个记账节点都有一个全局总账副本,记账节点以此为基础,采用UTXO记账方式,记录本行账户发生的资金交易;交易一旦发生,就将交易信息向全部区域节点广播。
区域节点经中心节点授权,由若干个记账节点充当,区域节点负责收集、校验记账节点广播的交易信息,并将通过校验的交易信息向其它区域节点转发;同时,每个区域节点都对应着一群记账节点,每隔一段时间,区域节点就把这群记账节点广播的有效交易,打包生成“分时区域账本”,并提交至中心节点。
全网存在一个中心节点,只有中心节点参与形成全网共识;中心节点把区域节点提交的分时区域账本进行汇总组装,生成这一段时间的“分时全局账本”,把分时全局账本前后有序链接,生成“全局总账”;全局总账是所有记账节点的最终共识,中心节点向记账节点发布全局总账,作为记账节点下一时间生成UTXO交易信息的基础。
下面从记账节点开始具体予以说明。
记账节点生成交易信息并向区域节点广播
继续采用上面的例子,Alice在A银行开户,Bob在B银行开户,Alice要向Bob转账,步骤如下:
(1)Alice向A银行提出转账申请;
(2)A银行检查最新的全局总账副本,看Alice的账户上是否有足够的UTXO,如果足够则执行下一步,不够则拒绝交易申请;
(3)A银行向Alice提供账户上的UTXO列表,由Alice选择使用哪些UTXO进行交易,选定以后Alice用自己的私钥进行数字签名,提交给A银行;
(4)A银行用Alice的公钥验证其数字签名,验证无误后用A银行的私钥对这笔交易进行数字签名,并向所有区域节点广播这笔交易。
表1列出了UTXO交易信息的结构。
对账户实名信息进行哈希运算的算法,由中心节点统一选定。由于中心节点存有所有账户的实名信息,因此中心节点能将账户实名信息及其哈希值一一对应起来。也就是说,只有中心节点能看到资金在账户之间的流转全貌,各个记账节点通过全局总账副本是看不到账户实名信息的,他们看到的只是资金在账户哈希值之间的流转。
2.区域节点生成分时区域账本并向中心节点提交
记账节点生成UTXO交易信息后,向所有的区域节点广播,记账节点之间不广播交易信息。区域节点收到记账节点广播的交易信息后,首先验证该交易是否有效,再将有效交易向其它区域节点转发。在记账节点和中心节点之间设立区域节点,目的是通过分片充分利用区域节点的运算能力,提高全网处理速度。区域节点之间互相转发交易信息,使得每个区域节点都能收到所有记账节点的交易信息,目的是防止个别区域节点出现故障而导致信息丢失。
区域节点判断交易有效的标准是:记账节点的数字签名无误;每一个输入引用的UTXO必须存在于全局总账中,并且没有被花费;输入值的总和小于输出值的总和,等等。区域节点会把有效交易放到“交易池”中(图3),交易池用于暂存尚未加入全局总账的有效交易,这些有效交易将在以后加入全局总账。
每一个区域节点都对应着一群记账节点,虽然一个区域节点接收转发所有记账节点广播的交易信息,但它在生成“分时区域账本”时,只对所属记账节点“负责”。每隔一段时间,区域节点从交易池中将所属记账节点广播的有效交易打包,生成“分时区域账本”,并提交给中心节点。
3.中心节点生成全局总账
基于UTXO和区块链的资金穿透记账系统,实际上是一个分布式系统,接入这个系统的所有节点,都在生成和记录交易信息,这些交易信息的汇聚构成全局总账。各个节点的全局总账保持一致,是这个系统正常运行的根本所在。
这个分布式系统可以采取三种做法,让各个节点对全局总账达成一致。第一种,节点绝对扁平,全网所有节点一律平等,每个节点都向全网广播交易信息,并记录全网所有节点的交易信息,全网节点通过共识算法达成对全局总账的一致。第二种,节点之间分层,比如选出一部分节点,让他们代表全网节点对全局总账达成共识,他们达成的共识就是所有节点的共识。相比于第一种架构,现在参与共识的节点较少,同等条件下参与共识的节点越少,达成共识的速度就越快。第三种,就是本文提出的只有一个中心节点参与形成全网共识,我们把它称为中心共识。
这个系统之所以采用中心共识,目的是提高系统处理速度,以满足海量交易的需要。
(1)中心共识:只有一个中心节点参与形成全网共识
分布式系统面临的最大难题是如何保持一致,即在多个节点同时记账的情况下,最终以哪一个节点的账本为准,或者说如何达成让所有节点都认同的结果。分布式系统为实现一致所采用的方法叫做共识算法。根据FLP定理,在异步分布式系统中,不存在适用于任何场景的通用共识算法。现实中分布式系统都是异步的,因此针对不同的分布式系统,为实现一致需要设计不同的共识算法。如果所有节点可信,即节点不会发出错误信息,但可能出现故障不响应,可以采用CFT(Crash Fault Tolerance)算法,包括Paxos、Raft等。如果存在恶意节点,即节点可能发出错误信息,可以采用PBFT(Practical Byzantine Fault Tolerance)算法。在实际应用的分布式记账系统中,不能排除恶意节点存在的可能性,但是PBFT算法效率较低,不能应用于超过100个节点。直到2009年中本聪提出POW(Proof of Work)算法,才很好解决了多节点的共识问题,比特币得以在互联网中实际部署,此后以太坊等主要的开放式区块链均采用POW算法[1]。POW算法通过引入激励机制,对认真记账的诚实节点给予奖励(比特币、以太币就是奖励手段),对恶意节点实施惩罚(能源和时间的消耗),使全网大部分节点对全局总账的看法保持一致。
虽然POW算法能让分布式系统“最终”达成一致,但是没有解决“高效”达成一致的问题。目前多节点共识的分布式记账系统,其处理速度与主流支付系统相比,可谓天差地别。拿比特币来说,系统每10分钟左右挖出一个大小为1MB的区块,每笔交易平均是250字节,每块可以放进4000笔交易,再除以600,每秒约能处理7笔交易。当前主流的第三方支付平台,最差的paypal每秒100笔量级,最强的如支付宝,双十一期间每秒100000笔量级。这种分布式记账系统,根本无法适应实际支付结算的需要。此外,POW算法面临算力攻击的可能,而且经常产生“分叉”(这一部分节点使用这一本全局总账,另一部分节点使用另一本全局总账),这些都是实际交易中不能接受的风险。
为了提高资金穿透系统的处理速度,我们把实现全网共识的功能赋予一个中心节点。这个节点应是全网可信度最高的,只能由央行担任。当仅有一个中心节点参与共识时,理论上中心节点运算速度就等于全网共识速度,这将保证资金穿透记账系统的处理速度跟上目前主流的支付结算系统,并且能确保全局总账不会产生“分叉”,让整个系统更加快速、安全、稳定。
(2)全局总账区块链
中心节点收到分时区域帐本后,对分时区域账本进行验证,并把通过验证的分时区域账本汇总组装成“分时全局账本”。分时全局账本就是一个区块,中心节点将分时全局账本有序链接在一起,每一个区块都指向前一个区块,就构成“全局总账”区块链。为了叙述方便,把前一个区块叫做“父区块”,当前区块叫做“子区块”。中心节点生成全局总账后,即向全网节点发布,所有节点都把全局总账作为最终共识,以此为基础生成下一时间的交易信息。实际上,全局总账的每更新一次,就在记账节点之间完成一次结算,这与现行支付结算系统的运行方式亦有本质不同。
分时全局账本作为一个区块,由包含元数据的区块头和紧跟其后的交易信息组成。区块头包括三个字段,分别是父区块哈希值、Merkle根和时间戳,对每个区块头进行哈希运算,可以生成一个哈希值,通过这个哈希值,可以识别出对应的分时全局账本。由于在每一个分时全局账本区块中,都通过区块头的“父区块哈希值”字段,来引用前一区块,因此每个区块头都包含其父区块哈希值,这样就创建了一直可以追溯到第一个区块的链条。
由于分时全局账本区块头包含“父区块哈希值”字段,所以当前区块的哈希值受到该字段影响:如果父区块哈希值发生变化,子区块哈希值也会跟着变化。当父区块有任何改变,比如说其中一个交易记录被篡改,父区块哈希值会发生变化;父区块哈希值变化将引发子区块头的“父区块哈希值”字段改变,进而导致子区块哈希值发生变化;以此类推,子区块哈希值变化又会引起孙区块哈希值变化。因此,一笔交易一旦加入区块链中,这种“瀑布效应”将确保该交易记录不被篡改,除非重新计算该区块的所有后续区块,而这种大规模的变动不可能不引起注意。
分时全局账本区块头包含Merkle根字段,Merkle根是区块内所有交易的数字指纹。Merkle根哈希值存储在区块头,归纳了全部交易,交易集合中任何一个交易发生改变,Merkle根会随之变化,进而引发区块头哈希值的变化。
技术可行性和面临的挑战
UTXO与区块链及加密技术结合,采用节点分层、中心共识的架构,能够高效处理资金交易,并能在不泄露银行和客户隐私的情况下,清清楚楚、不可篡改、无限可穿透地记录一笔资金的来源和去向。采用UTXO记账系统,获取的信息量要高于现行记账系统:从UTXO记账系统出发,可以导出现行记账系统所包含的所有信息,反之则不行。如果将资金的运行比作一条河流,现行记账系统直接反映的主要是水流横截面,而UTXO记账系统记录的则是水流运行全貌。从这点来讲,UTXO记账方式优于现行记账方式。但是,区块链的数据结构决定其随机读取速度慢,占用空间大,不过这个缺点是获取更多信息的必须代价,而且随着电脑运算能力的提升,这个缺点将越来越不重要。
这个系统采用的大都是成熟技术,要做的只是把他们协调装进一个框架。对账户实名信息加密的哈希算法,可以采用SHA-2或新一代的SHA-3,比特币等主要数字货币采用的是SHA-2,而作为SHA-3标准的Keccak算法更加安全;公钥密码和数字签名,可以采用RSA或ECDSA,ECDSA相比于RSA能以更短的密钥实现同等的强度;中心节点还应建立授权机制和公钥基础设施(PKI)。由于这个系统只有一个中心节点参与生成全局总账,因此不需要引入复杂的共识算法。
最具挑战性的是如何处理UTXO记账系统和现行记账系统的关系。现行记账系统以及相对应的支付结算方式,运行高效,许多账务处理采用先行记账方式也比较方便,经济主体亦习以为常。UTXO记账系统包含现行记账系统的所有信息,可行办法之一是把UTXO记账系统作为底层系统,并从这个底层系统导出现行记账系统所呈现的信息。UTXO是一个颠覆性的记账方式,在具体部署上应从实验室开始,从最简单的资金交易开始,以检查其对实际交易的适用性和暴露出来的问题,并衡量新旧系统的成本收益对比。
原文“基于UTXO和区块链的资金穿透记账系统”来源于《上海金融》,发表在此处有删减。本文不代表作者所在单位的意见。本文编辑:王蕾
我们期待您的来稿
欢 迎 订 阅
深刻|思想|前瞻|实践 专注于经济金融政策解读与建言的 智库型全媒体平台
更多原创请点击下方阅读原文
热门跟贴