文章
  • 文章
搜索
详细内容

MimbleWimble是如何实现匿名隐私、零和验证与轻量级数据存储的

01
MimbleWimble简介




MimbleWimble白皮书在2016年7月份发表,并在同年8月份,在bitcoin-wizards聊天室频道中首次提出。由于其架构上的一些巧妙设计,使得后续有许多感兴趣的工程师和研究人员都参与并持续的完善了MimbleWimble协议以及其系统。

MimbleWimble的基本定位是实现隐私,最初就是为了提高比特币的隐私和可扩展而创建的,是比特币协议的一种改进;但是后来它并没有合并到比特币体系中,而是独立成了一个新的区块链协议。


02
MimbleWimble的隐私保护
   

MimbleWimble的隐私是基于其三个基本组件实现的,分别是Confidetial Transaction(CT), Coin Jion, One Way Aggregate Signatures(OWAS)。 


这些组件技术的主要发明者,也是早期区块链技术的贡献者。比如其核心组件Confidential Transaction的最早提出者Adam Back,他是Blockstream的CEO, 同时也是hashcash的发明人;hashcash早期是用于防止垃圾电子邮件和拒绝服务攻击的工作量证明系统,现在广泛用于区块链数字货币的挖矿算法中,尤其以比特币的工作量证明最为出名,也因此,Adam Back被人称为比特币的教父。此外还有Gregory Maxwell,他曾是Blockstream的CTO (Chief Technology Officer),也是Blockstream的一个co-founder,同时还是比特币最早的五个核心开发者之一;Gregory Maxwell最后真正的设计并实现了Confidential Transaction中隐藏交易金额的算法,该算法能够在确保隐私的同时不影响交易的有效性。在MimbleWimble的白皮书中,用一个专业名词“Pedersen Commitment”来描述这个技术;它依赖于加法同态加密特性,同时也是零和验证实现的基础。除了Confidential Transaction,Gregory Maxwell还发明了MimbleWimble中的Coin Join技术。接下来将展开细讲。

01

加法同态性


MimbleWimble协议的实现依赖加法同态特性,为了更好的理解这三大组件,先简单的说明一下MimbleWimble中的加法同态性。


简单来说,加法同态性就是要求能够做到对经过加密之后的密文进行规则运算,使密文运算结果与明文进行加法运算结果的密文是一致的。


MimbleWimble协议是基于椭圆曲线为基础的加密算法:假设G为椭圆曲线上的点; v1、 v2 为一笔交易里面的金额1、金额2。那么可以有如下等式成立:

{9C9AC335-ED42-41DB-939E-1C480ABAD9F8}_20191011102035.jpg

由公式可以看出,对原文( v1, v2 )加密之后进行加法运算的结果,与原文( v1 ,v2)加法运算之后再进行加密的结果是一致的。这便是MimbleWimble中的加法同态性。

02

MimbleWimble的三大基本组件


01


Confidential Transaction


Confidential Transaction简称CT,中文翻译为保密交易,也有人翻译为机密交易,都属于这个模块。它是MimbleWimble协议中最基础最核心的技术之一。


CT模块实质上就是把UTXO(Unspent transaction output, 未花费的交易输出)数值部分(金额)通过加密后替换,以隐式的方式展现在交易详情的情况下,仍然可以保证该交易的有效性可验证。

 1、 Pedersen Commitment方案


Pedersen Commitment方案遵循加同态性质,这一协议在MimbleWimble中用公式表示为:
                    {99A28DB9-4461-4399-87E3-C8B3577D7CD8}_20191011102123.jpg        

其中结果C就是Pedersen Commitment的值,G,H是椭圆曲线上的两不同的点,v是金额,r是一个随机数,即私钥;在白皮书中,r被定义为Pedersen Commitment中的致盲因子。

引入致盲因子与椭圆曲线加密之后的操作,可以很好的保持加法同态性,一个稍微扩展的公式可以表示如下:

{40C1EAD6-37CD-41D4-956D-4674E476C1B5}_20191011102258.jpg

其中v1、 v2是交易金额1和交易金额2,r1、r2是致盲因子(私钥),G、H为椭圆曲线上的两个不同的点。

在Confidential Transaction组件中,最重要的就是要实现这个加法同态性质:先做加密后做加法运算出来的结果,和先做加法后加密运算出来的结果是要保持一致的。这样就可以保证即对交易中的金额进行了加密隐藏处理,也可以让矿工进行验证这个交易是否合法。因为只需要验证交易输出的Pedersen Commitment与交易输入中的Pedersen Commitment是否匹配即可,而无需再关注交易本身的详细信息,从而达到很好的隐私保护效果。

但是在实质操作中,矿工还需要考虑手续费的问题。同理的,矿工需要将手续费 f*G 与交易输出的Pedersen Commitment跟交易输入的Pedersen Commitment进行匹配。即:output Pedersen Commitment+ f*G要与input Pedersen Commitment相匹配。


2、所有权确认


