Nightfall 的系统结构、铸币实现及以太坊上通证的转移实现

摘要

Nightfall 是一种零知识证明的实现, 它使用 zk-SNARKS 让同质化 ERC20 和非同质化的通证 ERC721 系列的通证进行隐私化转移,使得交易能够完成但是又能足够的匿名。本文主要是通过对架构设计、承兑型资产铸造、转移和销毁这几个层面进行了详细的理论和实现的分析。

关键字 : 零知识证明;Ngihtfall;zk-SNARKS;承兑型资产;铸造;转移;销毁;

Nightfall 的高层级架构设计抽象

img

根据上图可以看到主要由以下模块组成:

  1. 链下两个交易模块发送者 Allice 服务模块 和接收者 Bob 服务模块;

  2. 以太坊网络中的盾牌合同;同质化 ERC20 智能合约模块;

  3. 非同质化 ERC721 智能合约;

  4. 验证智能合约 GM17_v0 等

主要功能为:通证 ERC20 铸币、转移和销毁与通证 721 铸币、转移和销毁。

Nightfall 中的六个主要子协议为以下:

  1. Mint ERC-20 Token Commitment ERC20 铸币承兑协议;

  2. Transfer ERC-20 Token Commitment ERC20 转移承兑协议;

  3. Burn ERC-20 Token Commitment ERC20 销毁承兑协议;

  4. Mint ERC-721 Token Commitment ERC721 铸币承兑协议;

  5. Transfer ERC-721 Token Commitment ERC721 转移承兑协议;

  6. Burn ERC-721 Token Commitment ERC721 销毁承兑协议。

何为铸造 (Mint) 一个 ERC20/721 承兑通证协议及其作用

即通过一个 ERC20/721 通证转换为一个对等承兑通证( Commitment Token ),而承兑通证,该承兑通证拥有与原通证类似的价值和 ID。在转换的过程中,承兑(Commitment)即一种通过密码学处理,实现原通证的价值和 ID 的隐藏和保密,同时也让交易的接收者和对应的价值实现了保密。

如何铸造 (Mint) 一个承兑型通证?

当 Alice 给 Bob 通过 Nightfall 进行转账的时候,Alice 使用公共输入 (unit256 []_proof ) 和私人输入(unit256 []_input)在她的 α 服务器上生成 zk-SNARK 证据 (proof)π(链下完成)。 然后她将它提交给盾牌合同。 详细过程是: Alice 通过提供散列通证 α 的值即令牌 ID,Alice 的公钥和 32 位的随机值(用来提供提供承兑通证的唯一性)最终铸造了承兑型通证 Z_A。

img

盾牌合约如何验证承兑型通证是否已经正确创建?

盾牌合同收到承兑型通证 Z_A,通过在核查合同中的调用验证功能(Verify)以及公共输入 π 来验证并且仅在成功验证时验证该通证 Z_A 已经被成功创建。 详细过程如下:

  1. 调用 ERC-20 或 ERC-721 合同的转移功能,将 Alice 的令牌值 / 令牌 ID α 转移到盾牌合同的地址中。

  2. 将承兑型通证 Z_A 哈希散列到其承诺的 merkle 树中。

如何实现承兑型通证资产的转移呢?

一个承兑型通证资产转移的例子如下:
Alice 目前拥有两个承兑型通证资产 Z’_A,分别持有 10α 和 5α,她想转移到 Bob。她在她的线下服务器上生成一个 zk-SNARK 证明 π,并从一个以太坊地址提交给盾牌合约。
详细过程如下:

  1. 她通过连接和散列值拿到两个承兑型通证资产 Z’*A 和 Z’’A 分别价值 10α 和 5α ,她的公钥 pk_A,以及与承兑型通证资产相关的随机数 σ_1 和 σ_2。
    分别表示为以下:
    img

  2. 承兑型通证资产存储在承兑型 merkle 树中,可用来显示承兑型 merkle 树中的这些承兑型通证资产存在于何处,揭示正在使用哪些承兑型通证资产。逆着原过程看,她可以从叶子节点即已经证明了的 Z’A 和 Z’’ A 开始,她可以通过反复哈希(树的深度 - 1 次),以产生承兑型通证资产 merkle 树的根 R。最终通过重复地与每个级别的兄弟节点连接并进行散列来完成此操作。
    img

  3. 她通过使用她的私钥 sk_A 和相应的承兑随机数 σ_1 和 σ_2 来为 Z’A 创建了无效清单 List of Nullifiers N10α 和 N5α。
    img

  4. 承兑型通证资产 Z’ A 和 Z’’ A 使用的公钥 pk_A 是从各自的无效列表 List of Nullifiers 中使用的相同秘密密钥 sk_A 导出的。
    img

  5. Alice 分别使用公钥 pk_A 为 Alice 和 Bob 创建了两个新的承兑型通证资产 Z’’’* A 和 Z_B。
    img

  6. 无效器 List of Nullifiers 中的价值等价于创造的新承诺的价值,即 10α+5α=3α+12α。

  7. 通过预设的值可以设定不超过最大额度的交易流,用来实施过载检测。

