从去年底开始,笔者就一直很关心MimbleWimble这个新的隐私协议的发展,不只是因为Grin主网上线的缘故,或者Litecoin即将采用MimbleWimble协议的关系,而是因为他是很多隐私协议的结晶体,他巧妙地结合了许多隐私协议,而且让隐私交易变的可以实行,甚至具有扩容的效果,因此,一直很想再写一篇文章,把MimbleWimble的机制运作讲的更仔细,同时也力求好懂。

一、MimbleWimble怎么来

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

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

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

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

某个比特币帐号在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 tree2.经ECDSA加密过的交易输出和范围证明的merkle tree3.交易内核:一个剩余值excess value(s)和总和的kernel offsets、挖矿费用。4.区块头、区块高度

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

1、Confidential Transactions机密交易

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

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

C=r*G + v*H Maxwell的文章中是这样写: commitment = SHA256( blinding_factor || data )

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

r是所谓的致盲因子(blinding_factor),作为私钥使用,是不能被其他任何人知道的,这个私钥也代表你对这个交易值的所有权。 G和H则是在椭圆曲线上的两个点,而r*G则是r在G上的公钥,我们没办法透过r*G而知道r值,这是所谓的离散对数问题,我们不会因为知道公钥,就因此而知道私钥,切记不要把这里说的乘法和5*6=30这种单纯的乘法搞混。 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的形式,这时候同态加密(Homomorphic Encryption)就派上用场了,在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.在此我们先忽略矿工手续费)

