Rand Protocol
文档
代币

部署 RPL 代币

从钱包到 Rand 上线代币的分步指南:RPL 代币是什么,创建固定供应量或可增发的代币,增发并移交权限,以屏蔽方式转账和销毁,以及使用密钥在区块浏览器上查验。

本页带你把一个代币从零开始变成 Rand 上可转移的实时资产。RPL 是 Rand 的代币标准,在链 14 上新推出。如果你部署过 ERC-20 或创建过 SPL mint,请放慢速度细读第一节,因为 RPL 代币既不是前者,也不是后者。RPL 代币是本页背后的概念页面。

1. RPL 代币是什么

RPL 代币是账本代币注册表中的一个条目,而不是智能合约。无需编写、编译或审计任何代码。创建代币只需一笔交易,向注册表添加一行;此后,该代币的单位就是普通的屏蔽 note,与 RAND 存放在同一个池中,并以同样的方式花费。

字段规则
asset id32 字节,代币的身份标识。写作 rpl1…:bech32m,62 个字符,带校验和
index链在注册时分配的一个小数字(1、2……;0 是 RAND)。在本链上作为 id 的简写
name1 至 32 字节的 UTF-8,创建时即固定
symbol1 至 12 个可打印 ASCII 字符,创建时即固定
decimals0 至 9,创建时即固定
mint authority谁可以增发更多单位:无人(None)、某个密钥(Key)或桥(Bridge)
total supply公开,且仅通过铸造或销毁而变动

符号不是唯一的。 任何人都可以创建名为 USDC 的代币,正如在 Ethereum 和 Solana 上一样。代币的身份是它的 asset id,因此在接受或上架代币之前,请核对 rpl1… id,切勿只看符号。文本形式带有校验和:输错的 id 会被拒绝,而不会被发送到别处。

与 ERC-20 和 SPL 的区别

ERC-20 / SPLRPL
代币是什么一个合约,或由某个程序拥有的账户一行注册表条目;没有逐代币的代码,因此没有转账税、rebase 或钩子
余额公开,按地址记录屏蔽 note。任何人都无法读取持有者的余额,也无法列出某代币的持有者
转账发送方、接收方和金额均公开由发送方生成证明,完全屏蔽。观察者无法将其与 RAND 支付区分开
手续费链的原生币RAND。持有者需要少量 RAND 来转移代币,正如 ERC-20 持有者需要 ETH
接收SPL 需要先有代币账户无需任何设置。任何 rand1… 地址都可以接收任何代币
金额uint256 / u64u64,且最多 9 位小数
approve / transferFrom有v1 中没有
冻结、黑名单、暂停常见无
元数据链下或可变在链上且不可变
由程序持有可以v1 中不可以

保持公开的是边界:代币的注册、每一次铸造和每一次销毁,以及各自的金额。这使得任何人都可以审计总供应量。持有者之间的转账不会泄露任何信息,包括转移的是哪种代币。

2. 开始之前

