Web3 学习日记 - Zether (二)

相关资料

论文: https://eprint.iacr.org/2019/191 代码 repo: https://github.com/Consensys/anonymous-zether 代码 repo 中附带的两篇文章: https://github.com/Consensys/anonymous-zether/tree/master/docs

我对 Zether 的理解

  1. 将对 ETH 的交易,转换为 EVM 中智能合约 ZSC 中管理的 ZTH 的交易。 (ZTH 不应该被定义为代币?只是智能合约里管理的一个内存数据。)

  2. 用户生成自己的 zether 公私钥对,然后在 ZSC 中注册

  3. 用户可以转入 ETH 到 ZSC 合约,合约锁定这部分 ETH,并 发放对应的 ZTH 给用户

  4. 用户可以提取 ZTH, ZSC 合约销毁这些 ZTH,并将之前锁定的对应数量的 ETH 转账给用户

  5. 用户的匿名转账通过 ZTH 进行, 核心是使用同态加密进行, ZSC 上保存的用户 ZTH 余额是一个同态加密后的数字,对加密后的余额进行加法操作,可以被用户的 zether 私钥解密后,还原出余额原文的加法结果。因此实现了交易金额的保密。

  6. 转账对象的保密,通过同时转账给 ZSC 中的多个用户,其中可能有 n 个用户实际转账金额为 0(因为有同态加密, 其他人看到的金额是一个很大的数字,只有转账对象才知道解密后的转账增量为 0)

  7. 因为 ZSC 合约看不到每个用户的余额(只有同态加密后的密文), 所以在转账或者提现 ZTH 时,用户需要提交 ZKProof,证明自己的余额大于或等于需要转账/提现的额度。

  8. 如果用户在生成 ZKProof 之后金额发生了变化,会导致 ZKProof 证明力失效, 所以 Zether 定义了 Epoch 的概念。

  9. 同一个 Epoch 内, 只能发生一次转出金额的操作(例如转账或者提现),但是可以接收其他人的转账,接收到的转账会被暂存,在下一次 epoch 中进行转账或者提现操作前被合并到自己账户中。