1. 链一财经首页
  2. 资讯

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

本文从技术的角度,详细介绍了MW的方方面面,干货满满,给你好看~

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

概要:本文从Mimblewimble的起源、技术运用、优缺点,多角度详细介绍了Mimblewimble的实现方式,热爱技术的你一定不能错过!

2017年和2018年是专注于扩容的两年,分叉币和分叉项目由于“分叉”一词成为热点话题,这场争论给我们带来了解决方案,并告诉我们,我们现在所处的位置满足了当前的需要,同时也为未来制定了计划。接下来几年的关注点将是大规模地应用匿名性和可互换性。

在一个快速发展的互联网世界,隐私成为一个重要探讨话题。目前,我们相信中心化公司会保护我们的隐私,我们的密码非常牢固,黑客难以攻破。随着迈入新互联网时代,万物联系紧密,去信任和隐私加密必定要成为联系的基础。未来,我们面临的不仅仅是照片和信用卡号码暴露的风险,而且是与你相关的所有数据暴露的风险。

要在去中心化和去信任的网络环境中实现隐私保护,则面临一系列挑战,比如找到具有具有广泛适用性的方案,满足生态系统的多样性和扩容需求。目前物联网领域已开始研究在网络中实现不同的隐私协议,满足物联网匿名交易和匿名智能合约扩容的需要。

Mimblewimble

匿名协议Mimblewimble,这是一种类似椭圆曲线密码学的新实现方式,它是大多数加密技术的基础。

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

2016年8月,一位匿名用户在bitcoin-wizards IRC频道发布了一条白皮书链接,声称“增强比特币的匿名性”。接着发布一篇区块链提案,提案中使用的交易架构与世界上所有的交易架构截然不同,它极其优雅地应用了椭圆曲线密码学。

虽然提案中提出的观点和理论成立,但缺乏详细的数学理论和安全性分析。数学专家兼Blockstream研究总监Andrew Poelstra在看到提案后,立即着手分析该协议的优点,并在两个月后,创建了一份详细的白皮书[poel16],概述了创建独立区块链所需要的密码学,基本定理和协议。

Andrew Poelstra提出的协议,隐藏了交易值,消除了地址,同时还解决了扩容问题。

机密交易

假设你想要隐藏发送的金额,一个既为人所知又快速的方法是:用哈希加密。无论输入大小如何,你都可以用哈希生成一串长度相同随机字符,而且无法用输出推算出输入。于是我们可以把交易的金额进行哈希,并将哈希后的值放进交易。

X = SHA256(amount)


4A44DC15364204A80FE80E9039455CC1608281820FE2B24F1E5233ADE6AF1DD5 = SHA256(10)

但由于哈希是确定的,需要先算出所有金额的哈希值,才能得出正确的哈希。现在,我们去掉这种做法。在哈希金额前,我们先将金额乘以全盲因子。如果不公布全盲因子的话,是无法得知其内部的哈希值。

X = SHA256(blinding factor * amount)

乘以全盲因子后得出的值为commitment(承诺),提交一个值,但不揭示出来,如果不改变承诺,金额不会改变。

但节点如何用这个承诺值来验证交易呢?至少要证明满足两个条件:一有足额货币,二在验证的过程中你没有创建货币。绝大多数协议验证交易的方式是:计算交易输入(或多个交易输入),然后创建一个不超出输入总值的输出。如果输入与输出不相等,就相当凭空创造了货币。

input(commit(bf,10), Alice) -> output(commit(bf,9), BOB), outputchange(commit(bf,5), Alice)Orinput(4A44DC15364204A80FE80E9039455CC1608281820FE2B24F1E5233ADE6AF1DD5, Alice) ->output(19581E27DE7CED00FF1CE50B2047E7A567C76B1CBAEBABE5EF03F7C3017BB5B7, Bob)output(EF2D127DE37B942BAAD06145E54B0C619A1F22327B2EBBCFBEC78F5564AFE39D, Alice)

如上图所示,最后的有效哈希值表明爱丽丝创建了4个币,她进行了一笔交易获得了这4个币。在任何交易中,输入总额必须等于输出总额。我们要用一些数学方法对哈希值进行验证:

commit(bf1,x) = commit(bf2,y1) + commit(bf3,y2)

如果交易有效,将是:

commit(bf1,x) – commit(bf2+bf3,y1+y2) = commit(bf1-(bf2+bf3),0)

或只剩下提交的全盲因子。

借助哈希算法来证明,是不可能的。要进行证明就必须公布所有全盲因子和金额。如果这样,就不是匿名了。我们如何公开一个private value(匿名值),又无法对这个值进行逆运算,并仍能验证这个值是否符合条件?听起来有点像公钥和私钥密码学。

Grin用椭圆密码学来定义数字空间(number space),取椭圆曲线的一点G,乘以任意数值x,得出的都是一个有效值P(同样是椭圆曲线上的一点)。计算结果很快,但即使得知P和G,我们仍无法得出乘数x。我们可以将P作为公钥,x作为私钥,有趣的是,这两个数也具有加法和communitcative属性。

