# 什么是 ZEXE？（第二部分）

By [montlanc](https://paragraph.com/@montlanc) · 2022-06-05

---

ZEXE 是一种隐私保护、去中心化应用程序（如去中心化交易所）的方案。它旨在利用基于分类帐的系统，并支持多种功能。

### ZEXE 设计策略

ZEXE 是一种隐私保护、去中心化应用程序（如去中心化交易所）的方案。它旨在利用基于分类帐的系统，并支持多种功能。其中包括用户定义的可替代资产、跨应用程序通信和公共可审计性。当然，所有这些都需要以零知识的方式来实现。

为了实现上述目标，ZEXE 以多种方式打破了现有的私有区块链。

1.  ZEXE 提供了一个共享执行环境，多个应用程序在同一个账本上交互。
    
2.  交易的内容不再局限于价值转移，而是代表了一个更通用的数据单元，称为 _记录_。此外，用户可以使用相关谓词定义自己的函数，这些谓词规定了可以使用资产的条件，而无需请求许可。
    
3.  ZEXE 不是链上执行环境，而是选择离线计算来生成交易并为每笔交易附加一个零知识证明，以证明其正确执行。
    
4.  结果是一种新的加密原语协议，称为去中心 _化私有计算_ （DPC）。
    

### Zerocash 交易

第一个使用承诺方案和零知识证明来提供隐私的现实世界系统是 Zerocash。Zerocash 交易 tx 是一种“操作”，它使用旧硬币承诺作为输入，并输出新创建硬币的承诺以及证明交易计算正确的零知识证明。参见下面的图 1。

在账本上，每笔交易包括：

1.  消费币的序号，{sn₁, sn₂, ... , snₘ},
    
2.  已创建硬币的承诺，{ com₁), com₂), ... , comₙ) } 和
    
3.   证明两个事实的零知识证明 **π ，**
    

(i) 消费的序列号属于过去创造的硬币（不识别哪些，从而确保交易各方的隐私），

(ii) 承诺包含与消耗的硬币总价值相同的新硬币（确保系统的整体经济完整性）。

这就是 Zerocash 系统如何使用零知识证明来确保一次性消费硬币，从而防止双重支出。请参见下面的图 1。

_图 1：典型的 Zerocash 交易_

请注意，上面图 1 中的代币承诺指数没有重复。这三个新的承诺被标记为 4、5 和 6，而不是 1、2 和 3，以表示承诺的唯一性。同样，每个硬币都有一个唯一的序列号sn，没有两个硬币可以共享一个序列号。

因此，Zerocash 交易是私密的，因为它只显示消耗了多少硬币以及创造了多少硬币，但硬币的价值是保密的。如前所述，这提供了数据隐私。而且，在 Zerocash 是单一功能协议的情况下，默认情况下实现了功能隐私，因为不需要区分一个功能与另一个功能。

### 扩展 Zerocash 计算模型

Zerocash 是分布式账本系统隐私方面的一项突破。但不幸的是，该方案提供的功能有限。如果我们想做的不仅仅是简单的私人资产转移怎么办？

以以太坊为例，它支持数千个单独的 ERC-20 “代币”合约，每个合约代表以太坊账本上的不同货币。在处理所有不同的交叉货币交易时，涉及到许多函数调用，这些函数调用都嵌入到特定的应用程序中。但是由于每个应用程序的内部状态都是公开的，因此与每个应用程序相关的函数调用历史也是公开的。

即使这些合约中的每一个都将单独采用诸如 Zerocash 之类的零知识协议来隐藏有关代币支付的详细信息，但相应的交易仍将揭示正在交换的代币。因此，虽然状态转换的输入和输出是隐藏的，从而实现了数据隐私，但正在执行的转换函数是开放的。因此，在以太坊模型中实现功能隐私是不可能的。

ZEXE 正是受到这个问题的启发。在 ZEXE 中，目标不仅是提供数据隐私（如 Zerocash），而且是功能隐私。因此，区块链的被动观察者对正在运行的应用程序一无所知，也无法识别相关方。因此，ZEXE 模型可以支持私有 dApp、暗池、私有稳定币等丰富的应用。该编程模型还允许多个应用程序在同一个分类帐上进行交互，并促进用户定义的功能，以实现完全去中心化的系统。

### 验证者的困境

基于分类帐的系统的另一个吸引人的属性是可审计性。无论是监管者还是区块链的新用户，轻松验证历史交易真实性的能力都至关重要。

不幸的是，许多基于分类帐的系统通过直接验证状态转换来实现公共可审计性。遗憾的是，这种交易验证方法涉及重新执行相关计算。这种方法的问题是大型计算需要很长时间才能完成，从而使网络容易受到拒绝服务 (DoS) 攻击。

