物联网中的Mimblewimble——在INT Chain交易中
本文来自美国波音公司技术工程师,针对INT Chain的匿名和隐私所写的专业文章。文章为翻译版本,可能存在一些纰漏。但作为INT Chain这个以“用力驱动”,工程师路线发展的项目而言,我们还是很期待的。下面就就来看看INT Chain的你们和隐私技术和Mimblewimble。

2017年和18年是集中讨论规模问题的年份。分叉硬币和项目作为口头禅被大肆宣传。这场辩论给我们带来了解决办法,并表明,当与未来计划相结合时,我们现在所处的位置满足了当前的需要。未来几年的重点将是大规模的采用匿名性和可替代性。
在快速发展的互联数据世界中,隐私正成为一个至关重要的话题。 就目前而言,我们信任中心化公司,将隐私存储其中,因为密码的强度以及破解密码的难度确保了隐私的安全。随着我们进入互联网的新时代,所有事物都连接在一起,去信任和加密隐私必须成为其所依赖的基础。在未来,面临风险的不只是照片和信用卡号码,而是你与之互动的一切以及它所收集的数据。
如果目标是在去中心化的、去信任的网络中实现以上这一目标,我们面临的挑战将是找到具有一系列适用性的解决方案,这些解决方案既具有生态系统的多样性,又具有与所预测的规模相匹配的能力。已知这一点后,INT开始研究在他们的网络中实施两种不同的隐私协议,这两种协议满足了物联网的两个主要需求:可扩展的私人交易和私有智能合同。
INT正在研究的隐私协议之一是Mimblewimble。 Mimblewimble与椭圆曲线加密具备相同元素,也是大多数加密货币的基础。但是 Mimblewimble是一种新的实现方式。

在2016年8月的比特币奇才IRC频道中,一位匿名用户在白皮书上发布了Tor链接声称“改善比特币隐私的想法。” 随后发布了一项区块链提议,该提议使用了一种与今天所见的截然不同的交易结构,创造了迄今为止最优雅的椭圆曲线加密应用之一。
虽然发布的白皮书足以阐释这一理论,但它没有包含明确的数学或安全分析。AndrewPoelstra,一位数学家,也是Blockstream的研究主任,立即开始分析它的优点。在接下来的两个月里,他编写了一份详细的白皮书[Poel16],概述了创建独立区块链所涉及的密码学、基本定理和协议。
协议的主要作用是完全隐藏交易中的价值,消除对地址的需要,同时解决扩展(规模)问题。
机密交易
假设你想隐藏发送的金额。目前我们所熟悉的,并且能够快速的隐藏信息的方式是:哈希!哈希散列只能明确地生成一个长度不变的随机字符串,并且无论输入的数字大小如何,这都是不可能逆转的。然后,我们可以在交易中发送哈希散列。
X = SHA256(amount)
Or 或者
4A44DC15364204A80FE80E9039455CC1608281820FE2B24F1E5233ADE6AF1DD5 = SHA256(10)
但由于散列是确定性的,所以有人必须做的是为所有可能的数量编目所有散列,并且首先这样做的整个目的将无效。因此,让我们先将这个数值乘以一个私有的致盲因子,而不是只对数量进行哈希运算。如果保密,则无法知道哈希中的数量。
X = SHA256(blinding factor * amount)
这被称为承诺,你是在承诺一个价值,而不透露它,并且在不改变承诺的结果价值的情况下,它是不能改变的。
那么节点如何使用这个承诺方案来验证交易呢?至少,我们需要证明你满足两个条件:第一,你有足够的硬币,第二,你没有在这个过程中创造硬币。大多数协议验证这一点的方式是使用以前的输入交易(或多个),并在此过程中创建一个不超过输入总和的输出。如果我们散列这些值,并且没有办法验证这个条件,人们就可以凭空创建硬币。
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)
which, if it is a valid transaction would be:
如果它是一个有效的交易,将是:
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签名,我们只接受为了验证目的,我们必须使用两个不同的点来表示致盲因子和价值提交*)。将这一点应用于我们以前的承诺:

并使用交际属性:

对于有效的交易,这将等于:

ri,vi是输入的值,ro,vo是输出和rco的值,vco是变化输出的值。
由此产生的差异只是对多余的致盲因素的承诺,也称为承诺为零


