使用本页可以了解一笔转账在 Rand 中流转时,各方分别承担什么工作。证明的成本高,验证的成本低,因此工作按这条界线划分。证明由发送方一侧生成。验证节点只负责检查、排序和投票。聚合者一旦启用,会把许多证明折叠成一个。下图跟随一笔转账,从钱包走到最终区块;图后的各节依次介绍每个角色。
一笔转账的路径
- 钱包构建转账。 它选取输入票据,获取其 Merkle 见证,构建四个输出,并将每个输出封入 ML-KEM-768 信封。随后计算交易的绑定值,即对除证明之外的全部内容做的哈希(交易)。
- 钱包自行证明授权。 这是针对花费密钥和一个新盐值的 tier-10 证明,耗时数秒。它是唯一接触花费密钥的证明,并且始终在钱包自己的设备上生成。
- 捆绑证明在有足够内存的地方生成。 这个 tier-14 证明用于证明所有权、成员资格、作废符和余额平衡,峰值内存约 6 GB。桌面应用和内存约 8 GB 的手机可以自行生成。内存更小的设备则把这项工作交给与之配对的证明者:一个由你自己运行的证明者,或位于
prover.randprotocol.org的验证节点证明者池。两者收到的都是查看密钥和盐值,绝不会收到花费密钥(证明)。 - RPC 节点检查证明。 钱包提交到的任何节点都会重新计算捆绑摘要,依据绑定值验证两个证明,检查手续费,然后才把交易通过 gossip 传给其对等节点(证明、内存池)。
- 验证节点排序并最终确认。 当前视图的领导者选取仍然有效的交易,按每 KiB 手续费从高到低排列,并提议一个区块。每个验证节点都会重新验证区块中的每个证明并投票。当三个法定人数证书在连续的视图中依次链接到该区块上时,区块即告提交,这需要 chain 20 的 26 个验证节点中有 18 个在线(共识)。
- 区块已最终确认,任何人都可以检查。 当
rand_getTransaction返回一个区块时,交易即为最终状态。之后同步的节点会重新验证每一份证书和每一个证明,而不是信任签名。
角色
| 角色 | 职责 | 是否证明? | 能看到什么 | 运行方式 |
|---|---|---|---|---|
| 钱包 | 构建、授权并提交转账和调用;用自己的密钥扫描链 | 始终生成授权证明;设备内存足够时生成捆绑证明 | 与自己的票据有关的一切 | 客户端页面上的应用,或 rand;在 chain 20 上,为 Rand Wallet 或 rand v0.6.8 及以上版本 |
| 委托证明者 | 为与之配对的钱包生成捆绑证明;钱包在提交任何内容之前会检查每一个回复 | 仅捆绑证明 | 配对钱包的查看密钥:其全部历史,包括过去和将来;它无法花费 | rand-prover run,或 rand-node run --prover |
| 验证节点证明者池 | 由四台主机运行的委托证明者,包括两个验证节点和两台只负责证明的机器,共用一个名称和一个密钥,服务于没有自己证明者的钱包;不收费 | 仅捆绑证明 | 与任何委托证明者相同,针对每个与之配对的钱包 | prover.randprotocol.org,指纹 RGTF-7HKJ-XZFV-GQ1J |
| RPC 节点(观察者) | 同步、重新验证每个证明、提供 JSON-RPC、通过 gossip 传播已验证的交易;不投票 | 否 | 仅公开字段:承诺、作废符、密封信封、证明 | rand-node run |
| 验证节点 | 观察者所做的一切,外加在自己的视图中提议区块并参与 HotStuff 投票 | 否 | 仅公开字段 | rand-node run --validator |
| 聚合者 | 对一个窗口内已最终确认的捆绑证明生成一个递归证明,并提交给封存区块 | 是,网络上规模最大的证明 | 仅公开字段和证明 | rand-node aggregate --watch,运行于带有 aggregation 部分的链上 |
证明与验证是两项独立的工作,验证节点不需要证明硬件。证明者池的四个成员中,有两个是同时作为服务运行证明者的验证节点;另外两个是专用的证明机器,不持有验证节点密钥。运行证明者池不属于验证的一部分。各角色的配置规格以及每个 tier 实测的证明内存,见验证节点与聚合者硬件。
各角色能了解什么
一笔转账的隐私取决于谁持有哪些密钥,而不是对网络的信任:
- 验证节点、RPC 节点和浏览器看到的是每个节点都能看到的内容:承诺、作废符、密封信封、手续费和证明。看不到金额、资产、发送方或接收方。
- **委托证明者(包括证明者池)**会收到查看密钥。凭借它,可以读取配对钱包的全部历史。但它永远无法花费,因为针对花费密钥的授权证明是在钱包自己的设备上生成的。与证明者池配对,意味着选择向其运营者展示这段历史。如果希望保持私密,请在自己的设备上证明,或运行自己的证明者。
- 委托证明者无法欺骗钱包。 钱包会从收到的每个证明中读取摘要,检查大小并在本地验证,因此错误的证明永远不会到达节点。
聚合:已构建,未启用
目前每个区块都携带每一个原始证明,一笔转账约 2.85 MB,因此一个 20 MiB 的区块大约容纳七笔转账。区块聚合是全节点给出的解决方案。聚合者获取一个窗口内已最终确认区块的捆绑证明(rand_getUnsealed),生成一个验证它们全部的递归证明,并提交。包含该证明的区块会封存这个窗口。随后验证节点只需验证一个聚合证明,而不是 N 个证明,节点也可以丢弃被覆盖的原始证明。聚合者需要质押保证金且无需许可,运行在 GPU 级别的机器上,可获得所覆盖捆绑证明的证明份额,外加以新 RAND 发放的区块补贴。
它已构建并合并,但尚未启用。它需要创世块中有 aggregation 部分,而 chain 20 没有,因此 rand_status 把所有聚合计数器都报告为零。在启用之前,必须在当前约束集下重新测量其捆绑形态,并且必须针对递归验证器进行一次伪造聚合证明的演练。在拆分授权的链上,它也只会封存捆绑证明,而不会封存授权证明(证明)。