1. Hi区块链首页
  2. 资讯
  3. 区块链

拆解MimbleWimble 的隐私魔法(part I)

一、MimbleWimble怎么来
MimbleWimble的发展过程有点类似于比特币,是个千呼万唤始出来的成果,也就是某个议题,或者某种需求讨论了好久,终于有个人或者某篇论文,把一路上零零总总的研究成果,结合成一套可以…

一、MimbleWimble怎么来


MimbleWimble的发展过程有点类似于比特币,是个千呼万唤始出来的成果,也就是某个议题,或者某种需求讨论了好久,终于有个人或者某篇论文,把一路上零零总总的研究成果,结合成一套可以运行的协议:在比特币问世以前,很多人在讨论去中心化的电子现金,例如Wei Dai;还有Adam Beck研究出「哈希现金」HashCash,还有对于时间戳(timestamp)、公私钥等等的研究成果,加上Satoshi在共识算法上的突破–Nakamoto Consensus,而有了比特币;在MimbleWimble协议产生以前,其实很多在比特币核心开发组织中的成员,开始认为比特币的确实现了「点对点的现金交易」,但却不够能维护「点对点交易的隐私」,有许多研究者已经能够从交易图和网络爬虫等方式,来图像化分析某个或多个账号的历史交易,并接近精准的推测交易的人或者群体可能是谁。因此在比特币交易中暴露交易双方账号、交易金额以及交易可追踪等特性会威胁了交易匿名性(anonymity),而本身交易可追踪的特性又让货币本身不具有可替代性(fungibility),也是被人所诟病的特点。

于是,在比特币核心社群BitcoinCore中,陆续有很多人提出了各种协议,或者新的方法,想要促进比特币能够更具有隐私性,但都比较像是个别项目的性质,而不是一套马上能够让某种货币直接使用的区块链系统。直到有一天,在比特币的IRC(Internet Relay Chat) channel中,有位化名为 Tom Elvis Jedusor(法文版的佛地魔)透过Tor网络放了一份txt档,也就是后来大家俗称的白皮书,他在里面命名了一个叫做MimbleWimble的协议(哈利波特里面的锁舌咒语,念了你会说不出话~~),并且推测了,透过ConfidentialTransactions(机密交易,简称CT)、CoinJoin、One-way aggregate signatures(单向聚合签名,OWAS)等三种方式,可以完成「隐私交易」,并且透过cut-through的方式处理资料大量增加「产生的状态增长问题」。他在留了这份名为MimbleWimble的白皮书后就人间蒸发了,然而他的白皮书仍然留下了很多问题,而且没有完善的数学证明他的想法的可行性,是最后由BlockStream的 Andrew Poelstra将这篇文章完善,提出了一篇较为完整版的论文。(对了,后面还会一直看到BlockStream,没有这间公司的人,我认为也不会有MW协议)。

所以整体来说,MimbleWimble是在比特币社群中,有长期关心隐私问题的专家和爱好者们,不断的提出各种改进方法,最后有人统整这些方法,并且被人验证后所产生的产物,和比特币构成的过程有点相似,但是他是一个协议,实际的实作还必须等到Grin还有BEAM这两种隐私加密货币的出现。

拆解MimbleWimble 的隐私魔法(part I)

从比特币的交易中,可以去分析个别的群体分别可能为何

拆解MimbleWimble 的隐私魔法(part I)

某个比特币账号在R语言下呈现的交易图

二、解构MimbleWimble三大零件

 

Mimblewimble是个由很多个零件拼装起来的变形金刚,在这个章节我会来介绍,MW的各种零件是如何运作来完成这套协议,根据协议,我认为MW的隐私货币交易有三个交易的特性

1.没有交易金额

2.没有交易双方地址

3.在一个区块中,多笔交易是被合并的,没办法看到每个单笔交易的细节

要完成这样的特性:必须分别由三个大零件:

 

1.Confidential Transactions(机密交易,简称CT)

2.CoinJoin(混币交易)