您可以看到,在随机选择致盲因子的任何情况下,提交为零将为非零,实际上,它仍然是具有公钥的椭圆曲线上的有效点,而私钥则是致盲因素的区别。
因此,如果输入的和减去输出的和在曲线上产生一个有效的公钥,您就知道这些值已经平衡到零,并且没有创建硬币。如果产生的差异不是形式上的差异,请执行以下操作:

对于一些过度致盲因子,我们知道它不是曲线上的有效公钥,也不是一个平衡的交易。为证明这一点,我们使用此公钥对交易进行签名,以证明交易是平衡的,并且所有致盲因子都是已知的。在此过程中,没有透露有关交易的信息(签名过程的详细步骤可以 请阅读[Arvan19])。
所有上述工作都假定数字为正数。人们可以创建同样有效的负数的平衡交易,允许用户在每次交易中创建新的硬币。这被称为范围证明,每个交易必须伴随知识的零知识参数,以证明私有提交的值位于预定的值范围内。Mimblewimble和Monero一样使用防弹法,这是一种计算证据的新方法,它将交易规模减少了80-90%。

到目前为止,所描述的协议在Mimblewimble和Monero之间或多或少是相同的。偏差点是交易签署的方式。
在Monero中,有两组秘钥/地址,支出秘钥和视图秘钥。支出密钥用于生成和签署交易,而视图密钥用于“接收”交易。交易使用环签名进行签名,环签名是从支出的输出中派生出来的,证明了一组密钥中拥有支出密钥。这是通过使用您的私钥和先前交易的公钥的混合诱饵签名者创建组合的Schnarr签名来完成的。 这些诱饵签名者在数学上同样有效,导致无法确定哪一个是真正的签名者。由于Monero使用上文显示的Pedersen承诺,地址永远不会公开显示,但仅用于声明,签署交易和生成致盲因素。
另一方面,Mimblewimble不使用任何类型的地址。这是该协议的亮点。Jedusor证明了Pedersen提交中的致盲因子和承诺为零可以用作一次性公钥/私钥对来创建和签署交易。
所有使用椭圆曲线加密的基于地址的协议以本质上相同的方式生成公私密钥对。通过将非常大的随机数(K_Priv)乘以椭圆曲线上的点(G),得到的结果(K_PUB)是同一条曲线上的另一个有效点。

这是所有地址生成的核心。这看起来眼熟吗?请记住从上面提交的以下内容:

每个致盲因子乘以发电机点G(红色)。 r•G是私钥r的公钥! 因此,我们可以使用这些致盲因子证明我们拥有输入和输出,使用值进行签名,而不是使用地址。
这个看似微小的变化消除了地址的可链接性以及在scriptSig流程检查签名有效性的必要性,这极大地简化了机密交易的结构和大小。 当然,这意味着(此时)交易过程需要各方之间的交互来创建签名。
即使现在隐藏了所有地址和金额,仍然可以从交易中收集一些信息。
在上述交易格式中,仍然可以清楚地看到使用了哪些输出,以及交易产生了哪些输出。该“交易图”揭示了致盲因子的所有者的信息,并在所看到的交易活动基础上构建用户的图片。为了进一步隐藏和浓缩信息,Mimblewimble实现了GregMaxwell的一个想法,称为CoinJoin[Max13],最初是为在比特币中使用而开发的。CoinJoin是一种去信任的方法,用于组合多个交易的多个输入和输出,并将它们连接成一个交易。这样做的目的是掩盖哪个发送者支付了哪个接收者。要在比特币中实现这一点,用户或钱包必须交互,以加入类似数量的交易,因此你无法区分两者。如果您能够在不共享私钥的情况下组合签名,则可以为许多交易(如环签名)创建组合签名,而不受需要相同数量的约束。

