利用 EYBlockchain 在以太坊上创建隐私币

  • Star Li
  • 更新于 2019-06-13 15:10
  • 阅读 8257

前一段时间,介绍了几篇零知识证明文章:入门zkSNARK从 QSP 到 QAPGroth16 算法介绍, 今天这篇文章分享下利用 EYBlockchain 在以太坊上创建隐私币。

前一段时间,介绍了几篇零知识证明文章:入门zkSNARK从 QSP 到 QAPGroth16 算法介绍, 今天这篇文章分享下利用 EYBlockchain 在以太坊上创建隐私币。

EYBlockchain 简介

EYBlockchain 是在以太坊的基础上,提供隐私交易的能力。EYBlockchain 目前的实现并不是传统意义上的链,并没有修改以太坊的代码。而是在 ZoKrates(以太坊上 zkSNARKs 的工具箱)的基础上,利用以太坊上的智能合约,提供了以太坊上的比较完整的隐私交易的服务。在以太坊智能合约中,隐私交易的管理类似Zcash

EYBlockchain 的源代码为Nightfall, 白皮书在这里

白皮书 对 EYBlockchain 的愿景以及实现细节解释的比较清楚。

EYBlockchain 在 ZoKrates 的 DSL(Domain Specific Language)的基础上,提供了更人性化一些的语法。ZoKrates 使用 DSL 语言,也就是 .code 文件描述 R1CS(门电路)。EYBlockchain 使用 .pcode 文件,先预处理成 .code 文件。EYBlockchain 针对门电路预处理的代码zokrates-preprocessor

整体框架

合约框架

EYBlockchain 的核心模块是 offchainZKPoffchain 又分为两个功能模块: whisper 提供了 p2p 通讯的能力,pkd(public key directory)存储了公钥。公钥包括两部分:1. whisper 本身的公钥 2. 隐私交易的公钥(地址)。简单的说,offchain 模块维护了线下的公钥,并提供了相互查询的功能。

ZKP 是隐私交易的核心模块,在 ZoKrates 的基础上,实现零知识证明的证明和验证服务。EYBlockchain 还提供了 account 模块,实现以太坊地址的生成。非链上的数据都存储在 database 模块中(目前用 MangoDB 实现)。

EYBlockchain 采用的零知识证明的算法是 GM17,也就是在 2017 年发表的Groth16的增强版本。

EYBlockchain 源代码结构

EYBlockchain 的源代码目录结构如下:

Nightfall 代码结构

主要包含了一下几个部分:

  • API-Gateway:API 调用接口。
  • accounts:以太坊账户地址创建。
  • database:数据存储,用 MangoDB 数据库实现。
  • offchain:实现 whisper 以及公钥的管理。
  • zkp:隐私交易的核心逻辑,主要是零知识证明和验证的服务。
  • ui:示例 UI。

初始设置

在隐私代币生成和流通之前,必须进行初始设置。初始化设置包括两部分:

  1. 零知识证明的证明密钥/验证密钥对;
  2. 以太坊上部署智能合约。

注意,零知识证明的证明密钥和验证密钥对,必须由可信机制生成。

零知识证明的证明密钥/验证密钥对

EYBlockchain 的隐私操作目前包括 3 个:隐私代币生成,转账和销毁。EYBlockchain 目前支持ERC20/ERC721两种代币,所以目前总共有 6 种操作: ft-mint , ft-transfer , ft-burn , nft-mint , nft-transfer , nft-burn

注: ft 表示 Fungible Tokens, nft 表示:Non-Fungible Tokens

mint_pcode

在生成证明密钥/验证密钥之后,在每个操作目录下会生成几个文件:

mint_pcode2

  • nft-mint-vk.json - 验证密钥的 JSON 文件
  • verification.key - 验证密钥的原始数据
  • proving.key - 证明密钥
  • xxx-mint.pcode - pcode 描述的门电路
  • verifier.sol - ZoKrates 生成的零知识验证智能合约。目前已经废弃。所有的零知识验证,通过统一的 GM17.sol 完成。

以太坊智能合约部署

在以太坊上部署如下的智能合约:

部署隐私币合约