如果取点px•G,加上点qy•G,得到的点W = P+ Q,等于用x+y的组合来创建一个新的点。所以:

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

所以乘积也是不变的。

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

这种同态(homomorphism)属性,帮助我们用未知数字进行运算。

所以比起用原金额*全盲因子=承诺,我们可以将金额和全盲因子分别乘以一个椭圆曲线上一个已知点,于是承诺变为:

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

变化后承诺被称为Pedersen Commitment,是所有机密交易的核心数值。

假设全盲因子r,金额v,取椭圆曲线上的H,G为生成点(此处不深入Schnorr signatures[施诺尔签名]了)。将这几个数值带入承诺中:

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

使用communicative属性:

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

如果交易有效,则等于:

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

用ri,vi作为输入值,ro,vo作为输出值,Rco,Vco作为更改后的输出。

上述公式得出的差便是超出的全盲因子,也叫作commitment-to-zero(趋向0的承诺):

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

你可以观察到,在选择任意全盲因子的情况下,commit-to-zero都是非零数,事实上,它仍是椭圆曲线上一个有效点(公钥),

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

私钥等于全盲因子之差。

因此,如果输入总值减去输出总值后的值,能在椭圆曲线上生成一个有效的公钥,则代表余差为0,没有创建新币,如果差值不等于0:

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

对于一些超额的全盲因子,它们不是椭圆曲线上一个有效的公钥,因此这不是一笔等额交易。要证明这一点,用这个无效公钥签署交易,证明交易等额,所有全盲因子已知,在验证的过程中,没有揭示任何与交易相关的数据(签署交易的详细流程请参阅 [Arvan19])。

所有上述公式都假设数字为正数,也可以用负数创建有效交易,用户可以在每笔交易中创建新币,这种方法被称为Range Proof,每笔交易必须有零知识证明,证明匿名提交的值符合预订范围内的值。Mimblewimble,Monero都使用了BulletProof,这是一种新型计算Range Proof的方式,将交易缩小80%—90%左右。

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

*当前网络中的平均交易大小,MW的平均交易大小为输入2kb输出2.5kb。

当前Mimblewimble和Monero之间的协议几乎相同,不同的是交易的签署方式。

在Monero中,有两组钥匙/地址,花费钥匙和查看钥匙(spend key,view key)。花费钥匙用于生成和签署交易,查看钥匙用于“接收”交易,由花费的输出衍生环形签名,来签署交易,验证花费钥匙属于钥匙组中一员。要验证,就要用私钥和前面交易公钥的一组混合签名诱饵,合并创建一个施诺尔签名(Schnorr signature)。所有签名诱饵在数学上都是可行的,无法确定出真签名。Monero使用了Pedersen Commitment,隐藏地址,但仅用于认领交易、签署交易和生成全盲因子。

Mimblewimble没有使用任何形式的地址。就是该协议的闪光点。Jedusor证明全盲因子与Pedersen Commit以及commit-to-zero可生成一次性公钥/私钥对来创建和签署交易。

用椭圆曲线密码学生成公钥和私钥对的所有地址,其方法是一致的。将椭圆曲线上的G点乘以一个大额随机数(k_priv) ,得出的(K_pub) 也是该曲线上的另一个有效点。

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

这是所有地址生成的关键,是不是很熟悉?

前面我们提到的承诺:

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

每个全盲因子乘以G(红色数字)就等于地址了!r*G是公钥,r是私钥,因此无需地址,我们可以用这些全盲因子来证明输入和输出,并用它们来签署交易。

这似乎更改了地址的链接性,也不需要脚本签名(scriptsig)来验证签名有效性,且极大地简化了机密交易的架构和缩小交易大小。同时,也意味着在交易过程中,双方需要交互来生成签名。

CoinJoin

即使现在隐藏了所有地址和金额,仍然可以得出一些交易信息。在上述交易公式中,很清楚地列明了应用了哪些输出,以及哪些输出是交易外的。“交易图”解释了全盲因子的所有者信息以及交易活动。为了进一步隐藏和压缩信息,Mimblewimble实现了Greg Maxwell的CoinJoin创意,最初该创意是为比特币而研发的。Coinjoin以一种去信任化的方式将多个交易的输入和输出,合并为一个交易。掩盖发送方和接收方。要在比特币上实现,用户或钱包必须进行交互,才能加入相同金额的交易,因此无法区分交易来自那一方。如果能在不共享私钥的情况下合并签名,则可以合并多个交易签名(比如环形签名),则不再受相同金额的限制。

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

在CoinJoin中,3个地址有4个输出,无法知道谁是真正输出。

在Mimblewimble中,计算一个或多个交易金额仍然会生成有效的commit-to-zero。我们要做的是合并交易,合并签名。Mimblewimble天生就适应用commit-to-zero和Shnorr合并签名。使用“单向聚合签名(简称OWAS)”,节点可以在创建区块时,将多个交易合并为一个交易。Mimblewimble将区块中的所有交易,高效地转化为一个大交易(包含所有输入和输出)。这同时混淆了交易图,去除了出块时消耗的中间交易计算,缩小了区块大小,进而缩小区块大小。

