本文介绍ERC-8065标准,即零知识代币封装器(ZWToken)。它通过EIP-7503风格的可证明销毁-再铸机制,为以太坊上的ERC-20、ERC-721等多种代币提供隐私保护,同时保留代币的原始属性和可组合性。文章详细阐述了其动机、核心功能、不同代币类型的隐私特性及两种工作流程,并提供了Solidity接口。
ZWToken - 让隐私成为以太坊上所有代币的原生功能
注意:
- ERC-8065 已被接受为草案 ERC:ERC-8065:零知识代币包装器
- 概念验证可在 zk.walletaa.com 访问,GitHub 仓库。
本 ERC 为零知识代币包装器定义了一个标准。该包装器为代币(包括 ERC-20、ERC-721、ERC-1155 和 ERC-6909)增添隐私性,同时保留代币原有的所有属性,如可转移性、可交易性和可组合性。它规定了 EIP-7503 风格的可证明销毁与再铸造流程,使用户能够打破链上可追溯性,让隐私成为以太坊上所有代币的原生功能。
大多数现有代币由于监管、技术以及发行方疏忽等原因,缺乏原生隐私性。寻求隐私的用户必须依赖专门的隐私区块链或专注于隐私的 dApp,这些方案限制了代币的可用性、降低了可组合性、限制了支持的代币类型、施加了白名单限制并约束了隐私方案。
本 ERC 采取了不同的方法,引入了一个零知识代币包装器,它在保留底层代币属性的同时增添隐私性。其主要目标是:
本文档中的关键词 必须、不得、应该、不应该 和 可以 应按照 RFC 2119 和 RFC 8174 中的描述进行解释。
零知识包装代币(ZWToken)是一种包装代币,它为现有代币(包括 ERC-20、ERC-721 和 ERC-1155)添加了基于承诺的隐私层。该隐私层允许在不修改底层代币标准的情况下进行私有转移,同时保持与现有以太坊基础设施的完全可组合性。
支撑此隐私层的承诺机制可以使用 Merkle 树、密码累加器或任何其他可验证的密码结构来实现。
零知识包装代币(ZWToken)提供以下核心功能:
ZWToken 接收者可以是一个可证明的销毁地址,之后代币可以从该地址重新铸造。
对于同质化代币(FTs),例如 ERC-20:
对于非同质化代币(NFTs),例如 ERC-721:
在 ZWToken 感知工作流中,用户和系统都明确识别并与 ZWToken 交互。ZWToken 继承了底层代币的所有功能属性。
例如,如果底层代币是 ERC-20,ZWToken 可以在 DEX 上交易、用于互换、提供流动性或标准转移。类似于持有 WETH 比直接持有 ETH 能带来额外好处,用户可能更倾向于持有 ZWToken 而不是底层代币。
本 ERC 也支持 ZWToken 非感知工作流。在此模式下,所有转移都在内部通过 ZWToken 处理,但用户并不知道它的存在。
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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!