FToken - EY 发行的ERC20的代币合约,EY OPs Coin,简称 OPS。 FTokenShield - ERC20 对应的隐私交易合约,管理所有隐私交易信息。 NFToken - EY 发行的ERC721的代币合约,EYToken,简称 EYT。 NFTokenShield - ERC721 对应的隐私交易合约,管理所有隐私交易信息。 GM17 - 零知识验证智能合约。 Verifier Registry - 提供两个功能:1. 所有零知识验证的验证密钥注册 2. 所有证明信息的存储。

在向 Verifier Registry 注册一个验证密钥后,智能合约会返回一个验证密钥编号(vkId)。

以下以 ERC20 为例,说明隐私交易的生成/转账/销毁逻辑。注意的是,隐私交易涉及的智能合约的交易计算量都比较大,目前代码中建议使用6500000Gas油费。

隐私代币生成(Mint)

隐私代币生成的过程,就是从非隐私的 OPS 代币,到隐私代币的过程。注意的是,mint 的过程本身并不是隐私的,发起账户和金额都是公开的。 隐私币生成

  • Step1 - 通过 ft-mint 的 vkId,生成证明。公开信息为转账金额和(c,pk,r)三元组生成的 hash 值。私有信息为 pk 和 r。r 为随机数。
  • Step2 - 调用 FTokenShield 智能合约的 mint 接口,提交 proof/公开信息以及 vkId。
  • Step3/4 - 调用 GM17 以及 Verifier Registry 存储和验证 proof。
  • Step5 - 在验证 proof 后,调用 FToken 智能合约,从发起者账户转账到 FTokenShield。

值得一提的是,(c,pk,r)三元组生成的 hash 值,在 FTokenShield 会被组织成 merkle 树。hash 值,也称为 commitment,作为 merkle 树的叶子节点。

merkle-t

隐私代币转账(Transfer)

转账的模型,类似 UTXO 模型。从两个属于同一个账户的隐私交易中(交易金额分别是 c 和 d),生成两个隐私交易:其中一个属于转账对象的(交易金额为 e),另外一个(余额为 f)返回转账发起账户。其中,c+d=e+f。 隐私代币转账

  • Step1 - 通过 ft-transfer 的 vkId,生成证明。生成 e 和 f 的 commitment,c 和 d 的 nullifier。
  • Step2 - 调用 FTokenShield 智能合约的 transfer 接口,提交 proof/公开信息以及 vkId。
  • Step3/4 - 调用 GM17 以及 Verifier Registry 存储和验证 proof。
  • Step5 - 通过 whisper 告知转账对象:转账金额 e,随机数 r1,z1 以及在 merkle 树上的叶子的 index。

隐私代币销毁(Burn)

隐私代币的销毁,就是将代币从隐私账户转回普通账户的过程。

隐私代币销毁

  • Step1 - 通过 ft-burn 的 vkId,生成证明。
  • Step2 - 调用 FTokenShield 智能合约的 burn 接口,提交 proof/公开信息以及 vkId。
  • Step3/4 - 调用 GM17 以及 Verifier Registry 存储和验证 proof。
  • Step5 - 在验证 proof 后,调用 FToken 智能合约,从 FTokenShield 转账到发起者账户。

简单的说,就是在证明拥有某个 commitment 中 pk 指定的 sk 的情况下,可以生成 nullifier。在隐私智能合约中销毁隐私代币后,可以将资产恢复到普通账户。

UI 部分

EYBlockchain 还提供了已有功能的简单 UI,方便开发人员验证功能。UI 的界面如下图:

很清楚分为四个部分:EYT(ERC721),EYT 对应的隐私代币,OPS(ERC20),OPS 对应的隐私代币。

总结:

EYBlockchain 运行在以太坊上,在 ZoKrates 零知识证明的基础上,利用以太坊上的智能合约提供隐私交易的能力。在智能合约中,隐私交易的管理类似 Zcash。目前,EYBlockchain 在以太坊上发行两种代币:EYT(ERC721)和 OPS(ERC20),并针对这两种代币提供隐私交易的能力。

本文作者 Star Li,公众号星想法有很多原创高质量文章,欢迎大家扫码关注。

公众号-星想法

点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Star Li
Star Li
Trapdoor Tech创始人,前猎豹移动技术总监,香港中文大学访问学者。