干货 | 隐密交易的到来:深入 AZTEC 协议

Ajian   |     |   900 次阅读

保证交易的私密性是许多金融服务的基本要求,但由于以太坊无法提供这种隐私保护,所以没能出现令人信服的传统金融工具替代品。现在有几个区块链项目,试图利用加密技术来提供隐私服务,但是这些项目能提供的隐私保护对区块链“原生”加密货币的作用十分有限。换句话说,构建在公共区块链协议上的数字资产,仍旧无法得到这类交易私密性保证。比如说,我不能在以太坊上编写出债权不公开的公司债券智能合约。

至少到现在为止还做不到。

一个特殊的例子,私密 DAI

喏,让我们接着往下看:

{
    "gamma": "0x20a92d2a4f0dd850314a745719dde20934db69cc8e9b5b84b5819e062d66bb7500",
    "sigma": "0x17d62693c0c9a356e2fd6b0ce877b78c6a1f8a7f195e9db4c0b68e0693d73b3600"
}

DAI 是由 MakerDAO 创造的锚定美元的稳定币,上面这种纠缠在一起的字符,就是 DAI 的样子。不过它看起来有一点奇怪对吧?通常 DAI 会包含一组以太坊地址,及表示该地址持有 DAI 数量的数字;明显上面的不是常规的 DAI 。

如你所见,当我发送这笔交易时,我的以太坊地址( zac.creditmint.eth )变成了这笔 DAI 的持有者;但值得注意的是,没有人能够具体知道我拥有多少 DAI。和其他 DAI 持有者不同,我的 DAI 余额是经过加密的,并以 AZTEC 票据的零知识证明形式展现。我可以随意地将这些 DAI 发送到不同地址,同时没有人能看到我究竟发出去多少。比如,我在这笔交易中发了一些 DAI 给我的同事,如果想搞清楚我发了多少,祝你好运!

这一切都还非常新颖,我非常期待能将这个结果展现给你,以及广大以太坊社群。我们已经开发了将近一年时间,不过还未进行正式的发布,因为我想向大家解释清楚那些特殊的、纠缠在一起的十六进制字符。

这不是一项天马行空的技术,不需要等到遥远的未来才能实现,也不需要修改以太坊协议;这是一项以 已经 在以太坊主网演示的技术,同时 AZTEC 零知识票据也能够加密真正的 DAI 。

关于 AZTEC 私密交易的细节

现在出现两个问题:究竟什么是 AZTEC 协议?它是怎么运作的?关于 AZTEC 是如何运作的,我只能说,你得先了解椭圆曲线加密的核心部分(这是另一篇 blog 的内容,你可以在这篇文章中得到详细内容。一句话快速总结 AZTEC 的运作机制:它不是 ZK-SNARK,而是一种使用 Boneh-Boyen 群签名来创建承诺,并在每个承诺中嵌入高可靠性范围证明的代数型零知识证明。)

好,解决了椭圆曲线加密是什么的问题,现在我先解释 AZTEC 协议 是什么;交易发送给协议后,会 发生什么。开始之前,我们先来了解一下“私密化交易( confidential transaction )”到底什么意思。

私密化交易指的是发生在两个及以上对象之间的价值转移,其中转移的 价值 不能被观察者得知。

私密化交易可以有很多种形式,从环签名( ring signature)到 ZK-SNARK 等等。与 ZCash 类似,AZTEC 协议使用加密“票据(note)”及合并-拆分票据的概念

加密数字资产及 AZTEC 票据

AZTEC 协议不会像传统的余额形式那样直接显示出“价值”,不会直接将持有者身份和它们的持有数量映射在一起,而是用“票据( notes )”的方式来体现。票据包含以下公开信息:

  • AZTEC 承诺:一种加过密的表述,代表该票据拥有多少“价值”。
  • 一组持有该票据的以太坊地址。