在比特币中,如果要确认一笔交易的所有权,需要对这笔交易进行授权签名来验证,授权签名通过即可完成对交易的支配使用。但是在MimbleWimble协议中,就完全不是这个方式了。MimbleWimble协议是通过验证致盲因子差(和)来验证交易的所有权问题的:


在MimbleWimble协议构建交易的过程中,同样包含了输入与输出两部分内容,在忽略手续费的情况下:假设输入金额为v,输入致盲因子为 ri,输出金额为v0,输出致盲因子为r0,那么会有等式:

微信截图_20191010103135.png

因为交易的创建和接收者彼此之间都相互知道交易金额,但是无法知道对方的致盲因子(私钥),因此等式两边的金额部分可以相互抵消,但是致盲因子却无法抵消,最后会有一个余项:

微信截图_20191010103915.png

这个余项就是Confidential Transaction中的致盲因子差(和),在交易中,为了证明交易没有被恶意构造,只需要证明这个致盲因子差即可。

因为交易双方都只知道自己的致盲因子(私钥),而不知道对方的致盲因子(私钥),他们只要将各自的致盲因子加在一起,通过上述过程算出致盲因子差(和),就可以实现跟比特币中对交易签名同样的效果。换种说法就是:如果其中一方能证明它知道致盲因子差(和),也就同时完成了对交易的授权签名。所有权问题也就确定了。

比如:Alice给Bob转账5个币,假设Alice引用的输入是ra*G+5*H,那么就会有公式:

微信截图_20191010104150.png

其中是O输出,R是输入,n是Bob自己加入的随机数(私钥),G、H是椭圆曲线上的两个不同的点。那么最后运算所得的n*G+O*H就是致盲因子差。

因为n*G是椭圆曲线上的有效公钥,对于任何O,R,只有当O=0是G上的R*G+O*G有效公钥。因此协议需要验证的是O-R是G上的一个有效公钥,以及交易者知道私钥。那么就可以直接对kernel excess (后面讲)进行签名,然后验证交易者知道整个交易的输出的私钥,交易的输出和减去输入和刚好等于0即可。这个关联到每笔交易的签名,加上交易费,被称为Transaction Kernel(交易核)。

另外注意Bob在验证交易的时候加上了一个自己随机数n,这是为什么呢?如果Bob不加上这个随机数n,那么上述等式将会变为:

微信截图_20191010105106.png

虽然这样也可以方便的检验等式平衡,没有恶意构建新的币,但是这样也意味着Alice知道了Bob输出的私钥(r),(备注:在MimbleWimble协议中,一笔交易的创建需要双方共同的参与才能完成),那么Alice就可以把转给Bob的钱重新拿回来。这种情况是不允许的,那么为了解决这个问题,这个随机数n就发挥了重要的作用:Bob在收到Alice发来的交易请求时,可以自己再加入一个只有自己才知道的随机数n(私钥),让等式的致盲因子差(和)不再为0。这样既能不暴露自己的私钥给对方,也能够让交易顺利完成验证。


3、Range Proof


另外为了确保加法同态过程中不出现负值,在交易中如果出现负的交易金额,意味着有恶意的交易产生,因为它等价于非法创建的新的金额。为了避免出现这一现象,在Confidetial Transaction中,有个新的解决方案:Range Proof(范围证明)。这是一个简短的零知识证明,用来证明所有的交易输出都小于某个阈值,而且都是正数。


4、零和验证


以上便是Confidential Transaction的基本实现理论基础和实现逻辑,它利用加法同态性,实现了对金额的加密,利用致盲因子差来为私钥签名证明所有权问题,利用范围证明确保没有恶意的产生新的金额的交易。


整个Confidential Transaction的实现过程,是非常复杂的,但它的整个实现过程,其实也就是零和验证的基础,零和验证就是基于Confidential Transaction来实现的,对Confidential Transaction的理论逻辑验证过程,其实就是MimbleWimble协议中大家所说的零和验证过程。当然,在实质应用中,零和验证是需要结合Coin Join以及OWAS一起使用的。如果对其进行更简单的概括可以理解为:利用加同态特性,确保交易的所有输出的总和减去所有输入的总和的结果是0。


02


 Coin Join


Coin Join协议理解起来比较简单,简单概括就是允许用户将他们的交易组合在一起,其目的是让交易图谱变得更加模糊,从而起到增强交易隐私的作用。


关于交易图谱,可以把它想象成一棵Merkel tree,从根节点开始到它的每一个子节点,都可以形成一条完整的可追溯的路径,每个子节点上的交易以及用户信息都可以被追溯和查询,它就是一个交易、用户的历史关系图。使用这种交易结构的区块链项目并不能保护隐私,相反,它更适于监管,比特币的UTXO就是一个典型的例子。很多人误认为比特币是一个隐私性很强的数字货币,其实并不是,比特币独特的UTXO架构,反而很适合监管,它不是隐私的数字货币。如果在交易所等终端实现上链交易前的KYC (Know your customer),那么该用户往后所有的交易,基本都是可以追溯的。