你需要方法
rand 命令行运行节点会构建它;命令行列出了所有命令
一个钱包rand keygen 写出一个花费密钥文件,rand address 打印其 rand1… 地址(账户与地址)
一个可连接的节点钱包通过 JSON-RPC 与节点通信,默认连接你自己的节点 http://127.0.0.1:8545。节点将其 RPC 绑定到 localhost,因此通常的做法是运行一个跟随链 20 的自有节点。如果没有,可传入 --rpc https://rpc.randprotocol.org:公共端点支持本页的全部内容,唯独 rand faucet 会被拒绝(JSON-RPC,公共端点)
用于手续费的 RAND钱包中有少量 RAND。一次水龙头调用的 100 RAND 足以覆盖本页的全部操作,但在链 20 上,rand faucet 只向创世文件允许名单中的 16 个钱包(staking.faucet_recipients)发放,并以 the faucet may not mint to this recipient 拒绝任何其他地址;其他钱包需要由持有 RAND 的人转入(铸造与销毁)
注册费链的创世参数,介于 1 至 10,000 RAND 之间。在链 20 上为 1 RAND,因此 rand token create 的花费是 1.001 RAND:每笔交易都要支付的 0.001 RAND 基础费,加上注册费;链 20 将注册费销毁,而不是支付给区块提议者。这里的其他每条命令只花费 0.001 RAND 基础费
约 6 GB 可用内存每笔交易都在你自己的机器上生成证明。在链 20 上这是两个证明,钱包会为每个证明打印一行:proving the spend authorisation on this machine (tier 10; seconds)…,然后是 proving the bundle (tier 14; about a minute and a half on a laptop)…。bundle 证明约需 100 秒,运行期间约占用 5.7 GB 内存;两个证明在网络上分别约为 1.37 MB 和约 1.5 MB,合计约 2.85 MB。以下每个会改变链状态的步骤都是如此:创建、每次铸造、每次发送和每次销毁
rand --key wallet.key.json keygen     # writes the spend key; refuses to overwrite
rand --key wallet.key.json address    # your rand1… address
rand --key wallet.key.json faucet     # testnet only, allowlisted wallets only: asks a validator node to mint 100 RAND to this wallet
rand --key wallet.key.json balance    # scans the tree, prints the spendable value and the unspent note count

--key 默认为 wallet.key.json,也可以通过 RAND_KEY 一次性设置;--rpc(或 RAND_RPC)指定要连接的节点,默认为 http://127.0.0.1:8545。下文的命令都明确写出了 --key。在花费一次证明之前,请确认节点位于链 20:JSON-RPC 方法 rand_chainId 在该链上返回 20。钱包必须是链 20 的构建版本 v0.6.8:链 20 将每个证明和每条签名消息(包括代币铸造的)都绑定到其创世哈希,因此 v0.6.7 的 rand 生成的证明和签名会被链 20 拒绝。

3. 创建代币

token create 的金额以代币的最小单位计。 --fixed-supply 和 --initial 是基本单位的整数:在 --decimals 2 时,金额 1000000 即 10,000.00 个代币。此后的每条命令(rand send --asset、rand token mint、rand token burn)自 v0.5.10 起都采用代币的显示单位,正如 RAND 金额以 RAND 为单位(1.5):钱包从代币的注册表行中读取 decimals,小数位数超过代币所拥有位数的金额会被拒绝。在链上,金额始终是以基本单位表示的整数。

先决定一件事:将来是否还能增发更多单位? 答案在创建时就固定在代币中,之后无法放宽。

固定供应量可增发
mint authorityNoneKey:由你持有的 Dilithium2 密钥
供应量全部供应量在创建交易中一次性铸造从零开始,或从 --initial 开始;密钥持有者随时间增发
参数--fixed-supply <N> --to <rand1…>--authority-key-out <FILE>,以及可选的 --initial <N> --to <rand1…>
适用有上限的代币、会员或投票单位供应量会增长的发行方,例如积分或奖励代币

固定供应量代币

rand --key wallet.key.json token create \
  --name "Example Credits" \
  --symbol EXC \
  --decimals 2 \
  --fixed-supply 1000000 \
  --to rand1…

--to 是接收供应量的完整 rand1… 地址,例如 rand address 的输出。--fixed-supply 以基本单位计:在 2 位小数时,1000000 即 10,000.00 EXC。

该命令从节点读取注册表的下一个 index 和注册费,构建初始铸造的 note,为一个手续费 bundle 生成证明,提交注册并等待区块。成功后,它会报告提交结果,然后打印形如 index <N>, id <64 hex> (<rpl1…>) 的一行,再打印 committed at height <H>。请记下 rpl1… id:它是代币的身份标识,此后每条命令都要用到它。

