Rand Protocol
文档
开始

简介

Rand Protocol 是什么、公共 testnet 上目前运行着哪些内容,以及如何获取 RAND 以便基于其进行开发。

阅读本页可以确定构建的对象和起点:用几段话说明链的模型、当前测试网的参数、如何获取测试用 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 上重新部署。

链 ID21(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 guesthc_bundle 60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce:4 入 4 出的隐藏资产 bundle,版本 3,层级 14
auth guesthc_auth 1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1:每个 bundle 都携带的花费授权,层级 10
multisig auth guesthc_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 上由哪个钱包发送)。本站的水龙头页面接受开发网拨款的等候名单申请。

铸造的金额在链上是公开的:这是任何从透明地址到屏蔽地址的存入都具有的一跳可见性。此后这张票据对谁价值几何,则与其他所有票据一样被隐藏。

下一步

这些页面均对照 fullnode 代码仓库自带的 docs/ 目录核对,论文则提供密码学背景。

最近一次核对所依据的 fullnode 提交为 c0878c3f(链 21),日期为 2026-10-12。