三個二進位檔案由 cargo build --release 產出:rand-node(節點及營運者指令)、rand(shielded 錢包)與 rand-prover(委派 prover)。每個指令均接受 -h/--help。本頁描述 v0.6.8 版本(c9c9bd3c),即 chain 20 所運行的構建;v0.6.7 的行為有所不同之處,會另行註明。早於 v0.6.8 的 rand 錢包無法在 chain 20 上發送交易,因為其創世區塊將每個證明與已簽署訊息均綁定至該創世區塊的雜湊。前兩者所持的密鑰種類不同:節點密鑰是用於為區塊簽署的 Dilithium2 密鑰對;錢包密鑰是 shielded 花費密鑰,不會在鏈上簽署任何內容。
rand-node
rand-node <COMMAND>
keygen Generate a new Dilithium2 key file (refuses to overwrite an existing one)
address Print the address, public key, and libp2p peer id of a key file
genesis Write a genesis.json: every validator key is staked, each --alloc becomes a deposit note
alloc-note Print one genesis alloc note as JSON, RAND or a listed token, for splicing into a genesis
init Initialise a data directory from a genesis file
run Run the node
verify Verify the chain in a data directory without running the node
db Database maintenance on a stopped node's data directory
safety status | clear-halt | release-lock: a stopped validator's consensus safety state
status Show node status
register Print this node's Registration, for the wallet that bonds it in
admit sign | submit: the validator set's vote to admit a new key (admission by vote)
unbond Move bonded stake into unbonding
withdraw Pay released stake and rewards into a note at the payout address
bridge-gov rotate-pq | rotate-pause | cancel-rotation: the bridge's post-quantum rotations
vesting status | claim | revoke | bond | unbond: genesis vesting (chains with a vesting section)
aggregator register | unbond | withdraw — the aggregator role (aggregation chains only)
aggregate The aggregate daemon (aggregation chains only)
safety、admit 與 bridge-gov 為 v0.6.8 新增。系統沒有 balance 或 transfer:轉賬需要 shielded 花費密鑰,而只有錢包持有該密鑰。
有一個全域旗標 --allow-test-fri-profile(或 RAND_ALLOW_TEST_FRI_PROFILE=1),可讓 init、run 及 verify 接受 fri_profile 為 test 的創世區塊。該設定檔約有 17 位元的安全性,而任何人撰寫創世檔案時均可指定它,因此自 v0.6.8 起,節點在沒有該旗標時會拒絕此類創世區塊。測試套件會設定該旗標;其他情況均不應使用。
keygen、address
| 指令 | 參數 | 預設值 |
|---|---|---|
keygen | --out <OUT> | node.key.json |
address | --key <KEY> | 必填 |
keygen 會以 0600 權限寫入 { "seed": <32-byte hex>, "address": <base58>, "public_key": <hex> }。該檔案是種子的唯一副本。自 v0.6.8 起,若 --out 已存在,keygen 會拒絕執行(… already exists or cannot be created; refusing to overwrite a key file),並保持原檔不變;系統沒有 --force,因此要替換舊檔案,須先將其移開。v0.6.7 及更早版本會在不詢問的情況下覆寫。address 會輸出 address、public_key(1,312 byte 的十六進位)及 peer_id。
genesis
| 參數 | 預設值 | 涵義 |
|---|---|---|
--chain-id <CHAIN_ID> | 1 | 鏈 id;交易與 gossip 主題均綁定至此 id |
--validator <KEY,STAKE,PAYOUT> | 必填,可重複 | 一個登記項目:密鑰檔案路徑或十六進位公鑰、以 RAND 計的質押額(至少 1,000)、rand1… 收款地址 |
--epoch-blocks <N> | 1000 | 每個 epoch 的區塊數 |
--alloc <ALLOCS> | 無,可重複 | 一張存款 note:rand1<address>=<amount in RAND> |
--out <OUT> | genesis.json | 輸出路徑 |
--faucet | 關閉 | 僅限 testnet:啟用 Mint。若與 bridge 區段並用,則須加上 --testnet |
--testnet | 關閉 | v0.6.8:寫入 "testnet": true,此標記容許水龍頭與 bridge 區段並存。指定時屬於創世雜湊的一部分 |
--no-confidential | 關閉 | 停用 Deploy 與 Call |
--fri-profile <production|test> | production | test 並不安全,僅供測試套件使用;init、run 及 verify 在沒有 --allow-test-fri-profile 時會拒絕此類檔案 |
--max-program-words <N> | 無(4096) | 一次部署可攜帶的最大程式大小,1..=65535。僅在指定時才寫入;只要存在即屬於創世雜湊的一部分,因此 --max-program-words 4096 與省略該旗標是兩條不同的鏈。每個節點在對此類檔案執行 init 之前,均須使用 v0.4 二進位檔案 |
--max-proof-bytes <N> | 無(2,097,152) | 一筆交易可攜帶的最大證明,1048576..=33554432。所有證明上限均隨之而定 |
--max-block-bytes <N> | 無(4,194,304) | 最大區塊,亦即最大交易,4194304..=67108864,且至少為 2 × max_proof_bytes + 1 MiB;若使用 --auth-guest,一次呼叫攜帶三個證明(bundle、auth、call),則至少為 3 × max_proof_bytes + 1 MiB |
--max-call-envelope-bytes <N> | 無(18,432) | 最大的呼叫輸入信封,18432..=1048576 |
--max-program-public-words <N> | 無(0) | 一次部署可固定的最大公開輸入,0..=65535;0 表示不容許任何公開輸入 |
--tokens <TOKENS.JSON> | 無 | RPL 的 tokens 區段,為 JSON 檔案 {"registration_fee": …, "mint_cap_per_day": …, "tokens": [...]}。省略時,檔案不含此區段,雜湊與以往相同。bridge 區段需要搭配 mint_cap_per_day 不為零的此檔案(按每種支持資產、每個 UTC 日計,以該代幣的八位小數單位表示);列出的代幣則需要 bridge 區段 |
--envelope-bytes <N> | 無(舊版 1,348 byte 信封) | 每個 note 信封的確切大小:bundle 輸出、水龍頭鑄造、提款、bridge 存款、創世 alloc。僅接受 1860,這是讓每個信封均可攜帶加密備註的大小。指定時屬於創世雜湊的一部分,並在此指令自身的 --alloc note 封裝之前設定 |
--vesting <VESTING.JSON> | 無 | vesting 區段:設有時間鎖的分配,{"entries": [{"id", "class", "beneficiary", "amount", "start_ms", "cliff_ms", "linear_ms", "step_ms"?, …}]}。自 v0.6.8 起,可撤銷項目須列出 revokers(1 至 5 把密鑰)、一個 threshold,以及撤銷時付款的 treasury,缺漏任何一項的檔案會被拒絕 |
--staking <STAKING.JSON> | 無 | v0.6.8:以 JSON 檔案提供的 staking 區段(faucet_budget_per_epoch、bond_activation_epochs、max_weight_bps、max_stake_entry_per_epoch 或 max_stake_entry_bps_per_epoch、registration_v2、faucet_recipients、faucet_minters、admission_by_vote、slashing),由構建程序驗證 |
--consensus-domain <0|1> | 無(0) | v0.6.8:1 會將每張投票、new-view 及提案綁定至此創世區塊 |
--bundle-guest <v1|v2|v3> | v1 | 固定為 hc_bundle 的 bundle guest:v1(chain 14 與 15 所運行的隱藏資產 guest)、v2(chain 16 的無分支 guest)或 v3(分拆授權:guest 取用 nk 及一個 salt,而非花費密鑰)。v3 需要 --auth-guest |
--auth-guest | 關閉 | 將此構建的 auth guest 固定為 hc_auth:每個 bundle 此後均攜帶一個針對花費密鑰、綁定至其交易的 auth 證明,其輸出等於該 bundle 的 auth_commit。與 --bundle-guest v3 並用時為必須,與 v1 或 v2 並用時則會被拒絕,且在寫入任何檔案之前即拒絕。未指定時,檔案不含 hc_auth 欄位 |
--hardening-v6 | 關閉 | 將 v0.6 規則轉為有效性規則(hardening_v6):pc 窗口、不可呼叫的部署、規範的證明形態與 proof-of-work 字、呼叫綁定及程式表下限。未指定時,節點仍會在其交易池以政策形式拒絕這些內容 |
--gas-price <UNITS> | 無(沒有 gas 區段) | 鏈本身對每次呼叫按每單位 gas 收取的單位數(10⁻⁹ RAND)。此旗標負責寫入 gas 區段(metering: "circuit");沒有它時,以下三個旗標會被拒絕。屬於創世雜湊的一部分 |
--byte-price <UNITS> | 800,僅限與 --gas-price 並用 | 呼叫證明加輸入信封每 KiB(不足 1 KiB 亦按一 KiB 計)的單位數,由第 0 個 byte 起計 |
--bundle-gas-limit <N> | 20479,僅限與 --gas-price 並用 | 每個 bundle 證明必須聲明的確切 GAS_LIMIT;聲明任何其他數值的 bundle 證明會被拒絕。創世區塊只接受 20479,即 tier-14 bundle guest 的 gas_max(14, 0, 0) |
--gas-dynamic <TARGET_BYTES,TARGET_GAS,ADJUST_BPS> | 無(固定價格) | 啟用按區塊調整的價格控制器,以該區段自身起始的 gas_price 及 byte_price 為下限。與 --aggregation 並用時會被拒絕 |
--max-gas-price <UNITS>、--max-byte-price <UNITS> | 無(沒有上限) | v0.6.8:控制器不會將價格調升至其上的上限,各自至少等於起始價格。沒有 --gas-dynamic 時會被拒絕 |
--gas-byte-load paying | 無(每筆交易的 byte) | v0.6.8:僅有呼叫的證明與輸入信封會推動 byte_price,因此一個全為轉賬的區塊不會推動任何價格。沒有 --gas-dynamic 時會被拒絕;paying 是唯一可用的值 |
--binding-domain <0|1> | 無(沒有此欄位) | v0.6.8:1 會將創世雜湊綁定至每項交易綁定及每則已簽署的操作訊息(水龍頭鑄造、unbond、提款、RPL 代幣訊息、aggregator 操作、bridge 治理訊息),因此為此鏈所作的證明或簽署在其他任何鏈上均無法通過驗證。省略時,指令會發出警告:v0.6.8 錢包在 14 至 19 以外的每個鏈 id 上均以綁定創世區塊的形式作證明,因此自 chain 20 起的每條鏈均以 1 創建 |
--proof-window-blocks <N> | 無(256) | v0.6.8:一個窗口,256 至 4,096 個區塊,規定 bundle 的 anchor 及其 time 可有多舊。以 rand_getLimits.proof_window_blocks 提供 |
--program-state-cell-fee <UNITS> | 無(沒有 program_state 區段) | v0.6.8,RPL-2:啟用程式 cell、程式 vault 及 Invoke 操作,並以此 cell 費用(以 RAND 單位計,至多 1,000 RAND)按每個所創建的 cell 加入 invoke 的費用下限。需要 --tokens、--gas-price、--hardening-v6 及 --auth-guest,缺少任何一項均會在寫入任何檔案之前按名稱被拒絕 |
--aggregation <BOND,MAX_COVERS,SUBSIDY,HALVING,WINDOW>、--admitted-shape <…> | 無 | aggregation 區段;v0.6.8 構建會拒絕在含有此區段的創世區塊上啟動 |
指令會為每個 --alloc 輸出一行 alloc,然後輸出創世雜湊、validator 與 note 的數目、epoch 長度、五項上限、hc_bundle 與 hc_auth(沒有 --auth-guest 時為 none),再輸出 gas 行:gas: price P/gas, B/KiB, bundle limit N, dynamic: target … B / … gas, adjust … bps, floor …/…, ceiling …/…, byte load all|paying;沒有 --gas-price 時為 gas: none;若有 --program-state-cell-fee,則另有一行 program_state: cell fee N RAND。init 會輸出相同的 gas 行。五個上限旗標的行為一致:省略時,檔案沒有該欄位,鏈按預設值運行;指定時,即使取預設值,該欄位亦屬於創世雜湊的一部分。Chain 20 以這些旗標創建(deploy/cut-chain20-genesis.sh):
--max-program-words 65535 --max-proof-bytes 4194304 --max-block-bytes 20971520 \
--max-call-envelope-bytes 65536 --max-program-public-words 32768 \
--tokens tokens.json \
--bundle-guest v3 --auth-guest --hardening-v6 \
--gas-price 100 --byte-price 800 --bundle-gas-limit 20479 --gas-dynamic 10485760,262144,1250 \
--max-gas-price 10000 --max-byte-price 80000 --gas-byte-load paying \
--envelope-bytes 1860 \
--testnet --binding-domain 1 --proof-window-blocks 1024 --program-state-cell-fee 10000000 \
--epoch-blocks 1000 --faucet --fri-profile production
第18和第19條鏈以相同旗標切出,直至 --envelope-bytes 1860 為止,而 v0.6.8 的旗標一概沒有使用。證明大小上限為 4 MiB,低於第 13 至 16 條鏈的 8 MiB:一筆拆分授權的交易最多帶有三份證明,而 3 × 4 MiB + 1 MiB 可容納於 20 MiB 的區塊之內。tokens.json 載有 1 RAND 的 registration_fee、10000000000000 的 mint_cap_per_day、max_tokens 4096、burn_registration_fee 與 bound_note_value,並列出 zUSD 及其七項支持資產。並無 --bridge 旗標,切創世腳本仍會在事後將 bridge、staking 與 consensus_domain 各節拼接進檔案(在第20條鏈上:bridge 設於守護者集合 1,帶有八把後量子守護者金鑰、暫停金鑰、rules_v2、rotation 與 fees;staking 一節載有水龍頭允許名單、admission_by_vote 及 2,500 bps 的加入額度;consensus_domain: 1;以及 zUSD 的創世 note,以 alloc-note --asset 1 --envelope-bytes 1860 製成)。具意義的創世雜湊,是 init 在完成的檔案上所印出的那一個。
每個 --alloc 會以全新的承諾隨機數建立一個存入 note,因此切創世兩次會得出兩個不同的雜湊。該命令總會在 cm 與 amount 旁寫入該 note 的開啟資料(opening),而設有 tokens 一節的鏈則要求如此:
"alloc": [
{ "cm": "<64 hex>",
"envelope": { "kem_ct": "<hex>", "to_receiver": "<hex>", "to_sender": "<hex>", "body": "<hex>" },
"amount": 1000000000000,
"opening": { "pk": "<64 hex>", "time": 0, "r": "<64 hex>" } }
]
因此,創世檔案一經發布,創世 note 的擁有者與金額即按設計公開;只有它日後在何時、花用到何處,仍保持私密。創世只切一次,並保存該檔案。
alloc-note
--to <rand1…>(必填)、--amount <N>(必填)、--asset <INDEX>(預設 0)、--envelope-bytes <N>(預設:舊版格式)。以 JSON 印出一個 alloc note,並如 genesis --alloc 封裝 note 般,向 --to 封裝。設有 envelope_bytes 的創世,會拒絕未帶相符 --envelope-bytes 而封裝的 note。--amount 以資產的整數單位計:RAND 為九位小數,橋接代幣為八位(資產 1 的 10 即 10 zUSD)。屬於已列出代幣的 note,要求該代幣的支持資產所帶的 locked 金額,總和須恰好等於其 note 的總額。
init
| argument | meaning |
|---|---|
--datadir <DATADIR> | 要建立的資料目錄 |
--genesis <GENESIS> | 創世檔案;複製至 <datadir>/genesis.json |
印出創世雜湊,以及與 genesis 相同的 gas: 行。
run
| argument | default | meaning |
|---|---|---|
--datadir <DATADIR> | required | 已初始化的資料目錄 |
--key <KEY> | required | 金鑰檔案:驗證者身份、p2p 身份、費用收款方 |
--listen <LISTEN> | /ip4/0.0.0.0/tcp/30303 | libp2p 監聽 multiaddr,可重複 |
--bootstrap <BOOTSTRAP> | none, repeatable | /ip4/<ip>/tcp/<port>/p2p/<peer-id>,啟動時撥接,並在斷線期間每 30 秒再撥一次。自 v0.6.8 起,其 peer id 屬保留 |
--reserved-peer <PEER_ID> | none, repeatable | v0.6.8:獲准越過入站連線上限的對等節點,並從同步預算中屬於驗證者的份額獲得服務。引導節點,以及本節點已見過其簽署 peer 綁定的每個驗證者,不必列出即屬保留;在剛切出、儲存中尚無任何綁定的鏈上,請在此列出機群的各驗證者 |
--strict-gossip | off | v0.6.8:gossipsub 的嚴格驗證,只接受帶有有效作者簽署、序號及來源的訊息。嚴格與寬鬆的節點可互通,因此可逐個節點推行 |
--rpc <RPC> | 127.0.0.1:8545 | 營運者的 JSON-RPC 監聽器:涵蓋所有方法,且信任本機迴路。請讓它保持於本機迴路,切勿將公開端點轉發至它 |
--public-rpc <ADDR> | off | v0.6.8:第二個公開監聽器,方法集固定(不含 viewing key 方法、rand_mint 或 rand_getPeers),不設批次、不設 WebSocket,所有呼叫者共用一個計量;反向代理或 SSH 轉發應指向此處(JSON-RPC) |
--rpc-viewing-token-file <PATH> | off | v0.6.8:要求 --rpc 的 viewing key 方法帶有 Authorization: Bearer <first line of the file>(32 個或以上字元) |
--validator | off | 以此金鑰參與共識 |
--no-mdns | off | 停用區域網絡探索 |
--block-interval-ms <MS> | 1000 | 提案之間的最短間隔 |
--view-timeout-ms <MS> | 3000 | 基礎視圖逾時;每連續逾時一次即加倍,上限為 8 倍 |
--verify-chain <MODE> | quick | off、quick、full |
--keep-raw-proofs | off | 聚合鏈上的歸檔模式 |
--prune-history <WINDOW> | none (keep everything) | 僅保留這段時間的區塊歷史,<n>m、<n>h 或 <n>d,最少 1h:較舊的區塊會失去其區塊、QC、交易與收據;帳本則保留。在第20條鏈上,26 個驗證者中有 24 個運行 24h,另有兩個節點為歸檔節點;歸檔節點與 mainnet 節點從不設置此項。查詢低於下限的高度會回應 -32010(JSON-RPC) |
--min-free-disk-mb <MB> | 1024 | 若資料目錄所在檔案系統的可用空間少於此值,則拒絕啟動;低於其四倍時,rand_getHealth 會報告 disk_low。0 即停用此防護 |
--rpc-viewing-open | off | 讓非本機迴路的呼叫者使用 viewing key 方法;僅限置於具備身份驗證的機制之後 |
--gas-price <UNITS> | 100 | 本節點的交易池對呼叫要求的每 gas 單位數(10⁻⁹ RAND),以超出其證明標頭的 gas_max 部分計。此為准入政策,並非鏈的規則:載有較廉價呼叫的區塊仍然有效。0 連同 --byte-price 0 即不施行任何政策。在創世設有 gas 一節的鏈上(如第20條鏈),鏈本身的價格即為有效性規則 |
--byte-price <UNITS> | 800 | 每 KiB(不足一 KiB 亦按一 KiB 計)的呼叫證明與輸入信封所需單位數,由第 0 個位元組起算,適用同一政策 |
--prover <ADDR> | off | 在此地址上託管委託證明者(prover_* JSON-RPC):使用獨立的監聽器,且必須有別於 --rpc。若 <prover-home>/prover.key.json(由 rand-prover keygen 產生)不存在,節點拒絕啟動 |
--prover-home <DIR> | <datadir>/prover | 證明者的 prover.key.json 與 pairings.json |
--prover-accept-spend-key | retired | 自 v0.6.8 起於啟動時被拒絕:run 若帶有此旗標,會在讀取節點金鑰之前退出,並指明該旗標。再沒有證明者接受花費金鑰見證;請將其從 unit 檔案中移除。在 v0.6.7 上,它接受 bundle guest v1 或 v2 鏈的花費金鑰見證 |
--prover-max-parallel <N> | 1 | 所託管的證明者同時運行的證明數;除非有 5.74 GB × N + 1 GiB 的可用記憶體,否則拒絕啟動 |
--prover-max-queue <N> | 8 | 超出運行中任務之外的排隊任務數 |
--prover-cuda | off | 在 CUDA 後端上生成證明(須以 --features cuda 構建);不設 CPU 後備 |
--prover-skip-memory-check | off | 略過可用記憶體檢查 |
--prover-fee <RAND>, --prover-fee-address <rand1…> | none | 每個送往所託管證明者的任務必須支付的費用,以 RAND 計,最多九位小數:向該地址支付一筆 RAND 輸出,置於所證明的 bundle 之內。兩個旗標須同時提供 |
--prover-allow-origin <ORIGIN> | browser extensions and loopback pages | 其頁面可讀取證明者回覆的瀏覽器來源,可重複;一旦給出一次或以上,所列數值即為完整名單。* 會允許所有網站,並印出警告 |
環境變數:RUST_LOG(預設 info,libp2p=warn,libp2p_mdns=off)。按 Ctrl-C 或 SIGTERM 會讓節點正常關閉。
公開端點 https://rpc.randprotocol.org 是位於歸檔節點之前的允許名單代理;自 2026-10-01 起,其允許名單即公開監聽器的方法集。
safety
已停止的驗證者的共識安全狀態(v0.6.8)。每個命令均自行開啟資料目錄,因此不可與運行中的節點並行執行。
rand-node safety status --datadir <dir>
rand-node safety clear-halt --datadir <dir> --i-have-compared-this-node-with-the-fleet
rand-node safety release-lock --datadir <dir> --i-give-up-this-validators-lock
status 印出已提交的鏈首、視圖與最後投票的視圖、高位 QC、驗證者是否鎖定於鏈首之上,以及任何已記錄的安全停機。若節點見到已認證的三鏈試圖提交一個並非源自其自身已提交鏈首的區塊,便會停止並記錄此事(審計 v6,CON-5);其後 run 會帶著該記錄退出,直至 clear-halt。清除之前,請將本節點的鏈首與另外兩個驗證者的比較,若有差異,須先從歸檔節點重新同步。自 v0.6.8 起(CON-4),不再有任何「未持有」答覆的法定人數可解除鎖定:鎖定於一個其無法取得的區塊的驗證者會保持靜默,直至收到其 justify 高於該鎖定的提案,或取得該區塊為止。release-lock 會將持久化的鎖定降至已提交鏈首的證書;每次只對一個驗證者使用,且僅限該區塊已永久遺失之時。沒有其確認旗標時,每個寫入命令只會印出它將會做的事,而不作任何更改。
verify
| argument | default | meaning |
|---|---|---|
--datadir <DATADIR> | required | 節點不得運行 |
--mode <MODE> | full | quick 或 full |
--repair | off | 截去受損的尾部;安全狀態予以保留 |
若一致則結束碼為 0;若發現問題而未使用 --repair,則為 2。
db
db drop-receipts-index --datadir <DATADIR>,須在節點停止時執行:在回滾至 v0.3 之前的構建前,先丟棄 receipts_by_program 索引,因該構建無法開啟帶有此索引的資料庫。其後啟動時會從收據重建該索引。
status
--rpc <URL>(預設 http://127.0.0.1:8545)。原樣印出 rand_status。
register, unbond, withdraw
| 指令 | 參數 | 含義 |
|---|---|---|
register | --key、--payout <rand1…>、--rpc、--v2 | 輸出一個由本節點密鑰簽署的十六進制 Registration;會讀取 RPC 以取得鏈 id,若帶 --v2 則同時讀取創世哈希。在創世設有 staking.registration_v2 的鏈上(如 chain 20)必須使用 --v2;該處會拒絕 v1 註冊,其他鏈上則接受 v2 註冊 |
unbond <amount RAND> | --key、--rpc、--no-wait | 將質押轉入解除綁定;免費;兩個 epoch 後可提取 |
withdraw <amount RAND> | --key、--rpc、--no-wait | 將已釋放的質押及獎勵支付至支付地址上的一個 note,並扣除 0.001 RAND 的基本費用 |
admit sign|submit
投票准入(v0.6.8)。在創世設有 staking.admission_by_vote 的鏈上(如 chain 20),新的驗證者密鑰必須先獲持有嚴格多於三分之二投票權重的驗證者簽署准入,方可註冊。
| 指令 | 參數 | 含義 |
|---|---|---|
admit sign | --candidate <key hex, registration hex, or a file holding either>、--key <validator key>、--genesis-hash <hex> | 以單行輸出本驗證者的投票,格式為 <voter key hex>:<signature hex>,簽署內容涵蓋創世哈希及候選者地址,故只在唯一一條鏈上有效。離線運作:不讀取任何節點 |
admit submit | --candidate …、--signature <line>(可重複)、--rpc、--no-wait | 對照節點的創世哈希檢查每一張投票(若投票針對其他創世或候選者,或同一投票者重複投票,會指明出來),將投票排序,然後提交免手續費的 AdmitValidator |
候選者即註冊將帶有的密鑰;rand-node address --key 會輸出該密鑰,register 所輸出的十六進制內容亦包含該密鑰。准入提交後,綁定程序一如以往(rand bond … --registration),並會消耗該准入。rand_getAdmitted 列出已獲准入而仍在等候的項目。
bridge-gov
橋接的後量子輪換(v0.6.8),供守護者及暫停密鑰持有人使用。每一步都會從 --rpc(預設為 http://127.0.0.1:8545)讀取鏈 id、其綁定域及 rand_getBridgeState.rotation_nonce。
| 指令 | 作用 |
|---|---|
rotate-pq message --new-key K… | 輸出當前 nonce 對應的十六進制輪換訊息,以便在每位簽署者處核對 |
rotate-pq sign --new-key K… --key F --index I [--possession] | 輸出 I:signature:即當前後量子守護者的法定人數行(I 為其在當前集合中的索引),或在帶 --possession 時,輸出新密鑰持有人的行(I 為其在新集合中的索引);若密鑰檔案並非索引 I 處的密鑰,則予以拒絕 |
rotate-pq submit --new-key K… --quorum @F [--possession @F] [--no-wait] | 組裝 RotatePqGuardians(若附有持有證明行,則組裝 V2 操作)並發送;在不接受持有證明的鏈上會拒絕持有證明,在要求持有證明的鏈上(如 chain 20)則會拒絕缺少持有證明的情況 |
rotate-pause message|sign|submit --new-key K | 暫停密鑰的相應操作(持有證明索引為 0) |
cancel-rotation sign --kind pq|pause --key PAUSE_KEY | 輸出針對取消訊息的 0:signature,並對照鏈上當前的暫停密鑰核對 |
cancel-rotation submit --kind pq|pause --signature @F | 發送 CancelRotation,在延遲期結束前撤銷待處理的輪換 |
--new-key 是十六進制的 Dilithium2 公鑰、載有該公鑰的 @file,或 @key-file(取其公鑰)。簽名行格式為 index:hex,以空白或換行分隔,可加入 # 註解。
vesting status|claim|revoke|bond|unbond
在創世載有 vesting 部分的鏈上,持有人及撤銷方對鎖定期創世分配的操作。Chain 20 並無此部分。密鑰為 rand-node keygen 所產生的檔案。
| 指令 | 參數 | 含義 |
|---|---|---|
vesting status <ENTRY> | --rpc | 以 rand_getVesting 所提供的形式顯示該條目:其條款、已歸屬的數額、現時可領取的數額 |
vesting claim | --entry <id>、--to <rand1…>、--amount <RAND> 或 --all、--key、--rpc、--no-wait | 將已解鎖的數額支付至 --to 處的一個 note,並扣除 0.001 RAND 的基本費用;由受益人密鑰簽署 |
vesting revoke prepare | --entry、--margin-secs(預設 600)、--out(預設 revoke.json)、--rpc | v0.6.8,無需密鑰:寫出每位撤銷方均須簽署的撤銷交易,其內容為一個 note,載有在區塊頭之後 --margin-secs 仍未歸屬的部分,並支付至該條目創世中的 treasury(沒有 --to) |
vesting revoke sign | --proposal <file>、--key、--index? | 單一撤銷方密鑰,離線運作:輸出 <index>:<signature hex> |
vesting revoke submit | --proposal <file>、--signature <index:hex>(可重複)、--rpc、--no-wait | 附上不少於該條目 threshold 數目的簽名,在 prepare 後 256 個區塊內發送撤銷。v0.6.7 的單密鑰 vesting revoke --to 已移除 |
vesting bond <amount RAND> | --entry、--validator <address>、--registration <hex>、--key、--rpc、--no-wait | 不可撤銷的條目:將鎖定的 RAND 綁定為該驗證者的質押;尚未載入登記冊的驗證者,須提供 register 所輸出的內容 |
vesting unbond <amount RAND> | --entry、--key、--rpc、--no-wait | 將已綁定的 RAND 取回鎖定;經過解除綁定的 epoch 後可再次領取 |
aggregator register|unbond|withdraw、aggregate
適用於設有 aggregation 部分之鏈的聚合者角色指令:aggregator register --key --bond <RAND> --payout <rand1…> --rpc 會輸出一個已簽署的 AggregatorRegistration;aggregator unbond 與 aggregator withdraw 與驗證者的一對指令相對應。aggregate --key <KEY> [--rpc <URL>] [--watch] [--interval-secs 15] [--no-wait] 是輪詢 rand_getUnsealed、證明一個聚合並提交的常駐程式。在 chain 20 上不起作用,因其創世沒有 aggregation 部分。
rand(錢包)
全域選項,可置於子指令之前或之後:
| 選項 | 環境變數 | 預設值 |
|---|---|---|
--rpc <RPC> | RAND_RPC | http://127.0.0.1:8545;http 或 https(公共端點為 https://rpc.randprotocol.org)。超過 64 MiB 的回覆會被拒絕 |
--key <KEY> | RAND_KEY | wallet.key.json;note 儲存庫位於其旁,路徑為 <key>.notes.json。該儲存庫綁定於掃描時所對應的鏈(即節點的 rand_getGenesisHash):若指向另一條鏈,例如在由 chain 19 切換至 20 後仍沿用的錢包,儲存庫會被清空,並自 leaf 0 起重新掃描,同時發出警告。自 v0.6.8 起,每個指令都會拒絕群組或其他用戶可讀取的密鑰檔案,並指明修正方法(chmod 600 <key>) |
--prover | 關閉。改在與此錢包配對的證明者(rand prover pair)上證明該 bundle,而非在本機證明;該證明在納入交易前會在本機核驗(其摘要、大小及一次本地驗證)。適用於所有須證明 bundle 的指令;對於 call 及 program invoke,只有支付用的 bundle 交由證明者處理,呼叫證明仍在本機生成。若無配對則予以拒絕,與 --cuda 並用時亦予以拒絕,call 除外。在 chain 20 這類分離授權的鏈上,證明者會獲發檢視密鑰 nk 及一個 salt,絕不會獲發花費密鑰:它可讀取此錢包的全部歷史,但無法花費。授權證明一律在本機生成。在 bundle guest 為 v1 或 v2 的鏈上,v0.6.8 會在向證明者作出任何查詢之前拒絕 --prover | |
--max-prover-fee <RAND> | 1。已配對證明者每個 bundle 最多可收取的費用。高於此數的報價會在建立任何 bundle 之前被拒絕;0 表示拒絕任何費用。該費用是同一 bundle 中多出的一個 RAND 輸出,顯示為 prover fee: <amount> RAND to <fingerprint> |
數額為十進制 RAND,最多九位小數(1、1.5、.25、0.000000001)。send、token mint 及 token burn 上的代幣數額,以及 randpay: 連結中的代幣數額,均以代幣的顯示單位計,採用其登記冊列的 decimals(zUSD 的 10 即 10 zUSD)。bridge-burn、token create --fixed-supply 及 --initial 取代幣最小單位的純整數,asset-balance 亦以此印出。凡指令需要指定代幣,均可使用登記冊索引、rpl1… id 或 64 位十六進制 id;id 是根據節點完整的登記冊清單(rand_getTokens,每一頁)解析為索引,絕不會逐個代幣查詢,否則會讓節點得知哪個代幣即將轉移。數字索引則完全不會送達節點。
| 指令 | 參數 | 行為 |
|---|---|---|
keygen | 在 --key 指定的位置寫入新的支出密鑰檔案,權限為 0600;拒絕覆寫現有檔案 | |
address | --uri [--amount A] [--asset X] [--memo M], --qr, --qr-png <FILE> | 在 stdout 輸出此錢包的 rand1… 地址,內容僅為地址及一個換行符,因此 $(rand address) 可直接用於指令碼;並在 stderr 輸出其 fingerprint XXXX-XXXX-XXXX-XXXX:16 個 Crockford base32 字元,供人手核對地址之用,不會在網絡上傳送。--uri 亦會輸出 randpay: 連結(地址,另可附帶金額、資產及備註)。--qr 在終端機把該連結顯示為 QR code;--qr-png 則將其寫成 PNG |
contacts add <NAME> <TO> / list / show <NAME> [--qr] / remove <NAME> | --yes(add) | 此錢包可按名稱付款的具名地址。TO 為 rand1… 地址或 randpay: 連結,若為連結,只保留其中的地址。add 會輸出指紋並詢問 add? [y/N],除非指定 --yes;若 stdin 並非終端機,未指定 --yes 時會被拒絕。儲存於 <key>.contacts.json,權限為 0600。名稱長度為 1 至 64 個字元,不得以 rand1 或 randpay: 開頭,且不得重複 |
prover pair <LINK> / prover pair --trusted / show / forget | --name <NAME>, --yes(pair) | 將此錢包與一個委託證明者配對。pair 接受 rand-prover pair 輸出的 randprover: 連結,拒絕非 https:// 的 URL(僅 localhost、127.0.0.1 或 [::1] 可使用明文 http://),然後說明證明者將會收到的內容(this prover will receive this wallet's viewing key: it can read the wallet's whole history; it cannot spend),並詢問 pair? [y/N];--yes 會略過該提問,而 stdin 並非終端機時,未指定 --yes 會被拒絕。其後向證明者查詢 prover_info,若其密鑰指紋與連結所指名的不符即拒絕,否則寫入 <key>.prover.json,權限為 0600,並取代任何先前的配對。--trusted(v0.6.8)不需要連結:它會與驗證節點的證明者池 https://prover.randprotocol.org 配對,所用連結內建於該建構版本;其營運者可讀取此錢包的歷史記錄,但不能花費。show 輸出名稱、URL、指紋、own 及證明者的密鑰,絕不輸出令牌;forget 會刪除該檔案。v0.6.7 在配對前不會詢問 |
viewing-key | 輸出此錢包的查看密鑰 nk(64 位十六進位):即 rand_importViewingKey 所接受的參數。它能讀取此錢包所有已發送或已接收的票據,但無法花費任何票據 | |
balance | 掃描承諾樹,儲存本機資料庫,並輸出可花費的價值及未花費票據的數目 | |
sync | --rescan | 掃描但不輸出餘額。首次同步會先讀取每個區塊頭(每次呼叫 1,024 個),再讀取葉節點。--rescan 會清除所有票據、已花費標記及游標(保留鏈綁定),並從葉節點 0 重新掃描:當節點錯誤地回報此錢包的票據已被花費時,可用此法補救。最好對自己信任的節點執行 |
notes | --memo | 此錢包已開啟的每一張票據:索引、資產、金額、高度、spent、pending,以及截短至 24 個字元的備註;指定 --memo 則顯示完整備註 |
asset-balance [INDEX] | 先掃描,再輸出此錢包持有的某一資產數量,或按所持資產逐行列出;金額以該資產自身的最小單位計 | |
history | --memo | 此錢包為他人建立的每一張票據,備註欄與 notes 相同 |
send <TO> [AMOUNT] | --asset <INDEX|rand|rpl1…|hex>(預設為 0,即 RAND), --memo <M>, --fee <RAND>(預設 0.001), --no-wait, --yes, --cuda | TO 為 rand1… 地址、randpay: 連結或已儲存聯絡人的名稱,並按此順序嘗試解析。連結本身的金額、資產及備註,會補上命令列未提供的部分;僅當連結帶有金額時,AMOUNT 才可省略,而兩處均有給定但數值不一致時會被拒絕。該指令會輸出確認內容 to <contact, if any> · fingerprint XXXX-XXXX-XXXX-XXXX · <amount> <asset>,若有備註,另以獨立一行輸出 memo: "<text>",然後在生成證明前詢問確認,除非指定 --yes。指令碼必須傳入 --yes:stdin 並非終端機時,會以 stdin is not a terminal: pass --yes to send without confirmation 拒絕。之後它最多揀選該資產的兩張票據,以及最多兩張用於支付費用的 RAND 票據,僅將備註封裝於付款輸出之中,在本機生成一個四槽位隱藏資產捆綁包的證明,並在採用分離授權的鏈上同時生成花費授權的證明,然後提交並等待提交完成。若鏈的創世區塊沒有 envelope_bytes,非空備註會在生成證明前被拒絕。AMOUNT 以該資產的顯示單位計:RAND 為十進位 RAND,代幣則按其登記列自身的 decimals;只有 0 或 rand 會被解讀為 RAND,不論節點回應的索引為何。代幣 id 會在詢問節點前先行解碼,若列表中的某一列以索引 0 回應,或其 id 欄位互相矛盾,該列會被拒絕。確認內容會同時以顯示單位及基本單位列出代幣金額,例如 10.00000000 zUSD (1000000000 units),因此若節點謊報代幣的 decimals,在任何款項送出之前即可看出。資產索引及費用會在生成證明前輸出。在鏈上,代幣轉帳是一個普通捆綁包,與 RAND 付款無從區分;其費用以 RAND 支付,而沒有可花費 RAND 的錢包會在生成證明前被拒絕 |
bond <VALIDATOR> <AMOUNT> | --registration <hex>, --fee, --no-wait, --cuda | 向某驗證節點質押:該捆綁包會銷毀相應金額 |
faucet [ADDRESS] | --amount <RAND>(預設及上限均為 100) | 僅限 testnet:請求驗證節點鑄造。在鏈 20 上,faucet 只向其創世白名單上的 16 個錢包發放 |
program build | --guest <fib|memcpy|bubble_sort|balance_check|private_payment|public_echo|rpl2_counter>, --arg N(可重複), --out <file>(預設為 program.json) | 組譯內建的 guest 程式;輸出程式 id。rpl2_counter(v0.6.8)是 RPL-2 的示範程式 |
program deploy <FILE> | .json、原始 .bin,或 rand-guest build 寫出的映像容器;--public <FILE>, --input <u32>(可重複)或 --check-call, --cuda | 輸出程式 id、hc 及字數;若程式超出鏈的上限(經 rand_estimateFee),會在生成證明前拒絕;透過捆綁包支付部署最低費用,並等待。--public 會將公開輸入連同程式一併儲存(以空白分隔的 u32 字,或 ELF .so),且不得超出鏈的 max_program_public_words;程式 id 隨後會綁定該輸入。使用 --input 或 --check-call 時,錢包會先在模擬器中對這些私有輸入試運行一次呼叫,若超出呼叫層級上限(14)即拒絕;檢查過程不會生成任何證明 |
program show <ID> | 已部署程式的元數據 | |
program invoke <PROGRAM-ID> | --transition <FILE.json>(必填), --input N(可重複,私有), --inputs-file <FILE.json>(u32 的 JSON 陣列,附加於後), --fee <RAND>, --gas-limit <N|max>, --tier T, --no-wait | v0.6.8,RPL-2:宣告程式的一次狀態轉換,並由鏈套用。在生成任何證明之前,它會檢查:鏈是否具有 program_state 區段、程式是否存在、轉換的上下文是否符合分段規則、每個 reads 項目是否與現行儲存格相符(rand_getProgramCell;不符時會指出過期的儲存格並以 3 退出)、保險庫是否足以支付每個 pays 項目加上本次轉換所存入的款項,以及此錢包是否持有存款及費用所需的代幣和 RAND。它會計算寫入所建立的儲存格數目,以真實的上下文字詞對程式試運行,生成綁定於該交易的呼叫證明,然後生成捆綁包證明(費用,加上經 burn_r 銷毀的 deposit.rand,以及經 burn_a 銷毀的 deposit.asset 之 deposit.amount)及授權證明。預設費用為所宣告 gas 的呼叫最低費用,加上每個新建儲存格的儲存格費用,並與 call 一樣預留兩級價格的餘裕。輸出每筆支付,並在未指定 --no-wait 時輸出收據中的八個 outputs。納入區塊時發現讀取已過期,同樣以 3 退出,以便呼叫方工具重新讀取並重試。不會公開任何輸入記錄。轉換檔案的所有欄位均為選填:{"reads": [{"key", "value"}], "writes": [...], "deposit": {"rand": "<units>", "asset": N, "amount": "<units>", "kind": "none"|"deposit"|"burn"}, "pays": [{"asset": N, "amount": "<units>", "to": "rand1…"}], "mints": [...]};鍵與值均為 64 位十六進位的 Word8,金額為以資產自身單位表示的十進位字串,to 預設為此錢包 |
program state <ID> | --cell <64 hex> | v0.6.8:按鍵順序列出程式的每個儲存格(rand_getProgramCells,分頁讀取至末尾),或以 --cell 查看單一儲存格,不存在時為 64 個零。在沒有 program_state 區段的鏈上會被拒絕 |
program vault <ID> | v0.6.8:程式的保險庫(rand_getProgramVault),其持有的每項資產各佔一行,金額以單位計。在沒有該區段的鏈上會被拒絕 | |
call <PROGRAM-ID> | --input N(可重複), --expect-public <FILE>, --tier T, --gas-limit <N|max>, --fee, --auditor <rand1…>, --no-envelope, --print-call-key, --cuda | 先在模擬器中運行該呼叫,並輸出 gas: <exact> (declaring <limit>, tier <t>):精確的 gas 屬於見證數據,絕不會離開錢包,所宣告的上限則是證明的公開 GAS_LIMIT。在具有 gas 區段的鏈上,預設上限為精確 gas 向上取整至 2^(t−2) 的倍數;max 宣告區塊頭的上界 gas_max,這不會洩露層級以外的任何資訊;N 若低於精確 gas 或高於上界即被拒絕。沒有該區段,或使用 --cuda 時,預設為 max。然後在本機針對程式的公開輸入生成呼叫證明,封裝其輸入記錄,透過捆綁包付款,並輸出收據。預設費用為所宣告上限的最低費用,即 BUNDLE_BASE + gas_price·GAS_LIMIT + byte_price·KiB,價格取自 rand_getLimits 所提供的數值,並在價格會浮動之處再加兩級價格的餘裕,輸出為 fee … RAND (incl. two price steps of headroom)。在 hardening_v6 鏈上,費用在證明產生之前已經確定,因此預設以鏈的證明大小上限代替實際證明來計價,只可能多付而不會少付;--fee 則支付精確金額。--expect-public 會在生成證明前拒絕,除非程式的公開輸入正是該檔案中的字詞 |
open-call <TXHASH> | --call-key <hex>, --as-auditor | 開啟某次呼叫的記錄,對照 H_IN 檢查,並重新運行程式;不符時以非零狀態退出 |
receipt <TX> | 已提交呼叫的收據 | |
bridge-mint <ATTESTATION> | 十六進位或 @path, --pq <JSON or @path>(必填), --to <rand1…>(預設:此錢包), --fee(預設:該操作的最低費用), --no-wait, --cuda | 將守護者簽署的證明存入為一張票據。--pq 為守護者的 Dilithium2 聯合簽名法定人數,[{"index":0,"signature":"<4840 hex>"},…]。在生成任何證明之前:解碼該證明,對照節點的 pq_guardians 及鏈 id 檢查法定人數,檢查收款人及資產 id,並讀取所列索引(rand_getAssets)。存款票據的盲化因子由證明的摘要導出,r = blake3("rand-deposit-r-1" || mu),這是鏈所接受的唯一 r。費用捆綁包針對整筆交易(包括法定人數)生成證明。輸出該票據的 owner、time 及 r |
bridge-rotate <ROTATION> | 十六進位或 @path, --pq <JSON or @path>(必填), --fee(預設:該操作的最低費用), --no-wait, --cuda | 以現行 PQ 守護者集合的聯合簽名法定人數提交守護者集合輪換,形式為不存入任何款項的 BridgeAttest。在生成證明前,凡非將 Rand 的集合推進一步的輪換一律拒絕。事後輸出 guardian_set_index |
bridge-pause | --sig <HEX or @path>(必填), --no-wait | 暫停橋接鑄造:一個沒有捆綁包、不收費的 PauseMints,因此既不需要密鑰檔案,也不需要 RAND。該檔案為 rand-bridge-gov pause 的輸出,即暫停密鑰針對橋接當前 pause_nonce 所作的 2,420 位元組簽名(十六進位);在發送前會對照節點的 pause_key 及鏈 id 檢查。暫停期間,銷毀及輪換仍保持開放 |
bridge-unpause | --pq <JSON or @path>(必填), --no-wait | 以針對當前 pause_nonce 所作的 PQ 守護者法定人數(rand-bridge-gov pq-unpause 的檔案)解除暫停。沒有捆綁包,不收費;單憑暫停密鑰絕對無法解除暫停 |
bridge-burn <ASSET> <AMOUNT> <TO_CHAIN> <TOKEN> <TO> | --relayer-fee N, --fee(預設 0.01), --no-wait, --cuda, --yes | 向外銷毀橋接資產:檢查 TO_CHAIN 上的幣 TOKEN 是否支持 ASSET,且鎖定量至少為 AMOUNT,並檢查 AMOUNT 及中繼費用均為整數的釋放單位;然後生成一個捆綁包的證明,該捆綁包在槽位 0–1 花費該資產,精確銷毀 AMOUNT 的該資產(burn_a、burn_asset),並從槽位 2–3 支付 RAND 費用。--relayer-fee 是 AMOUNT 的一部分,並非額外收費。在設有橋接費用的鏈上(rand_getBridgeState.fees,鏈 20 即屬此類),v0.6.8 會先輸出鏈所保留的費用(以該資產計)及將會釋放的金額,並要求確認;--yes 會略過該提問,而 stdin 並非終端機時,未指定 --yes 會被拒絕。鎖定量及中繼費用的檢查隨後以釋放金額為準 |
token create | --name, --symbol, --decimals <0..=9>, --salt <hex32>(未指定則隨機), 然後是 --fixed-supply <N> --to <rand1…>、--authority-key-out <FILE> [--initial <N> --to <rand1…>],或(v0.6.8)--program <PROGRAM-ID>:鑄造權限屬於該程式的代幣,只有該程式的 invoke 才能鑄造或銷毀,初始供應量為零,且需要鏈具有 program_state 區段, --fee(預設:捆綁包基本費用加上登記處的 registration_fee;若節點回報的登記費用高於 10 RAND 則會拒絕,因此如要有意支付較高費用,請傳入 --fee), --no-wait, --cuda | 在登記處的下一個索引登記代幣:固定供應(只鑄造一次,權限為 none)或由 Key 授權(新的 Dilithium2 密鑰檔案,以 0600 寫入,拒絕覆寫)。在鏈接受該登記之前,權限密鑰會暫存於 <FILE>.pending。若另一項登記搶先佔用該索引,會輸出 another token took index N first — re-run to register at N+1;成功時輸出索引及 id,包括十六進位及 rpl1… 形式 |
token mint | --asset, --to <rand1…>, --amount <N>(代幣的顯示單位), --authority-key <FILE>, --fee(預設 0.001), --no-wait, --cuda | 增發由 Key 授權的代幣;若該代幣並非由 Key 授權,或該密鑰並非其權限密鑰,會在生成任何證明前拒絕 |
token set-authority | --asset, --authority-key <FILE>, 然後是 --new-key <FILE> 或 --renounce, --fee(預設 0.001), --no-wait, --cuda | 將由 Key 授權的代幣移交給另一把密鑰,或永久放棄鑄造權 |
token burn <ASSET> <AMOUNT> | --fee(預設 0.001), --no-wait, --cuda | 銷毀此錢包所持有的某 RPL 代幣之 AMOUNT(以代幣的顯示單位計);其公開供應量會恰好減少相同數量。橋接代幣會在生成證明前被拒絕:它須經 bridge-burn 離開 |
token info <INDEX|rpl1…|hex> | 單一代幣在 rand_getTokens 中的完整一列:名稱、符號、decimals、權限、mint_nonce、總供應量、registered_at、id(十六進位及 id_text),以及(若為橋接代幣)每項支持(locked、mint_cap_per_day、minted_today、mint_day) | |
token list | --from <index>(預設 0), --limit <N>(預設 1000) | rand_getTokens 的一頁:enabled、registration_fee、next_index、tokens |
token register-bridged | --name, --symbol, --salt <hex32>, --chain, --token <hex32>, --decimals(第一項支持的來源 decimals), --pq <JSON or @path>(必填), --fee(預設:捆綁包基本費用加上節點的 registration_fee,並與 token create 一樣設有 10 RAND 的拒絕上限), --no-wait, --cuda | 在創世之後登記橋接代幣及其第一項支持,由針對節點 list_nonce 所作的 PQ 守護者法定人數(rand-bridge-gov pq-register 的檔案)授權。先在 Rand 上列出,後在端點上 setToken |
token list-backing | --asset <index>, --chain, --token <hex32>, --decimals, --pq <JSON or @path>(必填), --fee(預設:捆綁包基本費用), --no-wait, --cuda | 為橋接代幣新增一項支持,由針對節點 list_nonce 的 PQ 守護者法定人數(rand-bridge-gov pq-list 的檔案)授權 |
bridge | 橋接的公開狀態:守護者、發射者、資產登記處、銷毀序號 | |
bridge-message <SEQUENCE> | 一則外送的銷毀訊息,原文照錄 | |
fee bundle / fee deploy <words> / fee call <tier> | --public-words M(deploy);--gas N, --bytes B, --keccak-log-height K, --sha256-log-height S(call) | 依節點的收費表所定的最低費用。在具有 gas 區段的鏈上,fee call <tier> --gas N 會按最新區塊的價格、且不預留餘裕,為 rand call 所輸出的宣告上限計價:即最低費用本身。若不帶 --gas,則為上界 gas_max(tier, K, S) 計價,即此類呼叫最多可能花費的金額。--bytes 為呼叫的證明加上輸入封裝的位元組數 |
tx <HASH> | 已提交的交易,連同其高度及索引 | |
tx-key <HASH> | 該交易中此錢包所發送、接收或作為找零保留的每個輸出各佔一行:output(bundle:0 … bundle:3,即該捆綁包的四個槽位,或 mint:0)、角色、金額(RAND,或代幣的 N (asset I))、其所載備註(無則為 -)以及封裝時所用的每交易密鑰。將 sent 行的密鑰交給收款人或審計方,rand_checkTransaction <HASH> <KEY> 即可披露該單一輸出(包括備註)。虛設槽位不屬於任何人,亦沒有對應的行 | |
block <ID> | 按高度或雜湊查詢區塊 | |
head | { height, hash, view } | |
status | rand_status | |
peers | 已連線的對等節點 | |
validators | 驗證節點登記冊 |
--cuda 須以 --features cuda 構建,且沒有後備方案;目前尚未構建任何 PTX。它無法封裝調用輸入信封(call-input envelope):rand call --cuda 須加 --no-envelope。它只聲明 gas 上限,並拒絕 --gas-limit N。
CLI 輸出的每個備註和聯絡人名稱(send 的確認訊息、notes、history、tx-key)都會先經過同一條顯示規則:控制字元、Unicode 格式字元(雙向控制字元、零寬字元、軟連字號)以及 U+2028/U+2029 一律顯示為 U+FFFD,連續的空格分隔符則顯示為單一空格。
第一筆屏蔽轉賬
rand keygen # wallet.key.json
rand address # rand1… on stdout, its fingerprint XXXX-XXXX-XXXX-XXXX on stderr
rand faucet # testnet, allowlisted wallets only: 100 RAND into a note only you can open
rand balance # balance: 100 RAND
rand send rand1q9f… 1.5 # asks to confirm, then a minute and a half to two minutes of local proving, then the commit
rand notes # the spent note, and the change note
分享地址與備註
rand address --uri --amount 1.5 --memo "invoice #42" --qr # a randpay: link, as a terminal QR
rand contacts add alice rand1q9f… # shows the fingerprint, asks add? [y/N]
rand send alice 1.5 --memo "coffee" # the memo is sealed into the payment output
rand history --memo # alice's row shows the whole memo
rand tx-key <hash> # hand the sent row's key to alice or an auditor
備註與票據位於同一個密封主體之內,因此能打開其中一個的人也能打開另一個:收款人透過 notes,而持有該輸出的每筆交易密鑰者,則透過 rand_checkTransaction <hash> <key>。chain 18 是首條在創世區塊中設定 envelope_bytes 的鏈;在 chain 14 至 17 上,--memo 會在任何證明生成之前即被拒絕。
日後可再次打開的保密調用
rand program build --guest balance_check --arg 1000 --out bc.json
rand program deploy bc.json # prints the program id
rand call <id> --input 100 --input 200 --input 300 --input 400
rand open-call <txhash> # inputs: [100, 200, 300, 400] — verdict: faithful (exit 0)
有狀態程式:RPL-2 計數器
適用於設有 program_state 區段的鏈,例如 chain 20。計數器只接受這樣的狀態轉換:讀取一個單元,並寫回其第一個字加一的值;轉換中的其餘部分(資料包存入的款項、金庫支付的款項、程式鑄造的數額)均不經檢查,因此它僅供示範,不宜用作承載價值的程式。
rand program build --guest rpl2_counter --out counter.json
rand program deploy counter.json # prints the program id
rand token create --name "Counter Share" --symbol CTR --decimals 0 --program <id> # say index 2
rand program state <id> --cell 0100000000000000000000000000000000000000000000000000000000000000 # 64 zeros: absent
cat > step.json <<'JSON'
{ "reads": [{ "key": "0100…00", "value": "0000…00" }],
"writes": [{ "key": "0100…00", "value": "0100…00" }],
"deposit": { "rand": "500000000", "kind": "none" },
"pays": [{ "asset": 0, "amount": "200000000", "to": "rand1…" }],
"mints": [{ "asset": 2, "amount": "1" }] }
JSON
rand program invoke <id> --transition step.json # exit 3 if the cell moved since; re-read and retry
rand program vault <id> # asset 0: 300000000 units (0.5 RAND in, 0.2 out)
檔案中的 … 代表完整的 64 個十六進制字元,錢包要求必須提供完整內容。
部署與調用會輸出甚麼
在分離授權的鏈上,每個資料包都包含在本機生成的兩個證明:tier-10 花費授權與 tier-14 資料包。以下是 2026-09-30 在 chain 18 上以 rand v0.6.7 執行 program deploy 的輸出:
proving the spend authorisation on this machine (tier 10; seconds)…
authorisation proved in 6.8s: tier 10, 1368908 bytes
proving the bundle (tier 14; about a minute and a half on a laptop)…
proved in 116.7s: tier 14, 1500710 bytes
submitted deploy <hash>
0 RAND out, 59.8545 RAND change, fee 0.1007 RAND, anchored at height 97831, proved in 116.7s (bundle) + 6.8s (auth)
call 會在生成調用證明之前先輸出其 gas 和費用,然後以同樣方式為支付資料包生成證明:
proving the call locally (90 inputs stay private, over the program's 11-word public input)…
gas: 5636 (declaring 6144, tier 12)
fee 0.006191437 RAND (incl. two price steps of headroom)
proved in 29.2s: tier 12, 3346865 bytes, outputs [...]
其中 6,144 是 5,636 向上取整至 2^10 的倍數,而 rand fee call 12 --gas 6144 --bytes <B> 會按鏈尖的價格為該上限定價,不留餘量。
rand-prover
委託證明者(delegated prover)是獨立的二進制程式:它在另一部機器上為錢包生成 tier-14 資料包證明。rand-node run --prover 則在節點內部提供同一項服務。每個子命令均接受 --home <DIR>(環境變數 RAND_PROVER_HOME,預設為 ~/.rand-prover),即存放 prover.key.json 與 pairings.json 的目錄。
| 指令 | 參數 | 行為 |
|---|---|---|
keygen | 寫入 prover.key.json(權限 0600),並輸出該密鑰的指紋;拒絕覆寫 | |
pair | --name <LABEL>(必填)、--url <URL>(預設 http://127.0.0.1:8600)、--own、--qr | 生成令牌,只將其雜湊值連同標籤儲存,並輸出 rand prover pair 所接受的 randprover: 配對連結。令牌只會在連結內顯示一次。--url 是錢包連接此證明者的位址;--own 會加上 own=1;--qr 同時將連結以終端機二維碼輸出 |
unpair | --name <LABEL> | 移除一個配對;運行中的證明者在啟動時讀取該檔案,因此須重新啟動才會生效 |
pairings | 每個配對一行:標籤、own 或 -、建立日期 | |
run | --listen <ADDR>(預設 127.0.0.1:8600)、--max-parallel <N>(1)、--max-queue <N>(8)、--per-token <N>(2)、--cuda、--skip-memory-check、--allow-origin <ORIGIN>(可重複)、--fee <RAND> 連同 --fee-address <rand1…>、--accept-spend-key | 提供 prover_* JSON-RPC 服務,直至收到 Ctrl-C 或 SIGTERM。除非可用記憶體達 5.74 GB × --max-parallel + 1 GiB,否則拒絕啟動。--per-token 是同一配對可同時排隊或正在證明的任務數目。--accept-spend-key 已於 v0.6.8 停用:run 帶此選項會拒絕啟動,證明者只接受查看密鑰(viewing-key)見證。在 v0.6.7 上,它會接納花費密鑰(spend-key)見證,而只有採用資料包 guest v1 或 v2 的鏈才會發送此類見證 |
chain 20 上的證明者會收到錢包的查看密鑰 nk 和一個新的鹽值。它無法花費資金,但可以讀取該錢包曾經收到或發出的一切:請只與你願意讓其查看歷史記錄的證明者配對。錢包會檢驗收回的每一個證明。
密鑰檔案格式
節點密鑰:
{ "seed": "hex of 32 bytes", "address": "base58 of blake3(\"rand-address\" || public key)", "public_key": "hex of 1312-byte Dilithium2 public key" }
錢包密鑰,版本 2:
{ "version": 2, "spend_key": "hex of 8 little-endian u32 words (64 characters)" }
rand keygen 以權限 0600 寫入該檔案;自 v0.6.8 起,只要錢包密鑰檔案可被群組或其他用戶讀取,每個 rand 命令都會拒絕使用:手動複製或還原的密鑰必須將權限重設為 0600(chmod 600 <key>)。遺失錢包密鑰,即失去它所能打開的每一張票據;此版本沒有助記詞可供復原。