默认手续费是基础费加上链的注册费,在链 20 上为 1.001 RAND,因此无需自行计算;--fee(以 RAND 计)可以提高手续费。--no-wait 在交易提交后立即返回,并跳过 committed 行。--cuda 使用已连接的 NVIDIA GPU 生成证明,需要使用 --features cuda 构建,且不会回退到 CPU。

如果在你的代币生成证明期间,另一个代币完成了注册,它会占用你的代币原本封装的 index。 节点会拒绝该注册,命令会打印 another token took index N first — re-run to register at N+1,并附上真实数字。被拒绝的注册不会进入任何区块;损失的是证明的计算,约 100 秒的工作量。再次运行该命令,它会针对下一个 index 重新生成证明。

全部供应量现在位于一个由 --to 地址拥有的屏蔽 note 中。注册及其金额是公开的;接收方之后如何处置这个 note 则不公开。

可增发代币

rand --key wallet.key.json token create \
  --name "Example Points" \
  --symbol EXP \
  --decimals 0 \
  --authority-key-out exp-authority.key.json

这会把一个新的 Dilithium2 密钥写入 exp-authority.key.json(权限模式 0600,拒绝覆盖已有文件),并以该密钥作为铸造权限、初始供应量为零来注册代币。输出与固定供应量代币相同,同为两行。--fixed-supply 与 --authority-key-out 必须且只能给出其中一个。

若要在同一笔交易中铸造首笔数量,请加上 --initial 和 --to,二者必须同时给出:

rand --key wallet.key.json token create \
  --name "Example Points" \
  --symbol EXP \
  --decimals 0 \
  --authority-key-out exp-authority.key.json \
  --initial 5000 \
  --to rand1…

注册处理期间,密钥暂存于 exp-authority.key.json.pending。链接受该注册后,它会被提升为 exp-authority.key.json;若链拒绝该注册,则会被丢弃。如果连接失败且结果未知,该文件会保留为 .pending:删除之前,请先检查 rand token list。

密钥文件就是印制该代币的权力。 请离线保存并做好备份;它与钱包的花费密钥相互独立,发送或接收时都不需要它。

为什么首次铸造的接收方是 id 的一部分

注册并不由其创建者签名。任何人只要在内存池中看到你待处理的注册,就可以提交一份副本,并用自己的费用捆绑包支付。如果资产 id 只涵盖名称、符号和数量,那么这份副本就可以把复制者自己的地址写成接收方,并抢先进入区块:他们将拥有这个 id,对于固定供应量代币,还将永久拥有全部供应量。

因此,id 是对注册中的一切内容取的哈希,包括初始铸造:其数量、接收方、随机数、时间和加密信封。接收方不同的副本会哈希出不同的资产 id。它是另一个恰好与你的符号相同的代币,而这正是一个不唯一的符号所承诺的全部。你的 id 只可能与你指定的接收方一起被注册。

--salt <hex32> 设置同样参与 id 计算的 32 字节盐值。省略时,钱包会随机选取一个。当你需要 id 可复现时,例如要在代币存在之前公布其 id,请设置该参数。

确认

rand token info rpl1…          # by id: rpl1… or 64 hex characters
rand token info 2              # or by the index `token create` printed
rand token list --limit 20     # one page of the registry; --from <index> pages on

token info 以 JSON 形式输出该代币的记录行:index、id、id_text(rpl1… 形式)、name、symbol、decimals、authority、mint_nonce、total_supply 和 registered_at。固定供应量代币的 authority 为 {"kind":"none"},可增发代币则为 {"kind":"key","key":…,"address":…}。total_supply 是以基本单位表示的十进制字符串。token list 输出 enabled、registration_fee、next_index 以及 tokens 各行。两者都读取节点的完整列表,因此节点不会得知你关注的是哪个代币。

也可以通过 JSON-RPC,参数可以是索引、64 个字符的十六进制 id,或 rpl1… 形式:

curl -s http://127.0.0.1:8545 -H 'content-type: application/json' -d '{
  "jsonrpc": "2.0", "id": 1,
  "method": "rand_getToken",
  "params": ["rpl1…"]
}'