在Mimblewimble中,对一个交易或许多交易进行余额计算仍然可以实现有效的提交到零。 我们需要做的就是为组合交易创建组合签名。 Mimblewimble可以通过Schnorr挑战交易构建提交来构建这些组合签名。 使用“单向聚合签名”(OWAS),节点可以在创建块的同时将交易组合成具有一个聚合签名的单个交易。使用此方法,Mimblewimble在数据块级别加入所有交易,有效地将每个数据块创建成一个包含所有消耗的输入和创建的所有输出的大交易。这同时模糊了交易图,并删除在数据块期间花费的中间交易,从而减少数据块的总大小和块链的大小。
为了进一步验证这个完全“加入”的块,节点将把所有的输出承诺加在一起,然后减去所有的输入承诺,并验证结果是有效的提交到零。是什么阻止了我们仅仅加入一个块中的交易?从理论上讲,我们可以组合两个块,删除在这些块中创建和使用的任何交易,其结果同样是一个只包含未使用的承诺而不是其他任何内容的有效交易。然后,我们可以一直这样做,回到创世纪块,将整个块链减少到只有一种未使用的承诺状态,这称为直通切换。这样做的时候,我们不需要保留已用过的输出的范围证明,它们已经被验证并且可以被丢弃。这就大大减少了区块链的增长,将增长从O(txs的数量)减少到O(未用输出的数量)。
为了证明这种影响,让我们假设如果Mimblewimble从一开始就在比特币网络中实施,网络位于576,000块,区块链大约为210 GB,总交易量为413,675,000,总未使用输出为55,400,000。在Mimblewimble中,交易输出大约为5 kB(包括范围证明~5 kB和Pedersen提交~33个字节),交易输入大约是32个字节,交易证明大约是105个字节(提交到零和签名),块头是约250字节(Merkle证明和PoW)和非机密交易可以忽略不计。对于所有信息的完全同步区块链,这总计达到惊人的5.3 TB,其中“仅”279 GB是UTXO。当我们切换时,我们不希望丢失所有交易的历史记录,因此我们保留所有交易的证明以及UTXO集和所有块头。这将区块链减少到322 GB,尺寸减少了94%。结果基本上只是一个完整的证据历史记录中没有花费的共识状态,大大减少了新节点的同步时间。
If Bulletproofs are implemented, the range proof is reduced from over 5kB to less than 1 kB, dropping the UTXO set in the above example from 279 GB to 57 GB.
如果实施防弹功能,则范围证明从5kB以上降至1kB以下,将上述示例中的UTXO集从279 GB降至57 GB。

PoS区块链中还有一个有趣的含义,具有明确的终结性。一旦获得最终结果,或者在某个超出它的任意区块链深度,就不再需要保留范围证明。这些交易已得到验证,共识状态已建立在它之上,它们占区块链规模的绝大部分。如果我们在这个例子中说终点发生在100块深度,并假设10%的UTXO集是预定的,这将使区块链大小减少另外250 GB,导致完全同步权重为73 GB,减少98.6%(甚至比目前状态下降65%)。 想象一下,一个73 GB的区块链,用于10年完全匿名的比特币交易,以及当前区块链大小的三分之一。
值得注意的是直通切换对隐私或安全没有影响。每个节点可以选择是否存储整个链而不执行任何直通切换,唯一的成本是增加磁盘存储要求。 直通切换纯粹是一种可扩展性功能,导致基于Mimblewimble的区块链平均比比特币小三倍,比Monero小十五倍(即使最近实施了防弹功能)。
物联网中的交易需要速度,可扩展到极大的数量,以及适应各种用途和设备,并能够保持敏感信息的私密性。到目前为止,物联网网络只专注于扩展,所创建的网络可以在不同程度上分散而不注重隐私的情况下进行大量的交易。在没有隐私的情况下,这些网络只会让那些使用它的人成为攻击目标,为攻击者提供弹药。
Mimblewimble对椭圆曲线密码的革命性使用为我们带来了一个隐私协议,该协议使用Pedersen承诺进行完全保密的交易,并在此过程中消除了我们对地址和私钥的依赖。这种与防弹功能相结合的交易框架带来了轻量级的隐私和匿名性,与Monero不相上下,在一个比Monero小15倍的区块链中,使用了完全直通切换的方式。这为满足INT网络可伸缩性要求的私有交易提供了解决方案。
Mimblewimble协议已在两个不同的实时网络(GRIN和BEAM)中实现。这两个网络都是纯粹的交易网络,侧重于私有和匿名的价值转移。GRIN采取了一种类似比特币的方式,社区资助的开发,没有预先采矿或创始人奖励,而BEAM有创业的心态,有风险投资,并非常强调用户友好的体验。
另一方面,INT正在研究在主链上实现此协议,创建所有INT资产转移私有或作为可选的附加子链,允许用户随意将其INT从非私有链转移到私有链,反之亦然。
这项协议之所以具有革命性,是因为同样的原因限制了它。几乎所有的协议,如比特币、以太坊等,都使用一种基本的脚本语言,在实际的交易数据中调用一个函数,告诉验证者使用什么脚本来验证它。在最简单的情况下,输入中提供的数据调用“scriptSig”并提供两个数据片段,一个是匹配事务的签名,另一个是证明您拥有创建它的私钥的公钥。输出脚本使用随其传递的逻辑提供的数据,以向验证器展示如何证明它们可以使用这些数据。使用提供的公钥,验证器随后对其进行散列,检查它是否与输出中的散列公钥匹配,如果匹配,则检查以确保提供的签名与输入签名匹配。

