阅读本页可以确定构建的对象和起点:用几段话说明链的模型、当前测试网的参数、如何获取测试用 RAND,以及文档其余部分的导览。
Rand Protocol 是什么
Rand 是一条后量子屏蔽链。它的原生币是 RAND,RAND 存在于完全屏蔽的池中:链上没有账户,也没有余额,只有票据承诺和作废符。一笔转账就是一个零知识证明,证明四张票据变成了另外四张票据(未使用的槽位由占位票据填充),而不显示移动的是哪种资产。RAND 与链自身标准 RPL 下的每一种代币共享同一个池。同一种币还用于支付机密程序:这类 RISC-V 程序在零知识虚拟机内于链下运行,并以证明而非其输入在链上结算。
每个原语的选择都以抵御量子对手为准:
| 层 | 运行内容 |
|---|---|
| 签名 | Dilithium2(基于格)。验证者用它签署区块和投票;水龙头、质押操作和桥注册也用它签名。钱包从不签署交易:一个交易包由其证明自行授权。 |
| 票据加密 | ML-KEM-768 密钥封装加 ChaCha20-Poly1305。链上每张票据都附带一个信封,只有其所有者(及其发送者)能够打开。 |
| 哈希 | BLAKE3,带域分离,用于地址、交易 id、状态根以及证明系统之外的一切;Goldilocks 域上的 Poseidon2,用于票据、作废符、承诺树以及证明之内的一切。 |
| 证明 | 采用隐藏 FRI 的 Plonky3 批量 STARK(80 次查询,膨胀系数 8,20 位工作量证明)。透明:无可信设置,无配对曲线,所依赖的假设是抗碰撞哈希。 |
| 机密计算 | Rand zkVM,一台在该 STARK 下被证明的 RV32IM 机器。程序由电路内摘要标识,验证者从不会看到任何一个指令字。 |
| 共识 | 链式 HotStuff BFT:按权益加权、超过三分之二的法定人数,轮转领导者,连续三个视图的提交规则。 |
| 存储与网络 | 每个节点一个 RocksDB,带 fsync 提交和启动完整性检查;libp2p(TCP、Noise、Yamux、gossipsub、Kademlia,局域网内为 mDNS)。 |
参考实现是 Rust 编写的 randprotocol/fullnode:rand-node 二进制文件是节点,rand 二进制文件是钱包,JSON-RPC 方法以 rand_ 为前缀。浏览器是 randscan.org。
测试网:链 21
公共节点集群运行的是链 21,自 2026-10-12 10:31 UTC 起在 fullnode v0.8.0 上运行。链 15 至 20 已退役。两周内共切换了五条链,每一次都是因为某项更改改变了所有证明或交易格式:
- 链 16(2026-09-28,fullnode v0.6.1)将 zkVM 升级到约束集 7,该约束集遮蔽了证明过去会泄露的关于小额私有输入的信息,并启用了
hardening_v6规则。 - 链 17(2026-09-29,v0.6.3)把转账的授权与其证明分离:每个交易包都带有第二个用花费密钥生成的小证明,因此大证明可以由只持有查看密钥的机器生成。
- 链 18(2026-09-29,v0.6.7)以 gas 计量机密调用(约束集 8),并在每个票据信封中启用加密备注。
- 链 20(2026-10-01,v0.6.8)把每个证明和每条签名消息绑定到创世哈希,加入程序状态(RPL-2),对 zUSD 桥的铸造和销毁收取费用,并启用 audit-v6 规则。
- 链 21(2026-10-12,v0.8.0)将 zkVM 升级到约束集 9(递归验证器中的 Merkle 跨度,以及用于 Dilithium2 算术的芯片),这改变了每个验证密钥和证明编码;销毁每笔交易的费用下限,而不是支付给提议者;加入 RPL-3 永续期货、M-of-N 多签账户以及第二种私有多签授权;并把证明上限提高到 6 MiB。其规则见下表。
链 19(2026-10-01 03:43 UTC,v0.6.7)是在同一构建上对链 18 的重新创世,没有改变任何规则。链 18 在高度 143,776 处停止,链 19 由高度 141,935 处的快照切出。它的创世与链 18 的区别仅在于链 id、时间戳、延续的票据和桥部分:为 Ethereum、Binance Smart Chain 和 Tron 端点设置了新的发射者,序列计数器则沿用。
链 20 是链 19 的硬分叉(于 2026-10-01 由其高度 7,258 处的状态切出),链 21 是链 20 的硬分叉:其创世携带了链 20 在高度 814,702 处快照中的桥状态以及运营方钱包的余额,全部 26 个验证者于 2026-10-12 10:31 UTC 一起在链 21 上重启,密钥、对等节点 id 和引导节点均不变。钱包需要 v0.8.0 才能在链 21 上发送交易:约束集 9 改变了每个验证密钥和证明编码,因此旧版钱包的证明根本无法解码,而且创世绑定会拒绝任何为其他链证明或签名的内容。
每一条都是全新的链。运营方钱包中的 RAND 余额和流通中的 zUSD 被带入下一个创世,除此之外没有任何内容被带入:部署在一条链上的程序不会存在于下一条链上,链 20 上登记的十一种代币也没有被带入。链 21 还向基金会金库发行了 100,000 RAND,该金库是一个由 3 把密钥中的 2 把控制的多签账户。这是实验性软件:未经审计,其上的 RAND 没有价值。
链 21 上的程序沿用链 20 上的方式保存状态:RPL-2 的程序单元、程序金库和 Invoke 操作均已上线,链 21 还加入了 RPL-3 永续期货和多签账户。四个示例程序部署在链 20 上,尚未在链 21 上重新部署。
| 链 ID | 21(rand_chainId) |
| 创世哈希 | ca76c2766ed6090ac6ba5dad86b724dd5d2b80c0edfaed287cd8b129e663ca9a |
| 创世文件 | fullnode 代码库中的 deploy/genesis-chain21.json |
| 构建 | fullnode v0.8.0(标签 c0878c3f);节点通过 rand_getVersion 报告自身的构建版本。此构建拒绝链 18 至 20,早于 v0.8.0 的钱包无法在链 21 上发送交易 |
| 创世绑定 | binding_domain 1:每个 bundle 的证明绑定和每条签名的操作消息都包含创世哈希,因此为某条链证明或签名的内容无法在另一条链上通过验证 |
| testnet 标记 | testnet 为 true:创世文件声明自身为测试网络,这使得水龙头可以与桥并行运行 |
| 验证节点 | 26 个,每个质押 1,000 RAND,即质押下限 |
| 法定人数 | 26 个中的 18 个:严格多于质押量的三分之二 |
| 区块间隔 | 默认的 --block-interval-ms 1000;约每秒一个区块 |
| 区块时间 | 时间戳比其父区块晚超过 60 s 即无效,且验证节点不会为比自身时钟超前超过 15 s 的区块投票,因此验证节点需运行 NTP |
| 证明窗口 | proof_window_blocks 1,024:bundle 的锚点必须是最近 1,024 个区块末根之一,其 time 不得早于此范围(链 18 和 19 上为 256 个区块) |
| 纪元 | 1,000 个区块;新的绑定质押需额外等待两个纪元才生效(bond_activation_epochs 2,在纪元 e + 3 激活),解除绑定的质押在两个纪元后释放 |
| 质押 | 注册为 v2(rand-node register --v2),新密钥须在持有超过三分之二权重的验证节点投票接纳后才能注册(admission_by_vote);单个验证节点的权重上限为 33.33 %;在纪元边界进入的新质押上限为活跃权重的 25 %(max_stake_entry_bps_per_epoch 2,500);无罚没 |
| zkVM | 约束集 9(约束集 8 加上递归验证者中的 Merkle 跨度,以及用于 Dilithium2 算术的 MODQ 芯片;链 18 至 20 使用约束集 8),生产 FRI 配置(80 次查询) |
| bundle guest | hc_bundle 60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce:4 入 4 出的隐藏资产 bundle,版本 3,层级 14 |
| auth guest | hc_auth 1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1:每个 bundle 都携带的花费授权,层级 10 |
| multisig auth guest | hc_auth_multisig 9705f8e2f1bc8561848b29cb8efd57c37e3e39788fa58a5f03304d8019668247:M-of-N Dilithium2 策略(最多 16 选 3),作为 bundle 的授权取代 hc_auth 被证明,层级 18;链上只能得知某个多重签名授权了此次花费。每个验证节点从二进制文件旁加载其固定的验证密钥 msauth-vk-production.bin |
| gas | 调用声明一个由电路强制执行的 gas 上限,并为此支付 gas_price:下限处为每 gas 100 个单位、每 KiB 800 个单位,两者逐区块向 262,144 gas 和 9,961,472 字节(链 20 上为 10,485,760)的目标移动,且不会高于每 gas 10,000、每 KiB 80,000 的上限。只有按字节价格计费的字节(调用的证明和输入信封)才计入字节负载(byte_load: "paying"),因此一个由转账构成的区块不会推高它。每个 bundle 声明固定上限 20,479,并支付固定的 0.001 RAND |
| 费用 | fees.burn_base 和 fees.burn_floor:每笔交易的下限费用(转账的 0.001 RAND、部署的按字费用、按当前价格计算的调用 gas 和字节、桥销毁的费用、invoke 的 cell 费用)被销毁,并计入 rand_getSupply.base_fees_burned;提议者只保留高出下限的小费。在链 18 至 20 上,全部费用归提议者所有(费用) |
| 程序状态 | RPL-2 已启用:程序 cell、程序金库和 Invoke(Action 33);创建一个 cell 需 0.01 RAND(cell_fee 10,000,000 个单位);一次 invoke 最多读取 8 个 cell、写入 8 个,并进行最多 4 次支付(rand_getLimits.program_state) |
| 票据信封 | envelope_bytes 1860:每张票据的信封为 1,860 字节,并携带一个加密的备注 |
| 程序上限 | max_program_words 65,535,但在 hardening_v6 下,任何层级 14 的调用都无法容纳的部署会被拒绝(ProgramUncallable):无公开段的程序上限为 8,180 个字 |
| 证明上限 | max_proof_bytes 6,291,456(6 MiB),足以容纳多重签名授权证明;链 18 至 20 上为 4 MiB,链 13 至 16 上为 8 MiB |
| 区块上限 | max_block_bytes 19,922,944(19 MiB;链 18 至 20 上为 20 MiB) |
| 调用信封上限 | max_call_envelope_bytes 65,536 |
| 每个程序的公开输入 | max_program_public_words 32,768,在部署时固定 |
| 水龙头 | 已开启,但仅限创世白名单(staking.faucet_recipients)上的 16 个钱包,且仅来自创世指定为铸造者的 18 个验证节点(staking.faucet_minters):每次调用最多 100 RAND,每个纪元合计最多 10,000 RAND |
| 机密计算 | 已开启;调用证明上限为层级 14。程序不会在切换链时延续;示例程序说明了每个程序部署在哪条链上 |
| 代币 | RPL 注册表已开启:注册费 1 RAND,予以销毁;最多 4,096 个代币;每个票据的价值低于 2⁶³。zUSD 在创世中列于索引 1,在切换时是链 21 上唯一的代币:链 20 上注册的十一个代币未被带入 |
| 永续期货 | RPL-3 已启用:一个市场 BTC-PERP,以 zUSD 结算,杠杆 20×,维持保证金 250 bps,吃单/挂单费率为 5/2 bps;仓位的证明上限为层级 18,存入金额至少为 1 zUSD(rand_getPerps、rand_getLimits.perps) |
| 多重签名账户 | 已开启:M-of-N Dilithium2 账户,余额公开,创建需 1 RAND,最多 10 个签名者(rand_getMultisig);基金会金库为唯一的创世账户,100,000 RAND 由 3 把密钥中的 2 把控制 |
| 桥 | 已开启:守护者集 1,含八名守护者、八名 Dilithium2 PQ 守护者、一把暂停密钥、四条源链的发射者,每个支持资产每日铸造上限为 100,000 zUSD,且所有支持资产合计每滚动 24 小时的全局上限为 4,000 zUSD。zUSD 有七种支持资产;其供应量即为被锁定的数量,可通过 rand_getTokenSupply 实时读取。自链 20 起,每次铸造和每次销毁均以 zUSD 收取 10 bps 的费用,作为一张票据发送至金库地址(bridge.fees):存入时记入扣除费用后的金额,销毁时在源链上释放 amount − fee。PQ 守护者或暂停密钥的轮换需附带每把新密钥自身的签名,并在被接受 86,400 s 后生效(bridge.rotation) |
| 历史 | 24 个验证节点保留 24 小时的区块(--prune-history 24h),低于此范围时返回 -32010;两个归档节点保留所有区块,公共 RPC https://rpc.randprotocol.org 转发至归档节点 |
| 区块聚合 | 关闭(创世中没有 aggregation 部分;构建会拒绝在含有该部分的创世上启动) |
| 创世价值 | 验证节点注册表中质押 26,000 RAND,七张存入票据中有 3,938.879078887 RAND,来自运营方在链 20 上的钱包,另向金库多重签名发行 100,000 RAND:水龙头铸造之前共计 129,938.879078887 RAND(rand_getSupply 报告 genesis_staked、genesis_deposited 和 multisig_issued);此外还有三张创世票据,合计 100.001999 zUSD,与其支持资产上锁定的 zUSD 相符 |
引导节点(deploy/nodes.env):
/ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe
/ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw
/ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ
链 21 运行在链 14 至 20 所用的验证节点密钥上,因此这些对等节点 ID 自链 14 的密钥轮换以来未曾改变。
浏览器 randscan.org 对链 21 建立索引,并在 https://randscan.org/api/v1 提供 REST API(浏览器 API)。全节点的 JSON-RPC 默认绑定在 127.0.0.1:8545;你可以运行自己的节点(运行节点)、使用你信任的节点,或使用公共端点 https://rpc.randprotocol.org(rand --rpc https://rpc.randprotocol.org …)。公共端点提供钱包所需的一切,包括首次同步和发送交易,限额为每个地址每分钟 1,200 次读取和 6 次发送。它不提供水龙头服务。
从水龙头获取 RAND
水龙头是一种交易类型:验证节点向一个屏蔽地址铸造一张公开金额的票据,该票据只有地址持有者才能打开。在链 21 上,与链 20 相同,它只向创世白名单上的 16 个地址发放:向任何其他地址的铸造都会被拒绝,并返回 the faucet may not mint to this recipient (not in staking.faucet_recipients),因此不在白名单上的钱包需要通过他人转账来获得测试用 RAND。下面三种方式都需要向验证节点请求铸造;观察节点会回应 faucet mints are signed by validators; ask a validator node,而公共 RPC 端点根本不转发 rand_mint。
使用 rand 钱包,指向某个验证节点的 RPC:
rand keygen # writes wallet.key.json; refuses to overwrite
rand address # the rand1… address on stdout (about 1,665 characters), its fingerprint on stderr
rand faucet # an allowlisted wallet: 100 RAND into a note only it can open
rand balance # scans the tree with this key; prints 100 RAND
rand faucet [ADDRESS] --amount <RAND> 可向另一个地址铸造,或铸造较小的金额;100 RAND 既是默认值,也是每次调用的上限。通过 JSON-RPC,同样的请求是 rand_mint:
curl -s http://127.0.0.1:8545 -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"rand_mint","params":["rand1…", "100000000000"]}'
结果是铸造交易的哈希;轮询 rand_getTransaction,直到它返回区块。金额为以单位计的字符串,1 RAND 为 10⁹ 单位。钱包应用提供同样的水龙头,一键即可领取;请使用 Rand Wallet v0.8.0 从中发送,它是面向链 21 的首个版本(链 21 上由哪个钱包发送)。本站的水龙头页面接受开发网拨款的等候名单申请。
铸造的金额在链上是公开的:这是任何从透明地址到屏蔽地址的存入都具有的一跳可见性。此后这张票据对谁价值几何,则与其他所有票据一样被隐藏。
下一步
- 账户与地址:两种密钥、
rand1…地址是什么,以及为何链 11 的 54 字符地址被撤销。 - 票据与承诺树、交易与动作、费用、共识与最终性、供应量:模型。
- 密码学与证明:基本原语、STARK 参数,以及一个交易包如何被证明和验证。
- 代币与部署 RPL 代币:RPL 标准、作为注册表条目并带有
rpl1…标识符的代币,以及从钱包创建代币。 - 程序:部署和调用机密程序,以及目前尚不可能实现的功能。
- 桥、铸造与销毁、质押、运行节点。
- 用 Rust 或 C 编写程序:完整指南,从设计程序的输入与输出,到以两种语言编写的密封投标拍卖、证明预算、部署以及检查一次调用。
- 四个示例程序:完整的应用,每个都已在 testnet 上运行:基于 Keccak 许可名单的匿名投票、基于 SHA-256 求和树的负债证明、状态在调用之间传递的链下账本,以及基于已发布模型的私密信贷决策。
- RISC-V ISA、部署 Rust 程序、部署 RISC-V 程序:使用
rand-guest工具链构建并部署你自己的程序。 - Solana 转译器与Ethereum 转译器:将 SPL Token 和 ERC-20 转译为 RISC-V,并与解释器逐字比对。
- 运行验证者与聚合者:每种角色所需的内存、CPU 和磁盘,以及实测的证明内存上界。
- 开发者:代码仓库、技术栈、zkVM 的里程碑、已有规范但尚未发布的内容,以及如何构建、测试和贡献。
- JSON-RPC、命令行、浏览器 API:参考文档。
这些页面均对照 fullnode 代码仓库自带的 docs/ 目录核对,论文则提供密码学背景。