结果与 token info 输出的记录行相同;若不存在这样的代币,则返回 null;格式错误的 id(校验和错误、大小写混用、长度不对)会返回错误 -32602。rand_getTokens 接受 [from_index, limit],可分页遍历所有已注册的代币;rand_getTokenSupply 仅返回 { total_supply, backings }。它们都不需要密钥。参见 JSON-RPC。

目前在 chain 20 上存在的一行是 zUSD,即索引 1 处的桥接代币。浏览器无需你自己运行节点,即可提供节点的注册表:

curl -s https://randscan.org/api/v1/tokens

在 chain 14 上,于 2026-09-20,该请求返回了 "registration_fee": 1000000000、"next_index": 2 和一个代币,此处仅保留其第一项支撑资产:

{
  "index": 1,
  "id": "32e5ab28c782c663e14da2650a3feb12f16a12db85599f4f62dc169d26f37b1f",
  "id_text": "rpl1xtj6k2x8strx8c2d5fjs50ltztck5ykms4ve7nmzmstf6fhn0v0spelqtx",
  "name": "Shielded USD",
  "symbol": "zUSD",
  "decimals": 8,
  "authority": {
    "kind": "bridge",
    "backings": [
      { "chain": 2, "token": "000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7",
        "decimals": 6, "locked": "0", "minted_today": "0", "mint_day": 20716,
        "mint_cap_per_day": "10000000000000" }
    ]
  },
  "mint_nonce": 0,
  "total_supply": "0",
  "registered_at": 256
}

在 chain 20 上,该行的 id、id_text、名称、符号和支撑资产均相同,但 zUSD 列在创世区块中,而不是在高度 256 注册(registered_at 为 0),其供应量起始为 99 zUSD:Ethereum USDT 上锁定 22,BSC USDT 上 22,Tron USDT 上 30,Solana USDT 上 25,均承接自 chain 19。(chain 19 起始为 10 zUSD,全部在 Solana 上;chain 18 起始为 Tron 上 9 加 Solana 上 1。)每个支撑资产行还带有滚动窗口字段 minted_in_window、mint_window_secs 和 mint_headroom。

浏览器中的 registration_fee 是 JSON 数字;节点自己的 RPC 则与所有金额一样,以十进制字符串返回。在 chain 20 上,与自 chain 15 以来的每条链一样,节点的 rand_getTokens 还带有 max_tokens(4096)、burn_registration_fee 和 bound_note_value(二者均为 true)(RPL tokens)。

4. 铸造,并移交权限

只有拥有 Key 权限的代币才能被铸造,且只能由该密钥铸造。

rand --key wallet.key.json token mint \
  --asset rpl1… \
  --to rand1… \
  --amount 5000 \
  --authority-key exp-authority.key.json

--amount 以代币的显示单位计:这个 0 位小数的代币的 5000 即 5,000 个基本单位,而 6 位小数代币的 1.5 则是 1,500,000。在构建票据或证明之前,钱包会读取该代币的记录行,如果代币不是 Key 授权,或者 --authority-key 不是注册表中指明的密钥,则会拒绝。成功后,它会报告提交结果,并输出 minted <amount> (<base units> units) of asset <index> to <address>。--fee(默认 0.001 RAND)、--no-wait 和 --cuda 的作用与 token create 中相同。

一次铸造会为接收方追加一张票据,并增加总供应量。数量和接收方的公钥会出现在链上:铸造按设计是一个公开事件,与通过桥存入资产相同。接收方一旦转移该票据,它就像其他一切一样被屏蔽。支付费用的钱包(--key)与授权铸造的密钥(--authority-key)是不同的密钥,可以由不同的人持有。

每次铸造都对链 id、资产 id 和注册表维护的一个计数器签名,在 chain 20 上还对创世哈希签名(rand-rpl-mint-2),因此铸造无法在这条链上被重放,也无法被复制到另一条链,即便那条链与此链共用同一个链 id。set-authority 以同样的方式绑定。

