前言:椭圆曲线加密是区块链的基础技术之一,而Mimblewimble是对它的优雅应用,它使用Pedersen commitment实现完全保密交易,并消除了对地址和私钥的依赖。同时,它与Bulletproofs相结合,带来了更轻量的匿名和隐私,这对于物联网同时实现扩展性和隐私保护来说有重要的意义。本文作者Grayblock,由“蓝狐笔记”社群的“鑫鑫”翻译。
2017年和18年主要关注可扩展性的话题。各种分叉和项目都把“扩展性”作为他们专属的口头禅。这场辩论给我们带来了解决方案,并向我们表明,当和未来的计划结合在一起的时候,就可以满足当前的需求。未来几年的重点将是匿名性和同质性的大规模采用。
在快速发展的互联数据世界中,隐私正成为一个非常重要的话题。事实上,我们将隐私权委托给中心化的公司,其安全性通过你的密码强度以及攻击者破解密码需要付出的努力来保证。随着我们进入互联网的新时代,所有东西都是相互连接的,无须中介的信任和加密隐私必须成为其所依赖一切的基础。在未来,面临风险的不仅仅是照片和信用卡号码,而是你与之交互的一切,以及它所收集的数据。
如果目标是在一个去中心化和无须中介信任的网络中做到这一点,那么面临的挑战将是找到一系列适用性的解决方案,这些解决方案具有生态系统的多样性并能匹配所预测的规模。了解到这一点,INT已经开始研究如何在其网络中实施两种不同的隐私协议,以及搞定物联网的两个主要需求:可扩展的隐私交易和隐私智能合约。
Mimblewimble
Mimblewimble是和椭圆曲线加密技术具有相同元素的一种全新的实现,后者是大多数加密货币的基础。
2016年8月,在bitcoin-wizards IRC频道,一位匿名用户发布了一个白皮书的Tor链接,声称它是“一种改进比特币隐私的想法”。紧接着是一个区块链提案,它使用的交易结构与今天看到的任何方案都完全不同,创造了迄今为止看到的椭圆曲线加密技术最优雅的用途之一。
虽然发布的白皮书足以阐述支持该理论的想法和推理,但它不包含明确的数学或者安全性分析。Blockstream的数学家兼研究总监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)
Or
input(4A44DC15364204A80FE80E9039455CC1608281820FE2B24F1E5233ADE6AF1DD5, Alice) ->
output(19581E27DE7CED00FF1CE50B2047E7A567C76B1CBAEBABE5EF03F7C3017BB5B7, Bob)
output(EF2D127DE37B942BAAD06145E54B0C619A1F22327B2EBBCFBEC78F5564AFE39D, Alice)
如上图所示,后面的进行哈希过的值看起来和其他内容一样有效,却导致Alice创造了4个币作为交易找零。在任何交易中,输入之和必须等于输出之和。我们需要某种方法对这些进行哈希过的值进行数学运算,以证明:
commit(bf1,x) = commit(bf2,y1) + commit(bf3,y2)
如果是有效的交易,则:
commit(bf1,x) - commit(bf2+bf3,y1+y2) = commit(bf1-(bf2+bf3),0)
或者仅仅是剩下的盲因子的承诺。
由于哈希算法的特性,这是不可能实现的。为了验证这一点,我们必须公开所有的盲因子和金额。但是这样做,就没有秘密可言了。那么,我们如何才能公开一个由私有值生成的值,既不能逆向推导私有值,又仍然能验证它满足某些条件?听起来有点像公钥和私钥加密…
我们在椭圆曲线密码学入门中学到的是,通过使用椭圆曲线来定义我们的数字空间,可以使用曲线上的一个点G,将其乘以任意数字x,得到的是同一曲线上的另一个有效点P。这个计算是很快的,但是根据结果点和公开的生成元点G,几乎不可能计算出使用了什么乘数。这样我们就可以用点P作为公钥,数字x作为私钥。有趣的是,它们还具有可加和可沟通的奇妙特性。
如果取点P等于x G,点Q等于y G,它们相加的结果点W=P+Q等于用数字组合x+y创建的一个新点:
这个性质称为同态,允许我们用我们不知道的数字做数学运算。
因此,如果在承诺中不使用原始的金额和盲因子,而是将它们乘以椭圆曲线上的已知生成元点,我们的承诺现在可以定义为:
这被称为Pedersen承诺,是所有保密交易的核心。
我们把盲因子称为r,金额称为v,并使用同一椭圆曲线上的生成元点H和G(不深入讨论Schnorr签名,出于验证的目的,我们只接受在盲因子和金额的承诺中使用两个不同的点)。代入我们之前的承诺中:
而私钥则是盲因子之间的差值。
所以,如果输入之和减去输出之和在曲线上产生了一个有效的公钥,则表明这些值已经平衡到了零,并且没有币被创造出来。如果结果差值不是这种形式:
对于某个剩余盲因子,它将不是曲线上的有效公钥,我们会知道它不是一个平衡的交易。为了证明这一点,用这个公钥对交易进行签名以证明交易是平衡的,并且所有的盲因子都是已知的,在这个过程中,没有泄露交易的任何信息。
以上所有的讨论都假设这些数字是正的。使用负数同样可以创建一个有效的平衡的交易,允许用户在每笔交易中创造新币。这被称为范围证明,每笔交易必须伴随一个零知识论证以证明私有承诺值位于预定的取值范围内。
Mimblewimble和Monero都使用了Bullet Proofs,这是一种新的计算证明的方法,它将交易的大小减少了80-90%。
(当前网络中看到的平均交易大小,假设MW的交易大小平均是2个输入2.5个输出)
到目前为止,所描述的协议在Mimblewimble和Monero之间或多或少是相同的。差异点是如何对交易进行签名。
在Monero中,有两组密钥/地址,即支付密钥和查看密钥。支付密钥用于生成签名交易,而查看密钥用于“接收”交易。交易是用一种被称为环签名的方法进行签名的,该签名由花费的输出产生,证明密钥组中的一个密钥拥有支付密钥。这是通过使用你的私钥创建一个组合的Schnorr签名,以及使用以前交易的公钥创建的混合诱饵签名者来完成。这些诱饵签名者在数学上都是等效的,从而导致无法确定哪个是真正的签名者。由于Monero使用了上面提到的Pedersen承诺,因此这些地址从不公开可见,仅用于索赔、交易签名和产生盲因子。
另一方面,Mimblewimble不使用任何类型的地址。没错,没有地址。这是协议的真正亮点。Jedusor证明了Pedersen承诺和对零承诺中的盲因子可以作为一次性公钥/私钥对来创建和签名交易。
使用椭圆曲线加密的所有基于地址的协议都以基本相同的方式生成公钥-私钥对。通过将一个非常大的随机数(k_priv)乘以椭圆曲线上的一个点(G),其结果(K_pub)是同一曲线上的另一个有效点。
这是所有地址生成的核心。看起来熟悉吗?
回忆一下上面的承诺:
每个盲因子乘以生成元点G(红色)就是它!r G是私钥r的公钥!因此,我们可以使用这些盲因子来构建签名以证明我们拥有输入和输出,而不是使用地址。
这种看似微小的变化消除了地址的关联性以及对使用scriptSig过程来检查签名有效性的需求,大大简化了保密交易的结构和大小。当然,这意味着(此时)交易过程需要各方之间的交互来创建签名。
CoinJoin
尽管所有地址和金额现在都隐藏起来了,但仍然有一些信息可以从交易中收集。在上面的交易格式中,仍然可以清楚地看到哪些输出被消耗,交易产生了哪些输出。这个“交易图”可以揭示有关盲因子所有者的信息,并根据所看到的交易活动构建用户画像。为了进一步隐藏和压缩信息,Mimblewimble实现了来自Greg Maxwell的叫做CoinJoin 的想法,它最初是为比特币开发的。
CoinJoin是一种将多个交易的多个输入和输出组合在一起的无信任方法,将它们连接到一个交易中。这样做是为了掩盖哪个发送者支付给哪个接收者。要在比特币中实现这一点,用户或钱包必须进行交互以加入相同数量的交易,这样你就无法区分两者。如果能够在不共享私钥的情况下组合签名,那么就可以为许多交易(类似于环签名)创建组合签名,而不需要受到相同数量的约束。
(在这个CoinJoin交易中,3个地址拥有4个输出,无法把地址和输出关联起来)
在Mimblewimble中,对一个或多个交易执行余额计算仍然可以得到有效的对零承诺。我们需要做的是为合并的交易创建一个组合签名。Mimblewimble天生就能够为这些使用Schnorr签名构造的承诺构建组合签名。使用“单向聚合签名”(OWAS),节点可以在创建区块的同时将交易组合为具有聚合签名的单个交易。使用该方法,Mimblewimble将区块级别的所有交易连接起来,将每个区块作为包含所有消耗的输入和创建的输出的一个大交易来创建。这同时模糊了交易图,并且具有移除区块内消耗的中间交易的能力,减小了区块的总大小和区块链的大小。
切断(Cut-through)
我们可以更进一步。为了验证这个完全“连接”的区块,节点将把所有的输出承诺加在一起,然后减去所有的输入承诺,并验证结果是否是有效的对零承诺。为什么我们只连接同一个区块内的交易呢?理论上,我们可以组合两个区块,删除在这些块中创建和使用的任何交易,结果还是一个有效的交易,它只包含未消耗的承诺,而没有其他内容。然后我们可以一路回到创世块,将整个区块链缩减到一个未消耗承诺的状态。这被称为切断。
在执行该操作时,我们不需要保留已消耗输出的范围证明,它们已经经过了验证,可以丢弃。这将会导致区块链增长的大幅减少,将增长从O*(交易数量)减少到O(未消耗输出数量)。
为了说明这一点的影响,让我们设想一下,如果Mimblewimble从一开始就在比特币网络中实施,网络位于576000高度,区块链大约为210 GB,总交易量为413675000,总未花费输出量为55400000。在Mimblewimble中,交易输出约为5 kB(包括范围证明~5 kB和Pedersen承诺~33字节),交易输入约为32字节,交易证明约为105字节(对零承诺和签名),区块头约为250字节(Merkle证明和PoW),非保密交易可以忽略不计。对于完全同步所有信息的区块链来说,这意味着高达惊人的5.3 TB,其中“只有”279 GB是UTXOs。
当我们执行“切断”时,不希望丢失交易的所有历史记录,因此我们保留所有交易以及UTXO集合和所有区块头的证明。这将区块链减小到322 GB,大小减少了94%。结果基本上是一个完全一致的状态,只有那些拥有完整历史证明的未花费承诺,大大减少了新节点的同步时间。
如果实现了Bulletproofs,范围证明可以从5 kB减小到1 kB,从而将上例中的UTXO集合从279 GB缩减到57 GB。
(基于上面的假设和计算)
在具有明确最终性的PoS区块链中也有一个有趣的含义。一旦获得了最终性,或者在超过它的任意区块链深度上,就不再需要保留范围证明。这些交易已经过验证,并在其之上构建了共识状态,它们占据区块链大小的绝大部分。
在这个例子中,最终性发生在100区块深度上,并且假设UTXO集合的10%处于准最终状态,这将使区块链大小再减少250 GB,使得完全同步只需要73 GB,减少了98.6%(就算和当前状态相比也减少了65%)。想象一下吧。一个73 GB的区块链,用于10年的完全匿名比特币交易,是当前区块链大小的三分之一。
需要注意的是,切断不会影响隐私或者安全性。每个节点可以选择是否存储整个链,而不执行任何切断操作,唯一的成本是增加了磁盘存储需求。切断纯粹是一种可扩展性功能,使得基于Mimblewimble的区块链平均比比特币小三倍,比Monero小十五倍(即使最近实现了Bulletproofs)。
这对物联网来说意味着什么?
物联网网络中的交易需要速度、能扩展到巨大容量、适应各种用途和设备,并能够保持敏感信息的私密性。到目前为止,物联网网络只专注于扩展,创建的网络可以在不同程度的去中心化和不关注隐私的情况下进行海量交易。如果没有隐私,这些网络只会让那些使用它的人成为向攻击者提供弹药的目标。
Mimblewimble革命性地使用椭圆曲线加密技术为我们带来了一个隐私协议,它使用Pedersen承诺进行完全保密交易,在这个过程中,消除了我们对地址和私钥的依赖。该交易框架与Bulletproofs相结合,带来了轻量级的隐私和匿名性,与Monero不相上下,如果充分使用“切断”的话,区块链大小可以减小15倍。这为满足INT网络可扩展性要求的隐私交易提供了解决方案。
Grin和Beam这两种不同的实时网络中已经实现了Mimblewimble协议。两者都是纯粹的交易型网络,专注于隐私和匿名的价值转移。Grin采用了一种类似比特币的方式,通过社区资助开发,无预挖或者创始人奖励,而Beam则以创业的心态,利用风险投资资助开发,高度重视用户体验。
另一方面,INT正在研究在主链上实现该协议,所有INT资产转移都以隐私的方式创建,或者作为可选的附加子链,允许用户将他们的INT从非隐私链转移到隐私链,反之亦然。
不足之处
协议的革新之处同时也是限制它的东西。几乎所有协议,如比特币、以太坊等,都使用基本的脚本语言,在实际交易数据中调用函数,告诉验证者使用什么脚本来验证它。
在最简单的情况下,随输入提供的数据调用“scriptSig”,并提供两部分数据,即与交易相匹配的签名和证明你拥有对应私钥的公钥。输出脚本使用提供的数据及其传递的逻辑,向验证者显示如何证明允许他们进行消费。使用提供的公钥,验证者计算哈希并检查是否与输出中的公钥哈希相同,如果相同,就可以确保提供的签名与输入签名相匹配。
该验证协议允许一些有限的脚本能力,以便告诉验证者如何处理所提供的数据。比特币网络可以通过更新功能,使其适应新的流程或数据。使用该方法,比特币协议可以验证多个签名,在定义的时间跨度内锁定交易,并执行更复杂的操作,如在帐户中锁定比特币,直到采取一些外部操作。
为了实现更广泛适用的公开智能合约(如以太坊的智能合约),需要以非屏蔽的方式提供数据或者创建屏蔽证明来证明你满足智能合约的条件。
在Mimblewimble中,由于使用了盲因子作为密钥对,大大简化了签名验证过程,基本协议中没有正常的编写脚本的机会。区块链上记录的只是:
使用的输入——花费了的旧承诺
新的输出——要发布的新承诺
交易内核——包含多余的盲因子、交易费和锁定高度的交易签名
而且这些项目不能相互关联,并且不包含任何有用数据来驱动操作。
对于这个问题,有一些创造性的解决方案建议通过执行所谓的无脚本脚本来实现。通过利用所使用的Schnorr签名的属性,可以实现多签名交易和更复杂的基于条件的交易,如原子跨链交换,甚至可能是闪电网络类型的状态通道。然而,这还不足以满足物联网智能合约的所有需求。
基于以上的分析,实现切断可能会删除智能合约交易或依赖它们的交易。
因此,你可以看到,在这种设计中,我们可以成功地隐藏值和所有权,但仅限于一维数据点和数量。做任何比转移代币所有权更复杂的事情都超出了它的能力范围。但是所有权证明和对零承诺实际上只是一种特定类型的零知识证明(ZK)。那么,如果我们不去隐藏一个值,而去隐藏一个证明呢?
|