3.One-way Aggregate Signatures(单向聚合签名,OWAS)

透过这三大重要的主要协议,来完成隐私交易,最后透过Cut-through,来响应已确认的链状态大量累积的问题,这也是MimbleWimble比Zcash和Monero等仍需要储存许多状态数据的隐私币还出色的地方。

既然他是一个专门为隐私币所创造的区块链协议,那么还是先来介绍一个区块中的内容物:

 

1.经ECDSA加密过的交易输入和范围证明的merkle tree

2.经ECDSA加密过的交易输出和范围证明的merkle tree

3.交易内核:一个剩余值excess value(s)和总和的kernel offsets、挖矿费用。

4.区块头、区块高度

其实应该在这里就能够看出来MW和其他区块链的区块有结构上的差别了,在此也开始解构MimbleWimble的所有零件:

1、ConfidentialTransactions 机密交易

 

首先先介绍Confidential Transactions(以下简称CT),CT最早是blockstream的Adam Back提议添加「加法同态」的性质在比特币交易中而产生,后来这个方法被Gregory Maxwell以Confidential Transactions的名义发出来,最后被匿名的佛地魔加到了MW协议中,他的最基础的概念就是要将任何协议中的交易输出及交易输出都以椭圆曲线的方式进行加密。

所以在MimbleWimble之中,每个交易输入和交易输出都会以Pedersen Commitment的形式写成:

拆解MimbleWimble 的隐私魔法(part I)

如上所写,我们可以知道C(Pedersen Commitment,Pedersen可能是从TPPedersen的论文而来)是一个让交易金额v通过ECDSA( 椭圆曲线数字签名算法,Elliptic Curve Digital Signature Algorithm,缩写ECDSA)而产生的值,这个值众人皆知,然而透过椭圆曲线后所看到的输入值将不再是单纯的金额,我把上面算式内容分成以下三点解说:

1.     r是所谓的致盲因子(blinding_factor),作为私钥使用,是不能被其他任何人知道的,这个私钥也代表你对这个交易值的所有权。

2.   G和H则是在椭圆曲线上的两个点,而r*G则是r在G上的公钥,我们没办法透过r*G而知道r值,这是所谓的离散对数问题,我们不会因为知道公钥,就因此而知道私钥,切记不要把这里说的乘法和5*6=30这种单纯的乘法搞混。

3.   v则是交易的数额,只有交易的另一方也会知道,但是矿工与其他人则不会知道。在这里椭圆曲线确保了一件事,交易金额v和致盲因子r不会被透过逆推的方式而知道。

现在你知道一笔交易的长相如何了,我们赶紧来看怎么样可以让这笔交易怎么被验证。

 

1-1、隐藏交易数额的魔法:加法同态(Additively Homomorphic)

在MimbleWimble中,每笔交易仍然遵守UTXO( Unspent Transaction Output)的概念,如果对比特币有点了解,应该还有印象当我们说某用户的钱包“收到”比特币时,意思是说这个钱包发现一个可以使用该钱包控制的密钥来花费的UTXO,你可以将他简化成输入=输出。假设今天在比特币交易中,你的帐户有10BTC,你用了7BTC给卖家,3BTC是找零(为了简化先不管手续费)。

输入1(10)=输出1(7)+输出2(3)

可是今天我们在MW的交易中,数额是不能被外人知道的,这时候交易仍要遵守V1+V2=V3的形式,这时候同态加密 (HomomorphicEncryption)就派上用场了,在CT中遵守的只是同态加密中的加法同态( additively homomorphic ),加法同态的意思,就是先加密再相加=先相加再加密,因此,我们能够看到算式演变如下:

V1+V2=V3
=>  V1*H+V2*H=(V1+V2)*H=V3*H

这时候加法同态的性质巧妙的验证了一件事情,那就是我们不需要知道原本v1和v2,以及v3的值是多少,只需要知道V1*H+V2*H=V3*H就可以验证v1+v2=v3了,也因此他能够成功地去隐藏交易数额。