若要把权限移交给新密钥,或永久放弃:

rand --key wallet.key.json token set-authority \
  --asset rpl1… \
  --authority-key exp-authority.key.json \
  --new-key next-authority.key.json

rand --key wallet.key.json token set-authority \
  --asset rpl1… \
  --authority-key exp-authority.key.json \
  --renounce

--new-key 接受一个密钥文件,并把代币交给该文件的公钥;--new-key 和 --renounce 必须且只能给出其中一个。该命令会输出 asset <index>'s mint authority is now <public key hex>,或 asset <index>'s mint authority is renounced for good。每一项都需要 0.001 RAND 的基础费用和一轮证明。--renounce 会使代币以其当前供应量成为固定供应量代币。这是单向的:权限只能从一个密钥传给另一个密钥,或从一个密钥传给无人,别无他途。以固定供应量创建的代币永远不能变为可铸造。

5. 使用

发送

rand --key wallet.key.json send rand1… 250 --asset rpl1…

这会发送 250 个该代币(以显示单位计):0 位小数时为 250 EXP,2 位小数时为 250.00 EXC(25,000 个基本单位)。接收方和数量是位置参数,与 RAND 相同。在开始证明之前,钱包会输出一行 to fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <symbol> (<base units> units),并询问 send? [y/N]。请把指纹与接收方的指纹核对,并把基本单位与你的本意核对。--yes 会跳过询问,脚本必须传入它:没有它时,不是终端的 stdin 会被拒绝。--asset 接受索引、rpl1… id 或 64 个字符的十六进制 id,省略时则发送 RAND。--memo <text> 会把最多 510 字节的文本密封给接收方,放在支付的信封内,chain 18 是第一条允许这样做的链;链上没有任何迹象表明存在备注。--fee 始终以 RAND 计,默认为 0.001;--no-wait 和 --cuda 同样适用。id 会根据节点的完整注册表列表解析为索引,而数字索引根本不会到达节点,因此节点不会得知哪个代币即将被转移。这与转移 RAND 的是同一个 rand send,证明过程也相同。无论移动的是哪种资产,该交易都会公布四个作废符、四个承诺、一笔 RAND 费用、一个时间、四个加密信封、捆绑证明,以及自 chain 17 起的一个授权承诺及其证明。观察者无法区分代币转账与 RAND 支付,无法得知是哪种代币,也看不到发送方、接收方或数量。

费用从同一个捆绑包中以 RAND 支付,因此发送方钱包必须持有一些 RAND。钱包在开始证明之前会检查这一点。

查询余额

rand --key wallet.key.json asset-balance 2     # one token, by index
rand --key wallet.key.json asset-balance       # a row for every token this wallet holds

参数是注册表索引。对于单个代币,钱包会输出 asset <index> balance: <N> units,以基本单位计。rand notes 列出钱包已打开的每张票据及其 asset 索引。钱包通过用其查看密钥扫描链来找到自己的票据。链上没有任何地方保存可供它查询的余额。

销毁

rand --key wallet.key.json token burn rpl1… 100

资产和数量是位置参数:资产为索引、rpl1… 或十六进制,数量以代币的显示单位计,读取方式与 send --asset 相同。--fee 默认为 0.001 RAND;--no-wait 和 --cuda 适用。

销毁会毁掉相应单位并降低总供应量。与铸造一样,它是一个公开的边界:数量和代币可见,持有者不可见。像 zUSD 这样的桥接代币不能以这种方式销毁:token burn 会在证明之前拒绝它,它应通过 rand bridge-burn 离开,后者会释放其背后的币。

6. 在浏览器中验证

