跳到主要内容

工作流程

ZCash 命名服务 (zNS) 允许用户注册、更新解析地址、转移给其他所有者并在市场上列出人类可读的域名(例如 myname.zcash),并将它们安全地映射到 ZCash 地址。

由于 ZCash 是一个基于 UTXO 的区块链,没有通用智能合约,因此它无法原生运行像域名注册中心这样的复杂数据库系统。为了解决这个问题,zNS 使用 Rollup 式架构,在链外执行操作,将数据存储在 ZCash 上,并将安全性锚定在 Arbitrum 上。

该系统由五个互连的组件提供动力:

1. ZCash 区块链:数据可用性层

用户采取的每项操作 - 注册名称 (REG)、更新地址 (UPD)、转让所有权 (CHG)、在市场上列出 (LST)、取消列出 (ULT) 或购买 (BUY) - 均以本机 ZCash 交易开始。交易在交易备注字段中包含结构化文本命令(例如 zNS:1:REG:domain:address:pubkey:nonce:signature)。

  • ZCash 链是事实来源。 它永久存储每个域命令。如果没有记录 ZCash 事务,则不会发生状态更改。

2. 注册器节点:排序器

自动注册节点扫描 ZCash 区块链。它读取域命令,验证用户是否支付了正确的交易费用,并对操作进行排队。每 10 分钟,注册商会将这些操作捆绑到一个批次中。

3. SP1 zkVM:零知识引擎(作者:Succinct

该批交易被发送到 SP1 零知识虚拟机 (zkVM)。 zkVM 运行一个专门的 Rust guest 程序,充当严格的协议仲裁者。证明者检查批次中的每笔交易:

  • 签名是否有效并由实际域名所有者签署?
  • 随机数是否严格增加以防止重放攻击?
  • 域名前缀的格式是否正确?
  • BUY 交易是否支付 LST 交易中指定的确切价格?
  • 使用数学 Merkle 证明,old_root 是否正确转换到 new_root

如果满足所有规则,zkVM 会生成 ZK-SNARK 加密证明(使用 Groth16)。这个证明是一个微小的证书,它在数学上声明:“从状态根 A 开始,应用这批有效的交易后,新的状态根是 B。”

该来宾程序的每个编译版本都会生成一个唯一的加密标识符,称为验证密钥 (vkey)vkey 是已编译的来宾程序结构本身的 32 字节哈希值。即使修改一行验证代码,程序也会编译为完全不同的vkey

4. Arbitrum 智能合约:锚

生成的 ZK 证明及其公共输入被发送到 Arbitrum 上的 zNSAnchor 智能合约。合约充当结算网关。

  • 加密绑定:在智能合约内部,programVkey(客户程序的预期 32 字节哈希值)存储在链上。提交证明后,合约会将证明和 programVkey 转发到 Succinct SP1 Verifier Gateway。
  • 钥匙锁验证:验证网关仅批准由与注册的 programVkey 匹配的精确访客程序生成的证明。
  • 如果证明有效并根据注册的 programVkey 进行验证,合约会将官方的、全球接受的状态根更新为 B 并将其保存在其历史记录中。
  • 如果违反了单个规则,或者如果使用修改后的访客程序生成证明(这将产生不同的 vkey),则合约将拒绝交易,从而防止未经授权的状态转换。

5.分布式索引器:解析器

任何人都可以运行独立的索引器节点。索引器扫描 ZCash 区块链以查找域交易,并扫描 Arbitrum 合约以查找已验证的根检查点。他们在本地应用交易,计算自己的 Merkle 树,并验证其本地根是否与 Arbitrum 检查点匹配。

  • 这确保所有索引器,无论在何处运行,始终将域解析到完全相同的目标地址(在分布式端保持单一统一状态)。