使用本頁可正確解讀 rand_getSupply,並理解發行機制:RAND 從何而來、流向何處,以及令屏蔽鏈的供應量即使無人能加總其票據仍然精確的恆等式。
RAND 的來源與去向
屏蔽鏈無法加總自身的資金:票據的價值藏於其承諾之內。公開的是資金池邊界上的每一次跨越。共有五類;設有程式金庫(RPL-2,自 chain 20 起)的鏈上為七類;而在 chain 21(fullnode v0.8.0,自 2026-10-12 起上線)上,多重簽名帳戶與永續合約引擎各自增添了自己的跨越類別:
| 方向 | 跨越 | 時間 |
|---|---|---|
| 流入 | 創世存款票據(創世檔案中的 alloc,自 chain 14 起附有開啟資料) | 區塊 0 |
| 流入 | 水龍頭鑄造(Mint,上限 100 RAND,由驗證節點簽署,自 chain 14 起附帶票據的開啟資料) | 設有 "faucet": true 的 testnet 鏈;自 chain 20 起僅限 16 個列入許可名單的錢包,由 18 個創世名單所列鑄造者之一簽署,每個 1,000 區塊的時期至多 10,000 RAND |
| 流入 | 驗證節點的 Withdraw,將已釋放的質押及獎勵支付入一張票據 | 任何時間 |
| 流出 | 交易束的 fee:至 chain 20 為止全數計入區塊提議者的 rewards;在 chain 21 上,底價部分被銷毀(burned,計入 base_fees_burned),僅小費歸提議者 | 每個交易束 |
| 流出 | 交易束的 burn_r:由 Bond 將質押銷入驗證節點的公開 stake | 每次質押綁定 |
| 流出 | Invoke 的 burn_r:存入程式公開金庫的 RAND | 自 chain 20(v0.6.8)起 |
| 流入 | 金庫支付:Invoke 從程式金庫以票據形式支付出的 RAND,其數額與收款方為公開 | 自 chain 20(v0.6.8)起 |
| 流出 | CreateMultisig 或 MultisigDeposit 的 burn_r:支付入多重簽名帳戶公開餘額的 RAND(multisig_rand_in) | chain 21,自 v0.8.0 起 |
| 流入 | MultisigPay 的票據:帳戶支付出的 RAND,其數額與收款方為公開(multisig_rand_out) | chain 21,自 v0.8.0 起 |
| 流出/流入 | PerpDeposit 銷入交易帳戶的數額,以及由鏈計算的永續合約支付票據(perps_rand_out、perps_rand_held);在 chain 21 上,唯一市場的抵押品為 zUSD,故這些計數器在該鏈上讀數為 0 | chain 21,自 v0.8.0 起 |
在創世設定了 tokens.burn_registration_fee 的鏈上(chain 21 即如此,自 chain 15 起每條鏈亦然),代幣註冊的 1 RAND registration_fee 同樣經由 burned 離開資金池,但不進入任何登記項目:它被銷毀,提議者只保留交易束的基礎費。在 chain 21 上,創世的 fees 部分(burn_base 與 burn_floor)對每個交易束已結算的底價作同樣處理——轉帳的 0.001 RAND 基礎費、部署的按字計費項、呼叫的 gas 與位元組計費項、橋接銷毀的 0.01 RAND——因此提議者僅保留小費,即 fee − floor,而 fees_paid 亦只按此數變動(費用)。
資金池旁設有驗證節點登記冊,其中的數額以明文記錄,因為共識權重必須公開。登記冊中的質押是實在的 RAND:可以解除綁定,並提回成為票據。自 chain 20 起,程式金庫是其旁的第二個公開餘額:Invoke 存入的 RAND 在金庫中保持可計算,直至一次支付將其以票據形式送回資金池。Chain 21 增添第三個,即多重簽名帳戶(交易):按資產分列的餘額,由達到門檻數目的 Dilithium2 密鑰共同支用,於創世時注入基金會金庫,並開放予任何人以 1 RAND 費用呼叫 CreateMultisig 建立。
chain 21 上沒有區塊獎勵,也沒有通脹。本鏈首個預定的發行是區塊聚合補貼——每個已封存區塊發行遞減數量的新 RAND,支付予其證明涵蓋該區塊的聚合者——而它在 chain 21 上並未啟用(證明);v0.8.0 亦附帶其以美元計價的形式(fees.usd_subsidy,按驗證節點集合以 SetRandPrice 投票決定的 RAND/USD 價格定價),chain 21 並未開啟此項。Chain 21 是一條全新的鏈,於 2026-10-12 上線(創世於 10:22 UTC 切出,26 個驗證節點於 10:31 UTC 切換),由 chain 20 硬分叉而來(fullnode v0.8.0)。其創世發行 129,938.879078887 RAND:26,000 質押於 26 個創世驗證節點;3,938.879078887 存於七張存款票據,即七個營運錢包自 chain 20 結轉的餘額(掃描 chain 20 資金池於高度 822,056 至 822,229 所得);以及 100,000 RAND 新發行,存於基金會金庫,即一個 3 取 2 簽署者的多重簽名帳戶(id d5fd1883…1958,rand_getSupply.multisig_issued)。其他錢包在 chain 20 上持有的約 36,025 RAND(其中 35,040 RAND 為向許可名單收款方的水龍頭鑄造,即支付予用戶的款項)未有結轉,因為票據無法在缺少其擁有者地址的情況下重新建立;2.606 RAND 未提取的驗證節點獎勵亦未結轉。另有三張創世票據承載橋接的 100.001999 zUSD(10、89.002999 與 0.999),與其四個擔保上鎖定的託管額相等,這並非 RAND,不在本審計範圍之內。Chain 21 上的 rand_getSupply 讀數為 genesis_deposited 3,938,879,078,887 單位、genesis_staked 26,000,000,000,000、multisig_issued 100,000,000,000,000,以及 invariant_holds: true(高度 2,178,2026-10-12)。Chain 20 於 2026-10-01 由 chain 19 在高度 7,258 的狀態切出,已發行 31,184.243719258 RAND:同樣是 26,000 質押,另有 5,184.243719258 存於七張票據,旁邊是兩張各 99 zUSD 的票據。Chain 15 於 2026-09-26 切出,創世發行 23,000 RAND,其中 18,000 質押於 18 個驗證節點,5,000 存於五張票據;其後的八個驗證節點由現有票據綁定質押,並未發行任何新幣。此後每次水龍頭鑄造都會增加已發行數額,每筆被銷毀的費用都會令其減少。
代幣不在本審計範圍內
上述跨越屬於 RAND。RPL 代幣,無論是橋接的還是原生的,都不會跨越 RAND 的邊界:資產索引 0 保留予 RAND,代幣登記冊從不分配它,因此 BridgeAttest、TokenMint 或註冊時的初始鑄造存入的永遠是其他資產的票據,而 BridgeBurn 或 TokenBurn 的 burn_a 銷毀的也永遠是其他資產的票據(經 burn_a 銷毀 RAND 會被拒絕)。fees_paid 與 burned 僅依據交易束的 fee 與 burn_r 計算,而資金池內的代幣轉帳完全不會令任何計數器變動,因為其資產甚至不是公開的。自 chain 20 起,Invoke 也可經 burn_a 轉入代幣:轉入程式的金庫(deposit),其供應量不變;或將其銷毀(burn),僅限程式自身的代幣。橋接的費用票據(自 chain 20 起,每筆 zUSD 存入與銷毀收取 10 bps,歸入國庫地址)是 zUSD,絕非 RAND:它們已發行且有擔保,因此一筆存款的擔保與供應量按總額變動,而一次銷毀則按 amount − fee 減少。代幣自身的供應量是登記冊的公開計數:rand_getTokenSupply 返回 total_supply,而對於橋接代幣,還返回各擔保的 locked 數額,兩者之和即為供應量(RPL 代幣)。在 chain 21 上,永續合約引擎的抵押品同為 zUSD,因此交易帳戶的存入與支付屬於代幣跨越,不在本審計範圍內(perps_rand_* 計數器是為以 RAND 為抵押品的市場而設,在此讀數為 0)。
審計恆等式
六個單調遞增的計數器,以單位計(1 RAND = 10⁹),其中三個記錄被銷毀的數額,兩個屬於程式金庫(自 chain 20 起),而在 chain 21 上另有五個屬於多重簽名帳戶、兩個屬於永續合約引擎:
| 計數器 | 加總對象 |
|---|---|
genesis_deposited | 創世檔案中 alloc 存入的票據 |
genesis_staked | 創世時寫入登記冊的質押 |
faucet_minted | 每一筆被接受的 Mint |
withdraw_deposited | 被接受的 Withdraw 所建立的票據(每筆為 amount − 0.001 RAND) |
fees_paid | 每個交易束的手續費 |
burned | 每個交易束的 burn_r(Bond 的質押;自 chain 20 起包括 invoke 存入金庫的款項,於 chain 21 另包括多重簽署賬戶的建立或存入)、每筆被銷毀的註冊費,以及於 chain 21 每筆被銷毀的費用下限 |
slashed | 被罰沒的聚合者保證金(區塊聚合;停用時為 0) |
registration_fees_burned | 依 tokens.burn_registration_fee 銷毀的註冊費,亦已計入 burned |
base_fees_burned | 依創世 fees 區段銷毀的交易束費用下限(chain 21:burn_base 搭配 burn_floor),亦已計入 burned;於此前每條鏈上均為 "0" |
program_rand_out | 程式金庫已支付的 RAND 票據(RPL-2;沒有 program_state 區段時為 0) |
program_rand_held | 金庫仍持有的 RAND:每次 invoke 的 burn_r 減去 program_rand_out。這筆款項是經 burned 進入的,因此它是該計數器在金庫一側的對應項 |
multisig_issued | 多重簽署賬戶的創世餘額(chain 21:100,000 RAND 的國庫)——屬發行量,與 genesis_staked 並列 |
multisig_rand_in | CreateMultisig 或 MultisigDeposit 存入的每筆 burn_r;已計入 burned,由資金池流向登記冊 |
multisig_rand_out | MultisigPay 所建立的每張 RAND 票據:價值進入資金池,與 withdraw_deposited 並列 |
multisig_base_out | 支付時由賬戶付予提案者 rewards 的 0.001 RAND 基礎費用:由登記冊到登記冊,並非跨界 |
multisig_rand_held | issued + rand_in − rand_out − base_out:賬戶所持有的數額,即 total_supply 在登記冊一側的部分 |
perps_rand_out、perps_rand_held | 永續合約引擎交易賬戶的同一組計數器,適用於以 RAND 作抵押的市場;於 chain 21 為 0,因其市場以 zUSD 計價 |
pool_value = genesis_deposited + faucet_minted + withdraw_deposited
+ program_rand_out + multisig_rand_out + perps_rand_out − fees_paid − burned
register_total = Σ over the register of (stake + pending + rewards)
total_supply = pool_value + register_total + program_rand_held + multisig_rand_held + perps_rand_held
issued = genesis_deposited + genesis_staked + faucet_minted + multisig_issued
invariant: total_supply == issued − slashed − registration_fees_burned − base_fees_burned
pool_value 是進入的數額減去離開的數額——與票據總和是同一個數字,而這個總和無人能夠計算。提款的 0.001 RAND 基礎費用並非跨界:它由登記冊的一行移至提案者的一行,真正跨界的只有票據。invariant_holds 為 false,代表共識出現缺陷或資料庫已損毀,絕不是合法狀態。在沒有 program_state、multisig 或 perps 區段的鏈上,程式、多重簽署與永續合約各項為零;沒有 fees 區段時 base_fees_burned 亦然,因此恆等式在該處與 chain 19 相同;chain 20 上只有程式各項生效,而 chain 21 上全部生效。創世 vesting 區段(至今沒有任何一條鏈採用)會以同樣方式再增加一個公開登記冊(JSON-RPC)。
以下追蹤在一條存入 2,000 並質押 4,000 的鏈上,一次 1,000 RAND 的質押與一次 1,000 RAND 的提款:
| 之後 | burned | withdraw_deposited | fees_paid | pool_value | register_total | total_supply |
|---|---|---|---|---|---|---|
| 創世 | 0 | 0 | 0 | 2,000 | 4,000 | 6,000 |
| 質押 1,000(手續費 0.001) | 1,000 | 0 | 0.001 | 999.999 | 5,000.001 | 6,000 |
| 其解除質押 | 1,000 | 0 | 0.001 | 999.999 | 5,000.001 | 6,000 |
| 其提款 1,000 | 1,000 | 999.999 | 0.001 | 1,999.998 | 4,000.002 | 6,000 |
解讀
curl -s http://127.0.0.1:8545 -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"rand_getSupply","params":[]}'
{ "height": 1998,
"genesis_deposited": "2000000000000", "genesis_staked": "4000000000000",
"faucet_minted": "0", "withdraw_deposited": "999999000000",
"fees_paid": "1000000", "burned": "1000000000000",
"slashed": "0", "registration_fees_burned": "0", "base_fees_burned": "0",
"pool_value": "1999998000000", "register_total": "4000002000000",
"total_supply": "6000000000000", "invariant_holds": true }
每個數額都是以單位計的十進位字串,因為 JSON 數字超過 2⁵³ 後便不再是精確的整數。完整物件所含欄位比此處所示更多,其中包括水龍頭的每紀元一對欄位 faucet_epoch 與 faucet_minted_in_epoch(chain 21 會對照其預算進行檢查)、program_rand_out 與 program_rand_held(自 v0.6.8 起)、base_fees_burned、五個 multisig_* 與兩個 perps_* 計數器(自 v0.8.0 起),以及四個 vesting_* 計數器,它們在 chain 21 上顯示為 "0",因為其創世沒有 vesting 區段(JSON-RPC)。瀏覽器在 GET /supply 提供同一物件,並在 GET /stats 提供主要數字。
精確到什麼程度
對於鏈自身所做的一切,計數器都是精確的:每個計數器均在套用該動作的程式路徑中,根據動作本身的公開欄位遞增。
有兩項曾經只憑聲明成立,chain 14 把兩者都變成了檢查(審計 v3,POOL-1):
- 水龍頭的
Mint附帶票據的開啟資料。 除cm與amount外,該動作還公開pk、time與r。准入時會重新計算(pk, no sender, amount, asset 0, time, r)的承諾,若不相符便以the mint's commitment does not open to its published note and amount拒絕,並把time限制在交易束的時間窗口內。鑄造者以域rand-mint-2對全部七個欄位簽署。在此之前,驗證者可以公佈一個數額,卻封入價值另一個數額的票據。代價是水龍頭票據的擁有者pk會公開,一如提款的支付對象;rand_mint的參數不變。 - 創世
alloc票據同樣附帶其開啟資料。 在有tokens區段的鏈上,每一行均為{ cm, envelope, amount, opening: { pk, time, r } },節點會重新計算承諾——除非開啟資料指明所列代幣的asset,否則按 asset 0 計算——並拒絕cm不相符的創世檔案。只有 asset-0 的行才計入genesis_deposited。不透明的cm曾是創世作者唯一能把無抵押票據(任何資產皆然)放入資金池而無人能夠核實的途徑。因此,創世票據一經檔案公佈,其擁有者與數額即設計上公開;只有它日後於何時、花費到何處仍然保持私密。rand-node genesis一律寫入開啟資料。
在沒有 tokens 區段而設立的鏈上,舊規則依然適用:genesis_deposited 是所聲明 amount 欄位之和,信任創世檔案。兩種創世數額都包含在創世雜湊之內,因此無論哪種情況,每個節點對它們的認定都一致。
計數器刻意不屬於共識狀態——狀態根不對它們作雜湊——而 rand-node verify --mode quick 會透過重播區塊鏈重新計算每一個計數器,若儲存的快照與之不符便報告不一致。