randscan.org 向所有人展示代币的公开部分:它的注册信息、增发与销毁,以及总供应量。所有代币都列在 randscan.org/tokens,单个代币的页面为 /tokens/<rpl1…>、/tokens/<64 hex> 或 /tokens/<index>;randscan.org/tokens/1 即 zUSD。相同的数据也可通过 GET /api/v1/tokens 和 GET /api/v1/tokens/:id 获取,后者包含该代币的部署交易,以及由注册、增发和销毁构成的供应量历史(Explorer API)。

一笔转账的公开页面不显示资产、金额和参与方,因为链上并不存在这些信息。若要向他人证明一笔付款,例如向审计方、交易对手或交易所证明,请给对方一把密钥:

密钥持有者能看到什么
交易密钥某一笔交易的某一个输出被打开:代币、金额和参与方
查看密钥该钱包发送或接收过的每一张票据,细节相同,并显示每张是否已花费
rand --key wallet.key.json tx-key <TX_HASH>    # the keys for one transaction
rand --key wallet.key.json viewing-key         # the wallet's viewing key, 64 hex characters

tx-key 会为该交易中本钱包发送、接收或作为找零保留的每个输出打印一行:输出(bundle:0 至 bundle:3,即该 bundle 的四个槽位)、角色、金额(以 RAND 计,代币则为 N (asset I)),以及该输出封装时所用的单笔交易密钥。请交出 sent 行的密钥。它对任何历史交易都有效,因为钱包会从链上恢复该密钥。

将交易密钥粘贴到 randscan 上该交易的页面,即可打开该输出;浏览器会根据注册表解析资产索引,按名称显示代币,并应用其小数位数。查看密钥则填入 randscan.org/viewing。浏览器不持有任何密钥,也不在其服务器上解密任何内容。通过 JSON-RPC,同样的披露是 rand_checkTransaction(hash, key)。两种密钥都不能花费任何资金。查看密钥一旦共享便无法收回,因此只需证明一笔付款时,请优先使用交易密钥。

7. 桥接代币

zUSD(“Shielded USD”)同样是一种 RPL 代币,其权限为 Bridge:只有当守护者证明 Ethereum、Binance Smart Chain、Tron 或 Solana 上存入了 USDT 或 USDC 时,才会增发相应数量,其供应量始终等于锁定在那里的数额。它在 chain 14 上通过高度 256 的交易完成注册,索引为 1,有七种支持资产;此后每条链的创世区块,包括 chain 20,都以相同的 id rpl1xtj6k2x8strx8c2d5fjs50ltztck5ykms4ve7nmzmstf6fhn0v0spelqtx 再次列出它。chain 15 承接了 chain 14 停止时仍未赎回的 10 zUSD,chain 16 至 19 以同样的 10 zUSD 启动,chain 20 则以 chain 19 上未赎回的 99 zUSD 启动。在 chain 20 上,桥对每笔存入和每笔赎回收取 10 bps,以 zUSD 计,转入一张金库票据(Bridge)。zUSD 是一篮子资产:其支持资产按面值合并,因此持有者承担所有已列币种的风险,而不只是自己存入的那一种(RPL tokens)。它的供应量随每笔存入和赎回而变化;rand token info 1 或浏览器的 /tokens/1 会给出当前数字。

它在 chain 14 上的经历,chain 14 是较早的 testnet(于 2026-09-20 在浏览器上核对)。下表是 chain 14 的历史:chain 14 已退役,因此这些交易不在 chain 20 的浏览器上:

事项交易(chain 14)高度
注册(register_bridged_token)7fa28fe6277a82401dcc440ff32da13c5e5763f79826fb17cc508f4c15abdd13256
一次桥接增发(bridge_attest)f2f24d75bc0e7d84dff1f4e4518a9d4bef115392492a39befca1528a2404851d2,572
一笔 zUSD 屏蔽转账e6ddaca3c852e6c861524a55d00a0fbdcaff6867544b9f19b9bf60ce263c32ed3,259
一次桥接销毁(bridge_burn)f9f365ca170a5fb51ff9381d7b5cc39538c1a621e5f6e8c1bd74d8751c7bbc493,481

