Loading...

Qtum研究院 | 浅析 MimbleWimble Scriptless Scripts

2019-11-26 09:30

正文共 4,042 字

预计阅读时间:20 分钟

本文为Andrew Poelstra关于Mimblewimble无脚本脚本(Scriptless scripts)的演讲实录。(英文原版请点击文章末尾阅读原文查看)

以下为原文译文:
历史

大家好,我是Andrew Poelstra。首先让我先简要介绍一下Mimblewimble的历史。在座的很多人都知道,Mimblewimble是在2016年被一个化名为”Tom Elvis Jedusor”的人提出来的,名字是伏地魔的法语名,此人在此之后便再未出现过。在Mimblewimble里没有脚本(scripts),方案里最接近比特币脚本的东西其实就是那些数字签名。这些签名仅仅是非常基础的密码学签名,用来验证支付人的数字货币所有权。这个方案无法实现多重签名、时间锁或者哈希原像。当时也不知道能用这种技术来实现闪电网络,因为闪电网络需要复杂的脚本支持。

“伏地魔”在他的文档末尾提到,他想要找到一种方法将脚本操作转换成离散的日志操作(discrete log operation)并把这些基础的密码学签名和Schnorr签名带上脚本系统的语义,但还不清楚实现的可能性有多大。这种实现方法就是无脚本脚本。这是“伏地魔”对于问题的直接答案,Mimblewimble是一种将脚本操作转换成离散日志的方法。

Mimblewimble内核(Kernel)

下面我简要说明一下比特币、以太坊和UTXO形式的加密货币它们的基本工作原理。区块链的状态是一个巨大的未花费输出列表,包括未花费输出的数量和某种相关联的密码学密钥。这种密钥是脚本公钥,想要花费某些加密货币就必须满足某些脚本。通常这只需要一个数字签名就能实现,但是也可以加上时间锁、哈希原像等其他要求。这就是我们在比特币上能得到的功能,但是在Mimblewimble里无法实现。

我们能在这些区块链上使用上面提到的这些功能来做任何想做的事情,但是仍然存在隐私、扩展性等方面的问题。这是在比特币这里留下来的开放性研究问题:我们要怎样改善隐私和可交换性?无脚本脚本很酷的一点是它在对于解决隐私方面的问题有巨大帮助,同时也改善了可扩展性和可交换性。

Mimblewimble仍然是一个UTXO基础的区块链模型。我们仍然有很多未花费输出。你需要从列表里选择一些数字货币,用这些货币作为输入生成一个交易并形成一些新的输出,以销毁旧的货币,创造新的货币。

这些输出没有相关联的scriptpubkey或者公钥,这是Mimblewimble的要求。如果你把输出加起来减去输入,数量的结果应该是零。因为Mimblewimble的输出没有数量,他们只有数量的承诺(commitment),所以如果你减去你的各项承诺,最终的计算结果一定为零。这里我略过了很多密码学的内容,主要用到的一个技术是同态承诺,这是一种简洁的代数性质。

还有一种更简洁的代数性质:只有在使用多重签名密钥时,承诺才会为零。这里有一个同态承诺系统和一个签名系统,这就是内核。Mimblewimble转账与通常的转账看起来很相似,有一个内核挂起(hang off),还有一个内核证明正在挂起。这是一个任何人都可以验证的证明,证明内容是这个对象实际上是一个为零的承诺。这个证明通常看起来像一个多重签名,也可以进行两次用作授权(authentication)。

最厉害的部分是:你可以批量地、非交互地把所有转账的所有输入从所有输出中减去。这些输入和输出看起来像同一个转账的两个部分,但在转账验证中去掉这些并不影响什么。在等式右边或左边有一些东西,加上或不加那部分并没有区别。当然,我的核心仍然存在。

在Mimblewimble里,你在区块链上的每笔转帐里都是通过这样的步骤来实现。仅剩的输出是现有的未花费输出。仅剩的输入是coinbase。这带来了很多可扩展性。基本上只有内核留了下来。

如果你从区块链上删除这些数据,在你不能期望验证者能看到这些输出的情况下,怎么才能在输出上附加更多支付条件呢?长期来看,验证者唯一可能看到的东西就是这些内核。然而我们无法把内核与那些转账联系起来。它们是独立的、带证明的对象表明他们是和为零的承诺。除了时间分析、区块链分析或不可靠的秘密手段之外,没有东西能把内核与特定转账联系起来。

所以你怎么才能在这些上面附加脚本信息呢?让我从图片转换到代数,试着回答一下这个问题。

适配器签名(Adaptor Signatures)

这些内核证明看起来像Schnorr多重签名。在加密领域,我们谈论了很多Schnorr多重签名的事情。如果你签名了你的私钥,这就是一个私钥的零知识证明。Schnorr多签是一个Schnorr零知识协议的Fiat-Shamir转换。

在有多方(两方或者更多)时,把多方的公钥加在一起,得到一个新的、为之前公钥之和的公钥,就可以得到一个Schnorr多签。这里的加和是一个椭圆曲线操作,与同态承诺求和时的操作相同。这些操作会把公钥加在一起。当需要签名时,会生成两个独立的签名,然后再生成一个单独的签名。这个过程分为两个阶段:为了得到一个多重签名,各方需要对一个消息达成一致,然后交换随机数(nonce)(Schnorr签名的一半,一个只为这次签名生成的临时密钥对)。所以首先两方交换随机数,对随机数之和达成一致,然后生成签名。一旦随机数交换完毕,那么除了重新开始一个新的签名之外,完成这个签名的方法只能是生成一个独特的Schnorr签名。把这两个加起来就能得到得到最终的签名。

