ERC-8065: 零知识代币封装器 - ERC 标准

本文介绍ERC-8065标准,即零知识代币封装器(ZWToken)。它通过EIP-7503风格的可证明销毁-再铸机制,为以太坊上的ERC-20、ERC-721等多种代币提供隐私保护,同时保留代币的原始属性和可组合性。文章详细阐述了其动机、核心功能、不同代币类型的隐私特性及两种工作流程,并提供了Solidity接口。

ZWToken - 让隐私成为以太坊上所有代币的原生功能

注意:

本 ERC 为零知识代币包装器定义了一个标准。该包装器为代币(包括 ERC-20、ERC-721、ERC-1155 和 ERC-6909)增添隐私性,同时保留代币原有的所有属性,如可转移性、可交易性和可组合性。它规定了 EIP-7503 风格的可证明销毁与再铸造流程,使用户能够打破链上可追溯性,让隐私成为以太坊上所有代币的原生功能。

动机

大多数现有代币由于监管、技术以及发行方疏忽等原因,缺乏原生隐私性。寻求隐私的用户必须依赖专门的隐私区块链或专注于隐私的 dApp,这些方案限制了代币的可用性、降低了可组合性、限制了支持的代币类型、施加了白名单限制并约束了隐私方案。

本 ERC 采取了不同的方法,引入了一个零知识代币包装器,它在保留底层代币属性的同时增添隐私性。其主要目标是:

  • 可插拔隐私:包装器在增添隐私性的同时,保留底层代币的所有属性。
  • 无许可隐私:任何用户都可以将任何代币包装为零知识包装代币(ZWToken)。
  • 广泛的代币支持:兼容同质化代币(如 ETH、ERC-20)和非同质化代币(如 ERC-721)。
  • EIP-7503 风格隐私:支持可证明的销毁与再铸造流程,以实现高级别的隐私。
  • 兼容多种 EIP-7503 方案:支持不同的可证明销毁地址生成方法和承诺方案(例如,以太坊原生 MPT 状态树或合约管理的承诺)。

问答

1. 为什么不创建新的 zkERC20

  • 难以获得流动性和用户
    • 与仅提供隐私的小众 zkERC20 相比,用户宁愿持有非私有的 USDC。
  • 主要代币发行方出于监管限制不太可能发行

2. 为什么选择 EIP-7503

  • 只需要可转移性
  • 无法区分的销毁

3. 为什么不使用 EIP-7503

  • 硬分叉
  • 仅支持 ETH
  • 无法测量的 ETH 供应量

规范

本文档中的关键词 必须不得应该不应该可以 应按照 RFC 2119 和 RFC 8174 中的描述进行解释。

概述

零知识包装代币(ZWToken)是一种包装代币,它为现有代币(包括 ERC-20、ERC-721 和 ERC-1155)添加了基于承诺的隐私层。该隐私层允许在不修改底层代币标准的情况下进行私有转移,同时保持与现有以太坊基础设施的完全可组合性。

支撑此隐私层的承诺机制可以使用 Merkle 树、密码累加器或任何其他可验证的密码结构来实现。

零知识包装代币(ZWToken)提供以下核心功能:

ZWToken 接收者可以是一个可证明的销毁地址,之后代币可以从该地址重新铸造。

  • 存款:包装现有代币,并将相应数量的 ZWToken 铸造给指定的接收者。
  • 转移:将 ZWToken 转移给指定的接收者。
  • 再铸造:在验证了一个证明先前销毁代币所有权的零知识证明(且不揭示它们之间的联系)后,向指定接收者铸造新的 ZWToken。
  • 取款:销毁 ZWToken,以向指定接收者赎回等量的底层代币。

按代币类型的隐私特性

对于同质化代币(FTs),例如 ERC-20:

  • 本 ERC 能够通过销毁和再铸造过程打破资金流的可追溯性。
  • 使用可证明的销毁地址,可以在持有者执行 ZWToken 的取款操作之前,隐藏同质化代币的真实持有者。