但是这里会存在另外一个问题,就是我们如何在输入=输出的情况下,不让交易的另一方,以及后来的验证者不知道我的私钥,同时又可以让他们验证我知道私钥呢?

可能看完你还不一定知道问题在哪里,让我们先来看看这个问题:

今天Alice假设有24个币,致盲因子为81,则他的Pedersen Commitment会是

81*G+24*H

那要是Alice传给Bob数量为7的币,那么算式会变成(ps.在此我们先忽略矿工手续费)

A-B=(81*G + 24*H)-(81*G + 7*H)=0*G-17*H

这样就会变成说,Bob将会知道致盲因子是81,如此一来你的私钥就被曝光了。所以在真实的MW交易中,不能让这种事情发生,否则连你找零的花费都有可能被取走,因此当Alice要和Bob交易时,必须再另外为所找零的钱所设立一个致盲因子,例如我们将另个致盲因子设为8,记住这个8还是不能让他知道的,同时,当你传给Bob时,Bob也会指定一个私钥数字(这里假设Bob的致盲因子是23),虽然这时候Bob不会知道你的致盲因子是多少,但我们能够利用等式两边数值相减为零的特性,来去验证你给的致盲因子之差的正确性。所以这个时候的算式变成这个样子:

Alice(24)-Alice(17)-AlicetoBob(7)
81*G+24*H-(8*G+17*H)-(23*G+7*H)=50*G+0*H

这时候此笔交易中,验证的矿工会收到50*G的余项,这时候的excess value值就是50,50*G(余项)和50(致盲因子差)则刚好可以作为公钥与私钥。(记得这部分的交易内容中,没有算到矿工手续费)。

 

1-2、避免多余金钱被制造的魔法:范围证明(Range Proof)

今天我们已经可以确定交易数额可以透过加法同态的方式去隐藏,并且让验证的矿工能够验证交易等式两边是相等的,但这时却还有一个影响交易有效性的问题,就是即使等式两端相等,还是有可能凭空创造出来的金钱,可能一时之间比较难想象,那你能够先看下面这组输入与输出的算式:

输入=输出1+输出2
5=(-10)+15

今天以上的算式,也符合输入等于输出的条件,但我却能够发现到,原本的5块变成15块,中间的10块是因为是被凭空创造出来的金钱。而且这个时候负数,在椭圆曲线上对应的可能也是任何值,因此不太会被检测出来。这时候在机密交易中用了另外一种零件,称作范围证明(RangeProof)。RangeProof最早由blockstream的Gregory Maxwell所提出,Range Proof会附挂在每笔交易输入与输出中,他透过简单的零知识证明,可以确保在不知道数额为多少的情况下,还能证明每个单笔的输入输出都是一个0<x<2^64的数,以确保不会有额外的金额产生。然而,每笔输入与输出都必须附带的零知识证明的size大小,却是相对于交易本身要来的更大,而且矿工如果要同步于整个区块,就必须从头到尾都进行验证每笔交易的Range Proof验证,因此Range Proof本身的大小,也成为必须去改进的对象。因此,后来Stanford的学生 Benedikt Bünz又在他的基础上开发出了所占的容量更小,指令周期更快的Bulletproof,在i7–6820HQ的系统系统下实测只有688bytes的大小,较原本Maxwell开发出来的有5kb左右的Range Proof已经有非常大的容量改善,但和每笔交易差度不多33bytes相比仍然非常大。

到现在我们可以有一个概念,以了解不用知道金额的交易如何被有效验证:

1.矿工透过PedersenCommitment的加法同态性,确保在不知道交易金额的情况下,还能确定等式左右两边输入等于输出

2.透过RangeProof来确定某个不知道数额的交易输入或输出,确实大于零,以避免被凭空创造出新钱。

本文转载公众号:区块链研究实验室

声明:登载此文出于传递更多信息之目的,观点仅代表作者本人,绝不代表Hi区块链赞同其观点或证实其描述。

提示:投资有风险,入市须谨慎。本资讯不作为投资理财建议。