AB=(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块是因为是被凭空创造出来的金钱。而且这个时候负数,在椭圆曲线上对应的可能也是任何值,因此不太会被检测出来。这时候在机密交易中用了另外一种零件,称作范围证明(Range Proof)。Range Proof最早由blockstream的Gregory Maxwell所提出,Range Proof会附挂在每笔交易输入与输出中,他透过简单的零知识证明,可以确保在不知道数额为多少的情况下,还能证明每个单笔的输入输出都是一个0

然而,每笔输入与输出都必须附带的零知识证明的size大小,却是相对于交易本身要来的更大,而且矿工如果要同步于整个区块,就必须从头到尾都进行验证每笔交易的Range Proof验证,因此Range Proof本身的大小,也成为必须去改进的对象。因此,后来Stanford的学生Benedikt Bünz又在他的基础上开发出了所占的容量更小,运算速度更快的Bulletproof,在i7–6820HQ的系统系统下实测只有688bytes的大小,较原本Maxwell开发出来的有5kb左右的Range Proof已经有非常大的容量改善,但和每笔交易差度不多33bytes相比仍然非常大。

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

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

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

2、CoinJoin混合交易

在过去有许多人认为在比特币的交易图上,能够看到「哪笔输数对应到哪笔输出」是一件非常容易暴露隐私的地方,因此Gregory Maxwell(是的,又是他)题出了一个叫做CoinJoin的概念,他要做的事情非常简单,就是将两笔交易混合。

Gregory Maxwell所提出的CoinJoin

在MW协议以钱,有许多钱包或者额外的服务,就有配置CoinJoin的服务于其间,例如WasabiWallet和Tumblebit、JoinMarket,然而单靠Coinjoin却依旧是不安全的,大家仍旧可以从交易数额中试图去还原,同时因为是个别的服务,参与的人数太少,在资金匹配上也需要花一定的时间。这时候佛地魔在MW协议中将CoinJoin的技术,结合机密交易(CT),就能够避免交易能够从「数字」方面去被推敲出来,同时在交易路径上也可以透过CoinJoin的技术被混淆。

而且和过去个别使用CoinJoin的服务不同的地方,是这次Mimblewimble,彻底把CoinJoin写在了协议层,如此一来不需要靠第三方的钱包或者服务帮忙就能完成这一件事情,而且有机会让混合交易变的更有效率。

但现在就要开心的庆祝隐私交易的魔法能够实现,就还太早了,因为即使混合交易数额,我们还是能够知道交易双方的公钥,并且能透过这些公钥址去尝试重构每一笔交易,因此在这样的情境下,我们必须要有新的公私钥系统,来确保隐私安全。

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

Jedusor在他的初略版白皮书中,提出了可以用Yuan Horas Mouton的单向聚合签名(One-way Aggregate Signatures,简称OWAS)的方式去完成,比较有趣的一点是在Andrew Poelstra在他详细版的白皮书中,却没有用到OWAS这个词,而是在Sinking Signature还有compact chain中去验证这个技术,甚至连后来开发Grin的Ignotus Peverell的Github的MW简介中,也没出现OWAS这个词,而是直接说Transaction Aggregation(交易聚合),不知道这个专有名词,为什么在这个三个重要的MW文件中,出现的方式会略有不同,但在此还是以OWAS去代称(我知道在之前已经有如Boneh等学者在研究聚合签名)。

所谓的聚合签名,就是指当你看到很多交易的输入以及输出时,我们将不能再把这些输入及输出的公钥重新拆解,并且拼凑出一个完整的交易顺序,因此我们将所有签名聚合在一起,并且不能使他逆向被还原。

OWAS由两个部分组成,一是Kernel Excess(内核剩余),一是Kernel Offsets(交易核偏移因子),还记得我们所说的致盲因子之差吗对的,就是Alice既要传送钱给Bob,又不希望Bob知道他的私钥(致盲因子),于是他给他了(致盲因子差)*G,这时候我们为了避免人家从交易中的公钥推测出交易途径,我们用了单向聚合签名的方式来降低大家知道这个值的可能性,因此我们产生了以下算式

输出的Confidential Transactions总额-输入的Confidential Transactions总额= Kernal_excess + kernel_offset

透过这种方式,我们就可以将最后作为的公钥的余项(例如刚才上面在讲机密交易时的50*G)拆分成两部分,例如X*G拆成(x1+x2)*G ,这时候大家能构让外界看到的值x1*G就是所谓的Kernel Excess,你可以把它看作是公钥;而另外一部分就是x2*G,称作Kernel Offsets,他会和这个区块中所有交易的Kernel Offsets一起被相加,而当他们这么多个Kernel Offsets被相加后,你也就看不出来,哪个Kernel Offset是哪一笔交易中的了,所以这个方法才会被叫做单向聚合签名,因为他没办法在做逆向工程了。因此,当一笔MW上的交易在给矿工验证时,我们可以想像Kernel Excess就是公钥,而Kernel Offsets是私钥。

到此,隐私交易的部分就彻底完成了,我们在此简短重复一次

1-1、机密交易-加法同态:确保在不知道交易金额的情况下验证等式两边成立

1-2、机密交易-范围证明:确保在零知识证明下,每个输入输出值大于零,避

免凭空创造多余金钱。

2、混币交易:让我们无法从交易数额中去回推交易路径

3、单向聚合签名:让交易的公钥不会被暴露出交易路径

三、Cut-through核销:减少矿工储存状态

cut-through是MimbleWimble中一个针对矿工的精巧设计,他能够确保的是矿工不需要长期存储这么多的交易状态,而cut-through的概念就是在一笔交易已经被确定其所有权的情况下(也就是被验证)后,只要能够维持输入等于输出(input=output),那么过程中多余的内容都可以被删除。

例如原本的几个交易可能长这个样子

Input1+Output1=Ouput1+Change1+Output2+Change2=>Cut through之后(Output1等式两边都有因此可以被删去)Input1=Change1+Output2+Change2

然而在这里必须特别说明,我认为Cut-through的概念并非能够在目前实作的两个项目中(Grin&BEAM),达到很好的隐私,例如在Grin中,其实Cut-through的功能是能够被关掉的,只要将~/.grin/main/grin-server.tomlar的archive_mode从

archive_mode = false

变成

archive_mode = true

in~/.grin/main/grin-server.toml

如此一来矿工的节点就不会执行核销的动作。因此我认为目前部分外界人士,可能认为Cut-through能够透过删除资料来解决隐私,就目前的实作来看可能会是一个误解。

四、MinbleWimble的后续效应与限制

MimbleWimble不但是一个许多隐私协议所组成的隐私币区块链协议,更是许多过去比特币社群所遇到问题时,一些原本在比特币上无法实现的好方法被应用的好场景,然而MimbleWimble也像是练就了某种神功后,具有某些后遗症的武者,因此在最后,我试图去探讨,MimbleWimble会产生什么后续的影响,以及发展可能有什么样的限制。

1.挑战其他隐私币的地位和公链设计原则

笔者认为,MimbleWimble协议所影响的,首先是挑战既有隐私币的地位,例如Monero和Zcash,MW协议中不但不需要为了验证交易的合法性,而保留以验证的交易作废清单(例如Monero的key image和Zcash的备注作废),同时Cut-through的功用,也让矿工能够减少储存已验证的状态这种较为不合理的手法。另外,我认为MW协议也是少数,用减少资料储存来达到可扩展性的公链设计手法,同时他也减少了许多区块链中应该要被矿工所记载的内容,在MW中,一笔交易里面矿工要知道什么:最主要的就是交易有效性与通货膨胀,可能会影响未来不具高度智能合约需求的货币项目,往这样的方向去发展。

2.限制

虽然MW在隐私协议上采取了非常巧妙的手法,去实现了匿名交易。但其本身依旧有某一些限制,在此我将他分为三点:一是Range Proof所占的容量影响交易状态储存的容量;二是交易实作上的使用体验;三则是智能合约等等货币交易以外的区块链功能实现能力。

2-1、Range Proof所占的容量影响交易状态储存的容量

上文曾经说过,透过Cut-through,我们能够减少矿工的储存内容物,避免状态大量累积的问题,然而,在MW区块链中,无法被删减的,是每笔输入与输出中的范围证明(range proof),Range Proof是一个简单的零知识证明(688bytes),容量相较于交易讯息本身(单个交易约33bytes),相较而言其实是非常大的差距,这也是会影响未来矿工储存资料,以及未来可扩展性的关键。

2-2、共同构建交易的实作体验

在MW协议下的交易,我们必须要交易双方共同去将一笔交易完成,例如Alice寄钱给Bob,Bob必须证明他知道交易金额,并且在回传讯息给Alice,最后交易经过Alice验证运算后才完成,这样的过程不需要同步在线上完成,但需要交易双方共同构建,和比特币、以太坊等等密码货币那种只需一方传送金额签章到区块链上的概念较为不同,因此目前例如在Grin上,有两种方式可以进行交易:

寄送档案: Bob需要收到交易档案( transaction file),并且生成一个回应的档案(response file),并且寄回给Alice。 网页(HTTP):Bob的Grin钱包必须要监听一个端口。无论Alice的钱包什么时候寄给他,Bob的钱包都会自动执行既有的步骤。但这却有一个比较苛刻的条件,就是钱包需要在一个固定的IP地址下,并且你的钱包客户端要持续运作才能完成。

这些过程其实都是非常不人性,很难在未来普及使用。目前Grin有开发一个新钱包grinbox,目标是能够像比特币一样的交易,但很持续在开发中,如果未来有任何消息,我会持续更新。

(如果想进一步看Grin的交易流程,可以看看这一篇)

2-3、货币交易之外如智能合约等功能的扩展现制

MimbleWimble和比特币较为不同的是其较难支持区块链中的交易脚本,这也导致了如比特币可以实现的简单智能合约、或者闪电网络等等,然而,我认为这或许是大家已经不太震惊的MW缺点所在了,而且目前就笔者所见,已经有一些有趣的专案被展开,例如精确版MW白皮书的撰写人:Blockstream的Andrew Poelstra,目前正在研究透过无脚本脚本(scriptless-scripts)的方式来创造MimbleWimble上简单的应用,同时也有人实现了Grin上的原子交换。或许未来可能有更轻巧的智能合约实现方式出现。