对于非同质化代币(NFTs),例如 ERC-721:

  • 本 ERC 不能 通过销毁和再铸造打破资金流的可追溯性,因为每个 NFT 都是唯一的,无法参与混币。
  • 然而,使用可证明的销毁地址,仍然可以在持有者执行 ZWToken 的取款操作之前,隐藏 NFT 的真实持有者。

ZWToken 感知工作流

在 ZWToken 感知工作流中,用户和系统都明确识别并与 ZWToken 交互。ZWToken 继承了底层代币的所有功能属性。

flow1\ flow11758×1736 146 KB

例如,如果底层代币是 ERC-20,ZWToken 可以在 DEX 上交易、用于互换、提供流动性或标准转移。类似于持有 WETH 比直接持有 ETH 能带来额外好处,用户可能更倾向于持有 ZWToken 而不是底层代币。

ZWToken 非感知工作流

本 ERC 也支持 ZWToken 非感知工作流。在此模式下,所有转移都在内部通过 ZWToken 处理,但用户并不知道它的存在。

flow2\ flow21792×1308 114 KB

ZWToken 在用户界面下透明地运作,减少了所需的合约交互次数,并为那些不希望直接持有 ZWToken 的用户改善了整体用户体验。

替代工作流

上述两种工作流仅代表本 ERC 支持的交互模式的一个子集。也存在其他可能的工作流,包括:

  • 接收者再铸造:

Alice 可以 transfer(在 ZWToken 感知工作流中)或 depositTo(在 ZWToken 非感知工作流中)将 ZWToken 转移到 Bob 的可证明销毁地址,而不是她自己的地址。在这种情况下,再铸造操作由 Bob 而非 Alice 发起并证明

  • 递归再铸造:

再铸造的 ZWToken 也可以发送到 Bob 控制的另一个可证明销毁地址,而不是他的公开地址,从而允许隐私状态在多个再铸造周期中持续存在。

接口:

interface IERC8065 {
    struct RemintData {
        bytes32 commitment;
        bytes32[] nullifiers;
        bytes proverData;
        bytes relayerData;
        bool redeem;
        bytes proof;
    }

    // 可选
    event CommitmentUpdated(uint256 indexed id, bytes32 indexed commitment, address indexed to, uint256 amount);

    event Deposited(address indexed from, address indexed to, uint256 indexed id, uint256 amount);

    event Withdrawn(address indexed from, address indexed to, uint256 indexed id, uint256 amount);

    event Reminted(address indexed from, address indexed to, uint256 indexed id, uint256 amount, bool redeem);

    function deposit(address to, uint256 id, uint256 amount, bytes calldata data) external payable;

    function withdraw(address to, uint256 id, uint256 amount, bytes calldata data) external;

    function remint(
        address to,
        uint256 id,
        uint256 amount,
        RemintData calldata data
    ) external;

    // 可选
    function previewDeposit(address to, uint256 id, uint256 amount, bytes calldata data) external view returns (uint256);

    // 可选
    function previewWithdraw(address to, uint256 id, uint256 amount, bytes calldata data) external view returns (uint256);

    // 可选
    function previewRemint(address to, uint256 id, uint256 amount, RemintData calldata data) external view returns (uint256);

    function getLatestCommitment(uint256 id) external view returns (bytes32);

    function hasCommitment(uint256 id, bytes32 commitment) external view returns (bool);

    // 可选
    function getCommitLeafCount(uint256 id) external view returns (uint256);

    // 可选
    function getCommitLeaves(uint256 id, uint256 startIndex, uint256 length)
    external view returns (bytes32[] memory commitHashes, address[] memory recipients, uint256[] memory amounts);

    function getUnderlying() external view returns (address);
}
  • 原文链接: ethereum-magicians.org/t...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
以太坊中文
以太坊中文
以太坊中文, 用中文传播以太坊的最新进展