Cut-through

我们更进一步,验证这个完整“连接”的区块。节点将所有输出承诺相加,减去所有输入承诺,验证差值是否是有效的commit-to-zero?理论上我们可以合并两个区块,去除两个区块中的所有交易和花费,变成一个未花费承诺的有效交易。我们用这种方法回溯到创世区块,将整个区块缩减为一个未花费的承诺,这种方法被称为Cut-through。使用此方法时,我们无需保留任何花费输出的rang proof,这些rang proof已得到过证明,可以删掉。可以大幅地降低区块从0(交易数)到0(未花费的输出数)的增长数,。

为了解释Cut-through的优点,假设比特币一开始就应用了Mimblewimble,到了区块576,000,区块链达到了210GB,总共41367.5万笔交易,以及5540万笔未花费输出。Mimblewimble的交易输出大约为5kb(包括range proof~5kb和Pedersen commit~33字节),交易输入大约是32字节,交易证明大约是105字节(commit-to-zero和签名),区块头为250字节(默克尔证明和PoW),非机密交易可忽略不计。将上诉所有相加起来,同步区块链的所有信息一共是5.3TB,只有279GB是未花费交易输出。当使用cut-through,我们想保留所有交易记录,因此保留所有交易证明、未花费输出和区块头。将区块缩小至322GB,缩减了94%。其结果是保留未花费的共识状态,大大缩短新节点同步时间。

如果实现Bulletproof,range proof可从5kb缩减至1kb,将未花费输出从279GB缩小至57GB。

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

基于上述假设和计算

PoS链还有一个有趣的隐义,具有明确的终结性。一旦确认最终结果,或任意区块链深度,就无需再保留range proof。经过验证的交易,其共识状态已写入区块链,但这些交易仍占据区块链大量内存。如果说最终性是在100区块深度,假设未花费输出的10%已预先终结,会将区块链再一次减少250GB,完全同步只需73GB,缩减98.6%。设想这是一个73GB的区块链,包含了比特币10年以来的匿名交易,只有当前比特币区块链的1/3。

还有一点,cut-throught不会影响匿名性和安全性。所有节点都可选择在不执行cut-trought情况下,存储整条链,唯一增加的成本是购买磁盘存储空间。Cut-through纯粹是一种扩容功能,使基于Mimblwimble的比特币区块链缩小至1/3,将Monero缩小50倍(即使在它当前使用Bulletproof的情况下)。

Mimblewimble的不足之处

Mimblewimble的革命性同样也限制了它。几乎所有协议,如比特币、以太坊等,都使用基础脚本语言,在真实交易中调用函数,告知验证者验证哪个脚本。最简单的情景是,输入调用“脚本签名(scriptSig)”,得出交易签名和公钥。输出脚本用脚本签名、交易签名和公钥,检查验证者是否具有花费交易的权利。验证人用已知公钥进行哈希,检查哈希过后的值是否与输出的哈希值相同,如果相同,则检查交易签名与输入签名是否一致。

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

比特币网络可以增添Mimblewimble,如此一来,比特币协议可以验证多个签名、在规定的时间内锁定交易,以及完成一些复杂实现。比如将比特币锁定在一个账户中,直到被解开。

为了达到像以太坊这样被广泛应用的公用智能合约影响力,需要公开数据,或者创建屏蔽证明来证明您满足智能合约条件。

在Mimblewimble中,由于使用全盲因子作为密钥对,极大地简化了签名验证过程,因此基础协议无需编写正常脚本。区块链上记录的是:

干货 | Mimblewimble如何保证交易的安全性?它又有何缺点

· 使用的输入:旧提交中的计算

· 新输出:公布的新提交

· 交易内核:包含超出的全盲因子、交易费和锁定高度的交易签名。

三者互不关联,也无法用此数值计算出另一者数值。

通过无脚本脚本创造性地弥补了Mimblewimble的缺陷,通过施诺尔签名,实现多签名交易和更复杂的交易,比如跨链原子互换,甚至闪电网络式的状态通道。但这不能满足物联网智能合约的要求。

最重要的一点是,实现cut-through将会删除智能合约,或依赖于合约的交易。

如你所见,MImblewimble成功地隐藏数额和所有者,但仅限于一维数据点——数量(quantity)。而转移代币所有权范围外的事情,则超出了它的能力范围。

原著 | Grayblock

翻译 | 头等仓_Tracey

原文:https://medium.com/coinmonks/mimblewimble-in-iot-72cdec6bedec

稿源(译):​https://first.vip/shareNews?id=1694&uid=2

根据国家《关于防范代币发行融资风险的公告》,大家应警惕代币发行融资与交易的风险隐患。

本文来自LIANYI转载,不代表链一财经立场,转载请联系原作者。

发表评论

登录后才能评论