这笔转账的页面显示的与任何代币转账相同:四个作废符、四个承诺和一笔费用,没有任何内容表明 zUSD 发生了转移。

为了展示一把密钥会披露什么,fullnode 的 v0.5 发布说明针对那笔 chain 14 转账公布了两把密钥,来自一个专为此目的创建、不存放其他资产的演示钱包:

密钥值它能打开什么
该转账的交易密钥7f68f57c4f33a3f0fe419f4d1a5df2875461339dbc454af8ced50cbd7f40e4ef该笔交易的输出 bundle:0:资产 1 的数额 100000000,即 1 zUSD
演示钱包的查看密钥a93c673ffeff7204447161347828d8e549b7070460813ae1b7e664694e1dcd5d该钱包发送或接收过的每一张票据

在 chain 14 上,该交易密钥可在转账页面上打开该输出,通过 JSON-RPC 则只需一次调用(于 2026-09-20 核对)。对于你自己的交易,这个调用在 chain 20 上的形式相同;若使用这些 chain 14 的值,chain 20 节点会返回 null(于 2026-10-01 核对),因为它从未持有那笔交易:

curl -s https://rpc.randprotocol.org -H 'content-type: application/json' -d '{
  "jsonrpc": "2.0", "id": 1, "method": "rand_checkTransaction",
  "params": ["e6ddaca3c852e6c861524a55d00a0fbdcaff6867544b9f19b9bf60ce263c32ed",
             "7f68f57c4f33a3f0fe419f4d1a5df2875461339dbc454af8ced50cbd7f40e4ef"] }'

切勿公开你正在使用的钱包的查看密钥:它会永久暴露该钱包的全部历史。

普通地址无法创建桥接代币。rand token create 会拒绝 Bridge 权限,而注册桥接代币,或在已有代币之下增加一种支持币种,需要桥的后量子守护者集合签署的法定人数。一个自称 zUSD 却没有这些的代币,只是借用了符号的另一种代币,这也是要核对 rpl1… id 的又一个理由。桥接代币在 Rand 上始终为 8 位小数。

Bridge 涵盖存入、赎回和守护者集合。

最近一次核对所依据的 fullnode 提交为 c0878c3f(链 21),日期为 2026-10-12,以及 fullnode `docs/tokens.md`, `docs/cli.md`, `docs/rpc.md` and the wallet's output lines in `crates/randprotocol-client/src/main.rs`; randscan `adfe129` (`docs/api.md`); the live registry at `randscan.org/api/v1/tokens` on 2026-09-20. The commands on this page were checked against those sources, not run by us on chain 14. Updated for chain 15 against fullnode `8abf85e` (v0.5.9) and `deploy/genesis-chain15.json`. Updated for chain 18 on 2026-09-30 against fullnode `90e7716` (the fleet runs v0.6.7 `86941a1`): `docs/tokens.md`, `docs/cli.md`, `docs/shielded.md` §2, `deploy/genesis-chain18.json` and the wallet's output lines in `crates/randprotocol-client/src/main.rs` and `wallet.rs` at the v0.6.7 tag; randscan `fffa404` (`docs/api.md`). The commands were checked against those sources, not run by us on chain 18; the zUSD transactions in section 7 are chain 14's. Updated for chain 20 on 2026-10-01 against fullnode `c9c9bd3c` (v0.6.8): `deploy/genesis-chain20.json` (`tokens`, `binding_domain`), `crates/randprotocol-core/src/types/binding.rs` (the genesis-bound mint and authority messages), and the live `rand_chainId`, `rand_getTokens` and `rand_checkTransaction` on 2026-10-01 Updated for chain 21 on 2026-10-12 against fullnode `c0878c3f` (v0.8.0): `deploy/genesis-chain21.json` (`tokens`, `fees`), `rand_getTokens` and `rand_getSupply` on chain 21; the commands were not run on chain 21.。 若代码与本页不一致,以代码为准;请告知我们。