等待七个步骤完成后,盾牌合同在收到转账交易时,通过在验证合同中调用验证功能以及公共输入来验证并且仅在成功验证时验证该承兑型资产转移是否已经成功。

简而言之就是:

  1. 将 N_10α 和 N_5α 添加到其无效列表 List of Nullifiers 中

  2. 将 Z’’’_ A 和 Z_B 添加到其承兑的 merkle 树中。

此时 Bob 通过链下的通信被告知信息:Z B,12α 和秘密输入 σ_4。
完成此功能后:一个新的 Etheruem 地址(可能可以追溯到 Alice)在许多令牌承诺中无效,无论是铸造还是接收。 他们还可以看到它创建了两个新的承兑型资产 Z’’’
 A 和 Z_B。 但他们无法看到谁拥有这些新的承兑型资产或者花了两个承兑型资产。 此外,未披露花费和转移的价值。

承兑型通证资产的销毁

继续上述的流程,当 Alice 想要销毁她拥有的承兑型通证资产 Z_A 时,她在她的链下服务器上生成 zk-SNARK 证据(proof)π 并将其提交给盾牌合约(Shield Contract),详细步骤如下:

  1. 她通过连接和散列处理令牌 ID α,她的公钥 pk_A 和与承诺相关的随机数 σ 来承兑型通证资产 Z_A 的输入。
    img

  2. 这个承兑型通证存在于承兑型 merkle 树中,通过显示从 Z_A 开始,她可以反复散列(树的深度 - 1 次)以产生承兑型 merkle 树的根 R。通过重复地与每个级别的兄弟节点连接并进行散列迭代处理来完成此操作。
    img

  3. 她使用她的密钥 sk_A 为 Z_A 创建了一个无效器 nullifier Nα。
    img

  4. 从其无效器中通过使用的相同密钥导出承兑型通证 Z_A 中使用的公钥 pkA。
    img

  5. Alice 想要发送公共 ERC-20 通证到地址 payTo_address 相当于传送到了私有通证地址 payTo_address_private。即 payTo_address 实质上等价于 payTo_address_private。 同时还会通过一个用来确认的检查程序来确保整个过程中没有矿工 / 中介用其自己的地址替换 payTo_address 地址,形成篡改攻击。在上述整个过程中,对于收到销毁交易时的盾牌合同,通过调用 verier 合约中的验证功能以及公共输入来验证且仅在成功验证时验证销毁成功。简而言之做了以下两块处理:

    1. 将 N_α 添加到其无效列表中。

    2. 调用 ERC-20 或 ERC-721 合同的转移功能,将 α 的值 / 令牌 ID 从盾牌合同的地址转移到 Alice 指定的目标地址(可能是 Alice 或其他人的)。

这样做的好处就是通过一个新的以太坊合约地址(可能跟踪到 Alice)对目标承兑型通证进行处理包含了铸造、转移和验证。 他们还可以看到 Alice / 其他人已收到 α 的值 / 令牌 ID。

但他们无法看到整个过程到底关联了多少用来做具体业务的承兑型通证,以此实现隐私性。

结语

Nightfall 作为零知识证明的一个区块链智能合约处理系统的实现,让商业级应用隐私处理的矛盾得到了根本性的解决。虽然该方案和代码已经开源,但任然还处于早期阶段,其处理的复杂度、gas 消费对于时间和资金成本都还有很大的改进空间,但整个方案非常精妙,类似于通过合约层做了数据复杂的混淆处理,处于 level2 的解决方案。非常期待 Nightfall 的成长。


BUNTOY

2020.06.05
1881
收藏

个评论:

发表评论

感谢您的善举,每一次解答会成为新人的灯塔。回答被采纳后获得20算力和相应LK币奖励。

关闭