这种验证协议允许某种有限的脚本编写能力,能够告诉验证器如何处理所提供的数据。比特币网络可以更新为新的功能,使其能够适应新的流程或数据。利用这一点,比特币协议可以验证多个签名,在定义的时间范围内锁定交易,并执行更复杂的事情,如在帐户中锁定比特币,直到采取一些外部行动。
为了实现更广泛适用的公共智能合同(如以太坊中的那些),它们需要以非屏蔽方式提供数据,或者创建能够证明您满足智能合同条件的屏蔽证明。
在Mimblewimble中,由于使用了致盲因子作为密钥对,大大简化了签名验证过程,因此在基本协议中没有正常的脚本编写机会。区块链上记录的内容如下:

而且,这些项目都不能相互关联,也不包含任何可驱动操作的有用数据。
我们可以通过执行无脚本†来解决这个问题。通过利用所使用的Schnorr签名的特性,您可以实现多个交易和更复杂的基于条件的交易,如原子交叉链交换,甚至可能是闪电网络类型的状态通道。但是,这还不足以满足物联网智能合同的所有需求。
而且,最重要的是,实施直通切换可能将删除智能合约或依赖它们的交易。
因此,您可以看到,在该设计中,我们可以成功地隐藏值和所有权,但仅限于单个维度数据点,即数量。做任何比转移硬币所有权更复杂的事情都超出了它的能力范围。但是所有权和承诺为零的证明实际上只是一种特定类型的零知识(ZK)证明。那么,如果我们忽略了一个证据,而不是使一个值变得盲目,那又会怎样呢?
本系列的第2部分将介绍如何与zkSNARKs实施私人智能合约。
参考文献:
https://github.com/ignopeverell/grin/blob/master/doc/intro.md
https://github.com/mimblewimble/grin/blob/master/doc/pow/pow.md
https://github.com/mimblewimble/grin/wiki/Grin-and-MimbleWimble-vs-ZCash
*https://bitcointalk.org/index.php?topic=305791.0
[poel16] http://diyhpl.us/~bryan/papers2/bitcoin/mimblewimble-andytoshi-INCOMPLETE-DRAFT-2016-10-06-001.pdf
** In order to prove that v=0 and therefore the commit to zero, in fact, has no H component without revealing r, we must use Schnorr protocol:
prover generates random integer n, computes and sends point 𝑇←n𝐻
verifier generates and sends random integer 𝑖
prover computes and sends integer 𝑠←𝑖𝑏+n modq, where q is the (public) order of the curve
verifier knowing point r𝐻 computes point 𝑖(r𝐻), then point 𝑖(r𝐻)+𝑇; computes point 𝑠𝐻; and ensures 𝑖(r𝐻)+𝑇=𝑠𝐻.
[Arvan19] https://medium.com/@brandonarvanaghi/grin-transactions-explained-step-by-step-fdceb905a853
[Bulletproofs] https://eprint.iacr.org/2017/1066.pdf
[Max13] https://bitcointalk.org/?topic=279249
[MaxCT]https://people.xiph.org/~greg/confidential_values.txt
[Back13]https://bitcointalk.org/index.php?topic=305791.0
† http://diyhpl.us/wiki/transcripts/grincon/2019/scriptless-scripts-with-mimblewimble