完成随机数交换过程之后,Schnorr签名在某种程度上就成了一种独特的签名。BLS签名也有这个性质。通过这种独特性,参与者能提出额外的秘密(secret)。在把秘密给对手方之前,他们能使用各自的部分签名将其加密。通过数学证明,参与者能验证存在被特定签名加密过的秘密。你生成你的部分签名,在上面加上秘密,然后把它给你的朋友。如果他知道了秘密,他就能减去秘密值得到签名。

所以我们能怎么利用这点呢? 乙方必须揭示秘密来完成协议。

原子跨链交换

Bob给了Alice一个适配器签名。这些是加密到签名里的秘密。Bob在两条链上把这些都给了Alice。在Bob贡献任何一个签名前,他都执行了加密过程。现在Alice知道,如果她看到签名给了她属于她的钱,或者说如果她看到签名给了Bob属于他的钱,那么如果她得到了秘密,她就可以生成一个签名得到她的钱。

这个签名过程完全是独立的,不依赖于支持任何加密或者挑战-解密类协议的区块链签名。由于备份问题,这个方案依赖于时间锁的存在,只需要区块链的一点点支持。

尤其重要的一点是,Mimblewimble内核足以支撑这些。

适配器签名的特性

适配器签名比人们一直以来在比特币和以太坊上实现这些的方法都要好,能用来做非常通用的东西。你可以在比特币上实现零知识证明的有条件付款,在签名私钥的过程中揭示秘密。加密密钥可以是事先承诺过的记载埋藏宝藏地点的秘密之类的东西。

你也可以把这些东西记载到链上,也可以实现类似闪电网络的系统。如果能以某种方式处理时间锁,你就能在Mimblewimble之上得到一个闪电网络类型的支付网络。当Mimblewimble论文刚出现时,我们中的大多数人都觉得这不可能。

还有重新致盲特性,你可以利用这里的这个代数结构。这使你能得到改进的隐私特性,能加入多条通道和随意的DAG形状。你能从中得到一个已经存在的输出,然后决定在之后的适配器签名中使用。

我会多讨论一些隐私方面的内容。我们有一个非常强力的隐私特性,叫做否认性。如果我拿任意两个找到的签名,就像Grin区块链上有的那些,我就能创造我自己的秘密加密值,生成一个完整的记录证明那些是原子转账,完成了一次原子互换。我能拿链上任意两个签名实现这一点说明这些记录没有意义,什么也证明不了。如果你在意原子互换的隐私性,特别是在闪电网络里,不想你的所有支付和财务联系都可见,并且被永久关联起来的话,那么这对你来说将会是一个非常重要的隐私特性,我们在闪电网络里为此努力了很久。

适配器签名的局限性

然后我要谈一下局限性。这依赖于Alice能看到区块链,能减掉她的和Bob的贡献。如果存在多方,就很难分清楚这点。很难把这点扩展到多签协议。只要两个人签名,如果你在进行一个三分之二的阈值签名就没有问题。

这点依赖于完整签名的公布。Dan Boneh刚刚说的三个特性之一是签名聚合。不幸的是,签名聚合破坏了这个系统。关于这点我们想了很多,但这很困难,看起来可能实现不了。但是别的所有事儿我们也这么说过,所以我并不担心这点。

见证者加密(Witness Encryption)

见证者加密是我比较喜欢的实现时间锁的方法。我在几张幻灯片之前提到,你可以实现特定条件的零知识证明付款。这里你可以实现一个适配器签名,而不用通过两次交易传递一个秘密,可以通过生成一个零知识证明表明秘密是某个NP问题的加密密钥,比如说另一条区块链上的一次完整转账,或者一个来自第三方的对于某条信息的签名,或者你从一张卫星图片上发现油田的证据。有很多奇怪的应用场景可以使用零知识证明。

但以上这些都要求各方知道他们在加密的秘密。尤其需要注意的是,这不仅要求他们知道秘密,还要求他们知道秘密怎么解决了它声称解决的问题。但是还有别的方法,叫做见证者加密。

见证者加密允许你加密一些问题的答案数据而不知道问题本身。这听起来很困难甚至不可能。我们过去曾经使用“非常困难”来描述零知识证明问题,但是我们现在已经能实现它了,所以我对此比较乐观。

2013年,一篇由Garg、Gentry、Sahai、Waters发表的论文表明,可以通过一种叫多线性图的方式实现见证者加密。我不知道是否存在没被破解的候选结构。使用见证者加密的方法,我能解决如下问题:从现在的区块链高度开始,我想要1000个区块,而且我想要加密这1000区块的证明,另外我还想要加密我的一个Mimblewimble签名以及一个通过使用比特币区块链作为时间预言机,提交一个未来的比特币区块,能让我在特定时间锁之后揭示的私钥。因此我们可以实现退款交易,并且只会在很远的未来生效。这是在任何时间预言机的帮助下都能够实现的设计,我认为这会是相对高效且能用密码学描述的。任何能提供有可预测密钥时间戳的时间戳服务都可以使用。我们不需要来自比特币,甚至Mimblewimble的支持,只需要参与协议的双方能够支持。

这非常令人激动。这基本是我们最快能看到的应用。我可以放在Mimblewimble上,让他们看看是否能证明剩下的假设,或者孪生的推测。这在理论上可以实现。

Mimblewimble里的时间锁

Mimblewimble的时间锁是我更喜欢的时间锁方案。当然还有别的途径,绝对的时间锁能通过内核将他们在区块链里的最小区块高度签名加到Mimblewimble上。

相对时间锁要困难得多,因为内核签名是独立于转账输出的,而转账输出甚至不保证能被验证者看到。

另外,Somsen与Friedenbach在2016的私人通讯中提到了一个内核引用的主意。

结语

让我们一起了解时间锁、使用BLS的无脚本脚本、3方以上多方无脚本脚本的方法,解决标准和可交换性。