使用了Coin Join之后,允许不同的用户之间把交易组合在一起,从而使交易图谱变得模糊。但是如果仅仅使用Coin Join,实质上对隐私性能的帮助并不是那么大的,因为虽然组合了多个交易在一起,但是实质上都是未经加密的输入、输出,只要细心梳理,还是能够匹配出原本的交易关系的。所以Coin Join需要与Confidential Transaction组件结合起来使用,数据经过Confidential Transaction加密处理后,就能够提供比较好的隐私效果了。


03


One Way Aggregate Signatures


One Way Aggregate Signatures (OWAS),被翻译为:单向聚合签名,它的目的也是为了更好的实现交易的隐私特性,让交易变得更加不可追溯,因为通过OWAS处理之后的交易,已经无法再通过拆分回溯的方式判断交易中的输入、输出原本是来自哪个交易了。它的具体实现方式如下:


在CT中为了实现加同态隐私加密,生成了一个致盲因子差(和),为了防止利用等式关系反向梳理交易图谱(交易内容已经加密过,只是图谱路径),从而推理出用户与交易的关系。OWAS把致盲因子差(和)又拆分为两个部分,其中一个部分作为公钥公开,另一部分则直接公开,比如:把致盲因子差(和)(r0-ri)*H拆分成两部分(r0-ri)1*H、(r0-ri)2*H(r0-ri)1*H+(r0-ri)2*H=(r0-ri)*H;那么其中的(r0-ri)1*H作为公钥公开,当然(r0-ri)1本身不公开,但需要用签名来证明自己可以验证通过(r0-ri)1(r0-ri)2则直接公开,证明自己本来就知道(r0-ri)2;这里经过拆分的致盲因子差(和)中,(r0-ri)1*H叫做kernel excess,(r0-ri)2*H叫做Kernel offsets。


把致盲因子差(和)拆分为两个部分的好处在于,在一个区块中,交易中的Kernel offsets部分,可以利用零和验证的过程(CT),进行合并处理,而合并之后的Kernel offsets,是无法再进行拆分的,但是Kernel excess还是会每笔交易的保存。这样就能够确保每笔交易还是能通过验证,因为在一个区块中利用每笔交易的Kernel excess与合并之后的Kernel offsets还是可以通过零和验证(CT),块没有伪造交易也没有恶意创建新的币;但是由于Kernel offsets无法进行拆分而无法反推交易的关系图谱,交易的隐私又得到更好的加强保障。

03

轻量级的数据存储


基于MimbleWimble的三大组件,在MimbleWimble协议中,还实现了一个叫Cut Through(交易核销)的方案,它可以实现非常小的硬盘空间占用,因为它的机制(三个基本组件结合)决定了它可以极大的压缩已花费的交易输出,从而实现交易的最小化,而又不影响交易的合法性。

由Confidential Transaction的同态依赖性可以看出,等式的两边可以进行相等项删除;再结合OWAS和Coin Join,就可以把大部分交易的中间过程删掉。也就是说,在一个交易链条中,可以把中间过程的已经花掉的交易输出从区块里删掉。而且这个方案不止可以应用在单个区块上,还可以应用到整个区块链条中,可以把跨区块(不同高度)的不同交易的交易中间过程的输入与输出删掉,只保留最终的未花费的输出。从而实现压缩硬盘存储空间的目的。核销过程如下:

微信截图_20191010110611.png


与单个交易类似,在一个区块中,这些交易都是所有权已经被证实,(来自交易内核 transaction kernels),并且整个区块没有增加任何货币供应(除coinbase之外),因此匹配的输入和输出可以被核销掉,因为它们对总和的贡献被抵消了,这样就可以省去中间的交易过程,只关心最终的交易状态和交易总和。该块中的所有输出与输入的零和验证结果还是通过的,总和还是0。

经过Cut Through之后,一个MimbleWimble区块的构成为:


微信截图_20191010110726.png

当区块中这类交易多时,能够核销的交易就越多。而且还可以进行整条链上的区块核销,即对不同高度的区块进行交易核销,从而对数据起到一个很好的压缩效果。但是这个核销并不会对隐私保护有实质性的帮助,因为对于节点来说,它可以选择核销,也可以选择不核销,这并不影响它对交易的合法性判断。但是核销的好处就是可以大量的节省节点所需要的硬盘空间。按照其相关协议介绍,相对于比特币大小的区块链数据,可以由几G级别的数据直接压缩到几百M级别;而且新节点加入MimbleWimble网络时,需要同步的数据量也可以做到非常小。



参考文献

[1]. Tom Elvis Jedusor, MimbleWimble white paper, https://download.wpsoftware.net/bitcoin/wizardry/mimblewimble.txt, 2016

[2]. Gary Yu, MimbleWimble Origin, https://github.com/mimblewimble/docs/wiki/MimbleWimble-Origin, 2018


本文作者:

金宁汇科技、南京可信区块链和算法经济研究院

云天明





敬请关注

11月9日首届全球区块链与算法经济高峰论坛将于中国(江苏)自贸区南京片区召开!




关注斯拜若

极致工匠精神·科技创造未来

关注金宁汇
技术支持: 思淘科技 | 管理登录