以太坊等早期的智能合约区块链通过 _gas_机制解决了这个问题，让用户为更长的计算付费，起到了对 DoS 攻击的威慑作用。这种方法的缺点是验证仍然很昂贵。此外，与解决工作量证明难题以找到下一个区块不同，验证交易是无利可图的。这就是所谓的 _验证者困境_。过去，这个问题导致比特币和以太坊等著名区块链出现分叉。

与其他区块链不同，ZEXE 中的程序执行发生在链下。此外，通过使用 zk-SNARKs，证明验证对于链上矿工或验证者来说是便宜的。因此，ZEXE 是验证者困境的有效解决方案。

### 实现零知识执行

我们从 Zerocash 开始，这是一种为具有单一功能的应用程序设计的协议，即在同一货币内进行价值转移。Zcash 是使用 Zerocash 协议的加密货币系统的一个例子。它使用零知识证明（zk-SNARKs）来实现隐私。ZEXE 的目标是将该协议从单个应用程序扩展到任何任意程序。

### 作为数据单元的记录

第一步是从硬币转换  为作为数据单元的\*记录。\*也就是说，记录不仅存储了一个整数值，还存储了一些任意数据负载。因此，与 Zerocash 中的简单 _价值转移_ 不同，ZEXE 可以使用任意函数，只要每个人都事先知道它们。

此更改使 ZEXE 能够支持任意程序。但是隐私呢？

在公众眼中，一笔交易又可以想象成一个消耗旧的记录承诺，并输出新创建的记录承诺和零知识证明的操作。

记录的结构如下图 2 所示：

_图 2：典型的记录事务_

在创建记录时，其承诺会在账本上发布，并且只有在记录被消费后才会发布其序列号。这一次，零知识证明证明在旧记录上应用该功能产生了新记录。

与 Zerocash 案例一样，账本上的每笔交易都包括：

1.  消费记录的序号，{ sn\_(old₁), sn\_(old₂), ... , sn\_(oldₘ) },
    
2.  创建记录的承诺，{ com\_(new₁), com\_(new₂), ... , com\_(newₙ) } 和
    
3.   证明两个事实的零知识证明 **π ，**
    

(i) 首先，序列号属于过去创建的记录（不披露记录），

(ii) 其次，承诺包含与所消耗记录的等值总价值的新记录。

### 支持任意函数

第二步，让多个用户可以自由定义自己的功能，并允许功能交互，无需任何规则。这可以通过上一步中概述的相同方法来实现。也就是说，通过允许用户固定一个通用的函数 Φ，然后将数据有效载荷 dpᵢ 解释为用户定义的函数 Φ = dpᵢ，作为 Φ 的输入提供。

使用 Zerocash 中的零知识证明将确保函数隐私。然而，仅仅允许用户定义他们的功能本身并不能带来任何有用的功能。

在这种情况下，函数隐私会产生问题，因为用户无法确定给定记录是否是根据任何给定函数以合法方式创建的。鉴于恶意用户不可避免地存在，诚实用户因此无法免受各种欺诈。

这种特殊的设计方法，用户自由定义功能的无拘无束的自由，当然是一种极端。缺乏管理用户定义函数如何交互的规则是其失败的根源。但是这个想法可以挽救吗？答案是肯定的，我们将在下一节中看到。

### 使用标签识别函数

此设计旅程的第三步是为每个用户定义的函数 Φ 引入唯一标识符。也就是说，我们在每条记录中包含一个函数标识标签，并使用 id 标签作为确定使用哪个函数创建记录的方法。这可以以零知识的方式完成。也许 id-tag 被定义为在给定值 vᵢ 处评估的函数 Φ 的哈希值。也就是说，idᵢ = H(Φ (vᵢ))。因此，如果散列函数是抗碰撞的，每个函数 Φ 将有一个唯一的 id-tag idᵢ。

由于“没有规则”是上述欺诈问题的根本问题，因此在这种情况下可以强制执行一条规则。也就是说，只有具有相同 id-tag 的记录才被允许在同一事务中合作。

零知识证明可以保证参与同一交易的记录确实具有相同的功能 id-tag。这将保证只有同一函数创建的记录参与同一事务。

尽管这种类型的系统提供了合理的功能，但它受到完全和完全的过程隔离的影响。结果，即使是简单的硬币交换也无法实现。但是，它代表了朝着正确方向迈出的一步。

在第三部分中，我们将讨论记录纳米内核如何启用一种称为 _分散私有计算_ (DPC) 的新加密原语，这是一个任何开发人员都可以用来构建私有应用程序的应用程序就绪框架。

---

*Originally published on [montlanc](https://paragraph.com/@montlanc/zexe)*