及以下非公开信息:

  • 票据的价值。
  • 票据的查看密钥( viewing key ;知道查看密钥的人能够解密票据(但不能够花掉票据)。

单个用户能够拥有多个票据,经过 AZTEC 协议确认的数字资产会构成一份票据列表,让智能合约可以恢复这些已经存在而尚未花费的票据的公共信息。

AZTEC 票据如何花费?

AZTEC 票据的持有者能以一种合并-拆分(join-split)私密交易的形式花掉他们的票据。在该交易过程中,持有者会先销毁一些未花费的 AZTEC 票据,同时创建一组新的票据。新旧票据总额必须一致,同时需要附上 公开 承诺(稍后我会做说明,先假设这个公开承诺价值为 0 )。

假设 Alice 有两份 AZTEC 票据,其价值总和为 100 个代币。现在 Alice 想要发给 Bob 20 个代币,她得先创建一个或多个总额为 20 代币的票据,这些票据的持有人是 Bob;接着她得为自己创建一个或多个总和为 80 代币的票据,持有人是 Alice 自己。

然后,Alice 继续创建 AZTEC 零知识证明,以零知识方法证明上述的操作(即,Alice 不用向任何人透露这些票据的真实价值,只证明上述操作关系成立)。紧接着, AZTEC 代币智能合约会验证零知识证明的合法性,并在票据表里销毁 Alice 输入的旧票据,然后生成新的票据输出。

当 Alice 创建属于 Bob 的票据时,她同时会构造票据的“查看密钥”,让 Bob 能够通过非交互式密钥分享协议验证票据的价值。本步骤中,Bob 需要依赖于 Alice 的操作是可信的,而且没有向其他观察者提供能够破译的查看密钥。 这是默认的要求——毕竟如果 Alice 想要交易公开,她可以广播给全世界知道发送给 Bob 的具体金额。

票据的“所有权”该如何定义?

每个私密交易都要求附上数字签名——每张输入的票据都需要持有者的数字签名。签名信息是其零知识证明的哈希值,一旦在票据上签名,即可视作票据持有者同意这笔交易的输出,允许交易进行。

我们如何将价值导入 AZTEC 票据体系?

能够秘密地传递价值固然很好,但还缺乏能够让整个价值(我们用 v 来表示该价值)在 AZTEC 加密系统里流转的方法。这听起来有点学术,它是通过私密交易中的“公共承诺”来完成。假设 AZTEC 代币和某个公开的 ERC 20 代币挂钩,完成 AZTEC 零知识证明需要一个公共承诺值 v != 0 ,为了使等式成立,意味着两个条件要满足:

  1. 如果 v 为负,则输出票据价值比输入票据价值多 -v (输出票据的价值会更大,因为 v 为负值)。
  2. 如果 v 为正,则输入票据价值比输出票据价值多 v

如果 Alice 发出了一笔 v 为负的私密交易,则 AZTEC 代币智能合约会从 Alice 那儿转走 -v 的 ERC 20 代币到自己的合约中。 实际上,在私密票据表中, AZTEC 代币智能合约扮演的角色更像是 ERC 20 代币的保管人。如果这笔转移被拒绝(e.g. Alice 没有足够代币),交易也就流产了。

如果 Alice 发出了一笔 v 为正的私密交易,代表发生了一笔将 AZTEC 票据兑换为 ERC 20 代币的操作。AZTEC 代币智能合约会向 Alice 转移价值为 v 的 ERC 20 代币。

这里做个小提醒——转移的代币数实际上是 v 乘上一个比例因子,因为 AZTEC 代币支持的整数范围小于 ERC 20 支持的范围。目前我们部署在主网的 PoC 协议支持整数 0 ~ 100 万,而 AZTEC 协议完整版能支持约 32 位整数(保守估计)。相比之下,ERC 20 能支持的体量达到 256 位。

比例因子根据 AZTEC 挂钩的 ERC 20 代币而定。我们在 PoC 部署中使用 DAI 代币,AZTEC 票据中的 1 相当于 0.1 DAI。

这么做的成本为何?

AZTEC 协议使用一套特定的承诺机制,能实现高效且大范围的证明。结果表明,通过智能合约进行验证的计算量远小于预期。关于私密交易主要的 gas 支出在于验证 AZTEC 零知识证明时,需要进行椭圆曲线计算。共需要花费 3i + 4j 椭圆曲线标准运算进行证明验证,i 是输入的票据数,j 是输出的票据数。

每个 confidentialTransfer 交易还需要进行单一椭圆曲线双线性对校验。

这里我讲的如此玄乎,是因为要强调这些运算成本将会在为 geth 和 parity 进行协议升级( EIP-1108 )后,大幅降低。目前发布一笔包含 4 个票据的私密交易,大约需要消耗 900,000 gas(这是总的 gas 消耗,包含验证交易加密性的成本);等到 EIP-1108 实施后,费用能降至 200000 - 300000 gas。

从私密交易中能收集哪些信息?

过去十一个月里,我痴迷于 AZTEC 协议,在完全发挥出协议的优势及找到局限之前我不会感到满足。我相信这些超前的工作是非常重要的。在这种形式中,任何将公开转账转为私密交易的操作,都会在加密系统的入口和出口留下一些信息。

如果你将代币加入票据系统,观察者就会知道,输出的票据价值至少是你转换的公共代币价值。

同样的,当赎回价值为 v 的公开代币后,观察者能知道剩余的 AZTEC 票据价值至少会减去价值 v

通过将 AZTEC 代币和公开代币转换作结合,以上问题能得到改善。举例来说,假设 Bob 持有一张价值 100 代币的票据,并想转换成公共代币。这时候,Bob 应该添加一些附加的输入票据和输出票据,即便这些额外的票据价值为 0 也无所谓。这么做能防止观察者得知 Bob 秘密地转换了多少资产,即使 Bob 已经转换所有资产,也会留下一堆价值为 0 的“烟雾弹”票据

AZTEC 票据的持有者由以太坊地址所定义。表面上来看,票据持有者并非匿名的(e.g. 人们可以看到我的以太坊地址持有零知识 DAI 代币);AZTEC 协议中包含一种类似门罗币的隐性地址,这也是个以太坊地址,但只会被使用一次,无法和其他任何地址产生关联性。(e.g. 如果你有 AZTEC 钱包,我可以向你持有的以太坊地址“转账”票据;除了你和我,没有人知道这件事情的发生) 。AZTEC 协议支持隐性地址(这要求特定的钱包来完成;你需要两份公/私钥对,所以常规的以太坊钱包不管用),也支持一般以太坊地址(非匿名的——如果你在这个地址持有票据,所有人都看得到)。

拥有双重公/私钥的用户越多,能提供的隐私保障就越大。举例来说,当我们在主网上进行测试部署,我将 50 DAI 转换成 AZTEC 票据并发送一部分给我同事;这时候很明显的所有输出票据总和就是值 50 DAI,票据没有得到很好的加密保护。现在假设某个人创建了值 1000 DAI 的私密票据,然后我们进行了几次票据的合并及拆分——这样一来,想要搞清楚这些票据究竟值多少 DAI 成为一件不可能的事,只知道价值总和为 1050 DAI。

为了将信息泄露风险降至最低——如果我将 10 DAI 转成单一的 AZTEC 票据,这对隐私保护毫无帮助——创建没有价值的“烟雾弹”票据能很大的提升隐私性——如果你将 10 DAI 转换成票据以供使用,那么你最好同时创建几个不具备价值的票据,来掩饰你实际转换的价值。

如果协议使用者“偷懒”,仍会泄露一定的信息。举例来说,你将 10 DAI 转换成 5个票据,其中 4 个为价值 0 的烟雾弹票据。假如你忘了这几个烟雾弹票据的存在,并在之后的交易中再也不碰它们,对于观察者来说,这几个票据很明显不具备任何价值。因此后续尽可能以合并-拆分交易形式使用这些烟雾弹票据,能够一定程度减少外部观察者获得交易信息的可能。

AZTEC 协议的可信设置

AZTEC 协议高效的原因在于,我们在单个承诺方法中结合了 Boneh-Boyen 群签名和 Pedersen 承诺,以一种高效的方式嵌入承诺。在使用 AZTEC 协议前,要求椭圆曲线数据库先创建好;这个数据库被用来构造无需再次验证的证明。

其实有点像 ZCash ,这种可信设置会生成“多余的”私钥,如果私钥被泄露,就有可能被用来构造双花攻击使得协议失效。

我们该如何解决这个问题呢?我们不指望用户会无条件信任我们,所以我们开发了一款可扩展的多方计算协议,使得任何人都能参与可信设置过程。如果你参与进来,你就可以生成“多余的”私钥的一部分。也就是说,可信设置私钥,只能通过拼凑所有参与者的“多余”私钥部分来获得。所以,除非离散对数问题被攻破,只要有一位参与者是诚实的,这个方法就绝对安全(离散对数问题被攻破意味着椭圆曲线加密失效,这时候我们得面临的安全问题远远大于 AZTEC 协议的安全性问题。)

我们会在接下来几个月发布可信设置过程的正式版,并开始招募参与者。这与 ZCash 的 “powers of tau” 协议有些类似,不过 AZTEC 协议不使用 ZK-SNARK ,因此结果差异很大。我们希望可信设置协议易于参与,同时也希望与广大以太坊社群互动,以创建出值得社区信任的可信设置数据库。

我们的 PoC 智能合约使用内置的可信设置,因为实现多方计算可信设置还需要数个月的时间部署。在我们完成上述工作之前,使用 AZTEC 协议的用户得承担一定风险;虽然我们已经清除多余的私钥,但没有办法提供证明我们的确这么做了。

最后一点(啊......),可信设置数据库的大小会随着协议证明范围线性增长,目前 PoC 的数据库只支持 0 ~ 1048575 的整数范围,因为我希望从 github 上下载我们的 PoC 不会成为一件头疼事;完整版会支持更大范围的整数。

为什么 AZTEC 协议如此重要?

我当然会说这很重要,我是你所能知道对这个问题最有主观偏见的人!以下是为什么我认为 AZTEC 协议是规则的开创者:AZTEC协议可以创建通用的私密数字资产。目前我们选择从 DAI 开始,但以后只需单击某个按钮,AZTEC 协议就可以应用于任何 ERC 20 代币;它还可以构建无需任何 ERC 20 代币作为等价物的私密资产,不需要额外的加密体系,也无需额外的可信设置过程。这也是史无前例的,AZTEC 协议能够在不牺牲隐私的情况下,享有公共区块链的不可逆和去中心化优势

AZTEC 零知识证明在扩展性方面也非常高效,完全在硬件钱包的承载能力范围内。能够直接从硬件钱包发布私密交易,并且从不暴露敏感私钥,这真的令人非常兴奋!

AZTEC 协议的未来?

与我们的智能合约验证和技术白皮书内容最立即相关的,是发布 AZTEC 证明构造 API。同时我们还有几个关于 AZTEC 协议的扩展工作要做,完整的未来愿景会在 2019 年上半年发布。其中包含几个重要的目标:

  1. 私密的去中心化交易所——使用者能够在完全保密的情况下交易不同的 AZTEC 资产,任何交易数量和价格都无法从交易过程中获取。去中心化交易所使用了中继者模式( relayer pattern )和预想的 AZTEC DeX 零知识证明实现上述功能(实际上有三个部分,在 DeX 白皮书完成后我会深入描述)。
  2. 私密的加权投票——在很大范围的金融应用中,保障投票者隐私的机制至关重要,而 AZTEC 协议的有效范围证明使其成为可能。
  3. 匿名身份共享方案——在许多进行承诺和 KYC 的场景下,无需透露身份便能证明你属于某个团体,有很重要的应用价值; AZTEC 代币标准能够支持这样的身份系统。

结合以上扩展功能, AZTEC 协议能提供开发者需要的工具来创建下一代去中心化金融服务,重新构建具有绝对隐私且私密化治理的数字资产。

为了实现这个愿景,我们将开源我们的技术——如果你想要在以太坊上创建具备私密性的资产,AZTEC 协议提供智能合约、资源、工具,使得一切再简单不过了。

如果你有兴趣一同构建 AZTEC 协议,请联系我们 hello@aztecprotocol.com 。我们同时也在持续招进行聘,如果你是个有想法的开发者,并希望能和我们为下一代去中心化金融服务做出贡献,请联系我们。

耶!


原文链接: https://medium.com/aztec-protocol/confidential-transactions-have-arrived-a-dive-into-the-aztec-protocol-a1794c00c009
作者: zac
翻译&校对: IAN LIU & Elisa

本文由作者授权 EthFans 翻译及再出版。


你可能还会喜欢:

干货 | 加密货币隐私性概述
干货 | 详解 MimbleWimble 协议
干货 | 区块链分片的理念与挑战,Part-1

 
0 人喜欢