Rand 是開源項目。全節點、區塊瀏覽器、跨鏈橋、證明研究及錢包客戶端,均各自存放於 GitHub 上獨立的代碼庫。歡迎閱讀代碼、運行測試、提交補丁。本頁是一幅地圖:各組件位於何處、以甚麼構建、證明系統已發展至何種程度,以及它目前的局限所在。
代碼庫
| 代碼庫 | 內容 | 語言 |
|---|---|---|
randprotocol/fullnode | 參考全節點與錢包:鏈式 HotStuff BFT、libp2p 網絡、屏蔽式 RAND note 池、zkVM 證明驗證器、JSON-RPC、rand 錢包命令行工具,以及 rand-prover 委託證明器。 | Rust |
randprotocol/randscan.org | randscan.org 背後的區塊瀏覽器:基於 axum 的索引器,在 PostgreSQL 之上提供 REST 與 WebSocket API,另有 Next.js 前端。 | Rust · TypeScript |
randprotocol/bridge | 連接 Ethereum、Binance Smart Chain、Tron 與 Solana 的 USDT 及 USDC 守護者跨鏈橋:託管合約、共用的證明(attestation)格式及其測試向量。 | Solidity · Rust |
randprotocol/zkp-circuits | 證明系統導讀(Groth16 對比 STARK、屏蔽池、環簽名、混幣器)、research/、Rand 參考 zkVM、recursion/(遞歸 VM)、guest 工具鏈與兩個轉譯器,以及 CUDA 內核。構建全節點時,須將本代碼庫以 circuits/ 為名,檢出至全節點代碼庫旁。 | Rust |
randprotocol/clients | 錢包客戶端:桌面版、網頁版、iOS 及 Android。 | Rust · Swift · Java · JavaScript |
技術棧
全程使用 Rust。Rand 是一條獨立的區塊鏈:HotStuff BFT 節點配合 libp2p gossip 層,以完全屏蔽的 note 池作為賬本,採用後量子簽名與 note 加密,並以 Rand zkVM 處理保密計算,全部位於全節點代碼庫之中。證明系統本身是仍在積極研究的部分,詳見下文。
| 層級 | 運行內容 |
|---|---|
| 共識 | 鏈式 HotStuff BFT、按權益加權的法定人數、三鏈提交 |
| 網絡 | libp2p:TCP、Noise、Yamux、gossipsub、Kademlia,局域網內使用 mDNS |
| 賬本 | 屏蔽式 note 池:深度為 32 的 Poseidon2 樹、nullifier 集合,每筆交易含一個 4 入 4 出的隱藏資產捆包(至 chain 13 為 2 入 2 出);自 chain 17 起,捆包證明旁另有第二個 tier-10 授權證明(拆分授權);自 chain 18 起,採用 1,860 字節的 note 信封,附帶加密備註 |
| 代幣 | RPL:代幣是賬本註冊表中帶有 rpl1… 標識的條目,而非合約;它在同一個池中以 note 的形式流轉 |
| 質押 | 公開的驗證者登記冊:以捆包質押保證金、兩個 epoch 的解綁期、每個 epoch 1,000 個區塊;自 chain 20 起,新驗證者須經驗證者集合投票方可加入 |
| 保密計算 | Rand zkVM:Plonky3 批量 STARK 之下的 RV32IM,具零知識隱藏的 FRI,自 chain 21 起採用約束集 9(chain 18 至 20 為約束集 8);自 chain 18 起,每次調用須聲明由電路強制執行的 gas 上限,並按 gas 及按 KiB 付費;自 chain 20 起,程序可將狀態存於 cell,並將價值存放於 vault(RPL-2);自 chain 21 起,RPL-3 永續合約引擎以狀態證明結算,多重簽名策略亦可在授權證明內部得到證明 |
| 密碼學 | Dilithium2 · ML-KEM-768 · Poseidon2 · BLAKE3 · ChaCha20-Poly1305 |
| 存儲 | 每個節點一個 RocksDB,提交時 fsync,啟動時進行完整性檢查;可選擇修剪歷史數據(--prune-history 24h),歸檔節點則保留全部數據 |
| 跨鏈橋 | 四條鏈上由守護者證明的鎖定,每次鑄造均附有 Dilithium2 聯合簽名法定人數;跨鏈資產即同一個池中的一個 note |
| 語言 | 全程使用 Rust;跨鏈橋使用 Solidity,瀏覽器使用 TypeScript |
一個關係,涵蓋所有程序
白皮書中的通用執行關係 R_exec 已以代碼形式存在:rand_zkvm,一台 RV32IM 機器,在 Goldilocks 域上的 Plonky3 之下以單一批量 STARK 證明。它證明某條執行軌跡以經加鹽 H_IN 所承諾的輸入運行了程序 hc,並得出這些公開輸出;程序本身從不是驗證器的參數。發佈保密程序,意味着註冊一個哈希,而非生成專屬電路。
該證明系統是透明的,無需可信設置,亦不需要配對曲線,其假設為抗碰撞哈希。凡涉及證明的其他組件,預期均會向此 crate 靠攏,而非自行發展一套。此 crate 位於 zkp-circuits/research,並以約束集 8 引入全節點(circuits aeacf31,全節點 v0.6.7 及 v0.6.8)。除非某一行註明採用較後的約束集,下列表格與量度均針對約束集 5(里程碑 M4.2);數據取自截至 2026-09-13 的全節點 docs/zkvm.md、docs/zkvm-milestones.md 及 docs/confidential.md,量度結果為在 Apple Silicon 筆記本電腦上的實測值,並非目標值。
八張表置於具名總線,另有第九張按需而設
一次承諾,一次 FRI 開啟。各表之間從不互相調用;它們透過具名的 LogUp 總線(PROGRAM、PROGRAM_WORD、MEMORY、ALU、POSEIDON2、INPUT_DIGEST、INPUT_READ、KECCAK,以及範圍與 nibble 查找)交換事實,由驗證器檢查每條總線在全局上是否平衡。每張表的最大約束次數均由測試釘定,低於 FRI blowup 所容許的上限 8。
| 表 | 類別 | 作用 |
|---|---|---|
program | 見證 | 自 M3.4 起在電路內解碼的原始指令字,由 cpu 摘要為 hc |
cpu | 見證 | 每個週期一行,另有摘要行,將程序吸收入 hc,並將加鹽輸入吸收入 H_IN |
memory | 見證 | 寄存器與 RAM 合為一表,按 (space, addr, ts) 排序;自 M2.5 起支持子字訪問 |
alu | 見證 | 字節肢算術、移位、比較;自 M2.6 起支持 RV32M 乘法與除法 |
range | 預處理 · 256 行 | 範圍檢查與二的冪查找 |
nibble | 預處理 · 256 行 | 4 位 AND、OR、XOR;命中本身即是對兩個操作數的範圍檢查 |
poseidon2 | 見證 | 每輪置換一行,以 32 行為一塊;服務 POSEIDON2 總線及兩個摘要 |
input | 見證 · 自 M4.1 起 | 每個私有輸入字一行;服務 INPUT_DIGEST 與 INPUT_READ,因此讀取無法逸出承諾 |
keccak | 見證 · 可選 | 以 32 行為一塊的 Keccak-f[1600],僅在 guest 調用過 KECCAK 的證明中出現(M4.2) |
此後已有三個約束集落地。約束集 6 新增了一張必備的 public 表,用於程序在部署時的公開輸入,並綁定至未加鹽的摘要 H_PUB,另在 keccak 旁增設可選的 sha256 表。約束集 7(chain 16)在新的 BLIND 總線上對每個 LogUp 終端加以遮蔽,並將每張已聲明的表下限定為 2⁷ 行,同時新增受長度約束的 POSEIDON2_LEN 系統調用。約束集 8(chain 18)則在 cpu 表中加入 GAS 列,以及一個公開值,即所聲明的 GAS_LIMIT。
證明揭示甚麼
公開: 代碼哈希 hc(八個電路內摘要字)、加鹽輸入承諾 H_IN(八個字)、gas 層級,以及八個輸出字。自約束集 6 起還包括 H_PUB,即公開輸入的摘要;自約束集 8 起還包括所聲明的 gas 上限。證明的標頭聲明 Keccak 與 SHA-256 表的高度,因此可顯示某次調用有否進行哈希運算,並在 2⁷ 下限之上顯示大致的運算量。
隱藏: 私有輸入(H_IN 經加鹽,故既隱藏亦綁定);每個指令字,因為驗證器檢查的是 hc 而從不是程序;每個寄存器與內存值;每個所走的分支;確切的週期數與確切的 gas 用量;以及運行了哪些系統調用,惟兩張哈希表的高度所顯示者除外。
層級對每個證明而言是公開的,因為 STARK 的大小本已洩露其軌跡高度;隱藏該索引並無益處。hc 是綁定的,而非隱藏的:見目前的局限所在。
約束集 5 下的量度
| FRI | 80 次查詢 · 20 位 PoW · blowup 8 · arity 8 · 啟用 ZK;260 位猜想安全性,約 86 位已證明。M2 的 27 次查詢調校已於 2026-09-12 的審計中撤回 |
| 調用 | tier 10 的 private_payment:證明約需 7 秒,80 次查詢下證明約 1.2 MB(27 次查詢時為 435 KB),低於 M1 的 21.6 秒及 892 KB |
| 轉賬 | chain 13 及以前的 2 入 2 出捆包 guest:3,811 個字,約 9,160 個週期,tier 14;證明約需 100 秒,證明約 1.3 MB。Chain 14 的 4 入 4 出隱藏資產 guest 釘定於同一層級:約 100 秒,約 1.42 MB |
| 驗證 | 密鑰已預熱時約 16 ms;在新的 (tier, heights) 密鑰上首次驗證約 230 ms |
| 區塊 | 4 MiB 預算及 2 MiB 證明上限:80 次查詢下每個區塊約三筆屏蔽轉賬 |
Apple Silicon 手提電腦,release 構建。M2.3 中把 byte 表拆分,才是令證明時間下降的原因;80 次查詢的設定,則令證明大小回升。驗證密鑰與程式內容無關,只由層級(tier)及證明所聲明的程式、輸入和 keccak 高度決定,因此一個節點只需預熱一把密鑰便可重複使用。
其後的約束集再度改變了大小。在約束集 7 下,生產設定的 tier-10 證明為 1,367,688 bytes,載有 Keccak 的 tier-10 證明為 3,283,898(2026-09-28 量度)。自 chain 17 起,一筆轉賬附帶兩份證明:約 1.49 MB 的 tier-14 bundle 證明,以及約 1.37 MB、證明時間約 7 秒的 tier-10 授權證明。Chain 20 的創世設定了 20 MiB 區塊及 4 MiB 證明上限,chain 21 則為 19 MiB 區塊及 6 MiB 證明上限,而單次調用不得超過 tier 14。
三個目標,一個電路
只有 RISC-V 以原生方式執行。Solidity 與 Solana 程式要麼在同一關係內的解譯器 guest 上執行,並以其位元組碼作為輸入;要麼在鏈下翻譯成 RISC-V 程式,其輸出與解譯器逐字相同。開銷高昂的操作碼需要專用的協處理器表,而不是逐位元模擬。
| target | 路徑 | 協處理器 |
|---|---|---|
| RISC-V | 原生。RV32IM,可經 asm.rs 手工組譯,或編譯自針對 riscv32im-unknown-none-elf 的 no_std Rust,自 M4.1 起以平面二進位檔載入,亦可由 rand-guest 從 Rust 或 C 構建成映像容器(部署 Rust 程式) | Poseidon2(自 set 7 起含 POSEIDON2_LEN);自 M4.2 起的 Keccak-f[1600];自 set 6 起的 SHA-256 |
| Solidity | solc --bin-runtime 產生 EVM 位元組碼,再由 evm.bin 解譯器 guest(以位元組碼為輸入)執行,或由 evm2rv 把位元組碼翻譯成 C,再經 rand-guest 構建成輸出相同的 RV32IM 映像(Ethereum 轉譯器) | Keccak-256(表已隨附)、256 位元模運算、ECRECOVER、用於儲存的 Merkle 見證 syscall |
| Solana / SVM | sBPF ELF,由 sbpf.bin 解譯器 guest 執行,或由 sbpf2rv 翻譯成輸出相同的 RV32IM 映像(Solana 轉譯器) | SHA-256、Ed25519 驗證、64 位元乘法 |
里程碑
里程碑 1 證明了通用機器。里程碑 3 把它變成屏蔽池(shielded pool):帶電路內成員資格證明的轉賬在 R_exec 下完成證明,驗證者核對 hc 時從不見到任何程式字。里程碑 4 處理相容性:其載入器、輸入承諾及 Keccak 表以約束集 4 和 5 交付,SHA-256 表則隨 set 6 交付。EVM 與 sBPF 解譯器 guest、rand-guest 工具鏈以及兩個翻譯器均已構建。ERC-20 轉賬已在一部 128 GB 的機器上完成證明;tier 20 的 SPL Token 證明則尚未完成。里程碑 5 是區塊聚合背後的遞歸 VM,已構建,並在所有鏈上關閉。約束集 7 與 8 承接九月的審查及 gas 模型。
| id | 範圍 | 完成準則 | 狀態 |
|---|---|---|---|
| M1 | 五張表、RV32I 基礎指令集、HALT/WRITE_OUTPUT/READ_INPUT、ZK 開啟、tier 填充、組譯器、模擬器 | fib、memcpy、bubble_sort、alu_mix 與 balance_check 均能證明並驗證;每項作弊測試均被拒絕 | 完成。 44 項測試;其後一次審查一併填補五個健全性漏洞 |
| M1.5 | 查看密鑰(viewing key):一入一出的屏蔽轉賬 guest、以 ML-KEM-768 及 ChaCha20-Poly1305 封裝的 note 信封、以各方及交易為範圍的披露、模擬賬本 | 轉賬在 tier 12 完成證明且賬本接受;每種披露範圍只開啟其本身的列;查看密鑰不能花費 | 完成。 未納入節點的 vendor 目錄 |
| M2 | 驗證密鑰緩存、FRI 重新調校至 100 位元推測目標、byte 表拆分為範圍表與 nibble 表、子字載入與儲存、RV32M 擴展 | 交付範圍比原定為窄:平面二進位載入器及更穩固的 READ_INPUT 綁定順延至 M4.1 | 完成。 tier 10 的 fib:證明由 892 KB 減至 268 KB,證明時間由 21.6 秒減至 3.1 秒,首次驗證由 2.17 秒減至 16 毫秒。約束集 3,屬硬分叉 |
| M3 | Poseidon2 晶片與 syscall;建基於其上、作為 guest 例程的 NOTE_COMMIT、NULLIFY 與 MERKLE_VERIFY;已花費的承諾移出公開輸出;程式表作為見證,hc 在電路內摘要 | 轉賬關係在 R_exec 下連同電路內成員資格完成證明,且 verify(hc, proof) 從不見到任何程式字 | 完成。 轉賬 guest:4,554 條指令、4,903 個週期,tier 14。Merkle 遍歷現為計數迴圈,因此程式大小不再隨樹深度增長 |
| CUDA | GPU 證明器後端:NTT 與 Poseidon2 Merkle 承諾以 CUDA kernel 實現,置於 Plonky3 的 Dft 與 Mmcs trait 之後;rand send、call 與 deploy 接受 --cuda | 每個 guest 均經純 Rust 參考孿生實現及模擬驅動程式完成證明與驗證;CPU 驗證者無法分辨後端 | 完成;2026-09-28 首次在硬件上運行。 在 NVIDIA H100 上,kernel 為 sm_80 及 sm_90 構建成 PTX,並與 CPU 及 Plonky3 參考實現一致。在機群 GPU 節點上的生產環境重新量度仍待進行。CUDA 調用無法封裝輸入信封,因為鹽值從不離開證明器 |
| M4.1 | 平面二進位載入器及首批針對 riscv32im-unknown-none-elf 編譯的 no_std Rust guest;帶獨立輸入表的加鹽輸入承諾 H_IN,使 READ_INPUT 成為針對已承諾向量的查找 | 以標準工具鏈構建的 guest 能載入、證明並驗證;對同一輸入索引的兩次讀取一致,且輸入綁定於 H_IN | 完成。 於 2026-09-11 以約束集 4 落地:26 個公開值、八張表,屬硬分叉 |
| M4.2 | 手寫的 Keccak-f[1600] 協處理器表及 KECCAK syscall,僅在 guest 使用時才出現於證明中;由證明聲明的記憶體高度;以四個組成部分為鍵的驗證密鑰;2026-09-12 審計後 FRI 回到 80 次查詢 | keccak256 作為已編譯 guest 完成證明,且不含該表的證明在形態上與 M4.1 的證明逐位元組相同 | 完成。 於 2026-09-12 以約束集 5 落地,屬硬分叉。載有 Keccak 的證明大約大 1.9 MB,超出預設的 2 MiB 上限。創世設定調高上限的鏈可接納這類證明:chain 13(8 MiB)於 2026-09-19 接納了一次 3.41 MB 的載有 Keccak 的調用,而 chain 20 的上限為 4 MiB,chain 21 則為 6 MiB |
| M4.3 · M4.4 | 編譯成 RV32IM 的 EVM 與 sBPF guest 解譯器,以外來位元組碼為輸入;與 Keccak 並列的 SHA-256 協處理器表;其後是 rand-guest 工具鏈以及 evm2rv 與 sbpf2rv 翻譯器(2026-09-18) | ERC-20 轉賬與 SPL Transfer 各自在 R_exec 下完成證明 | 已構建;完成一份出口證明。 evm.bin(18,009 字)與 sbpf.bin(8,317 字)可運行 ERC-20 及 SPL Token 測試向量,翻譯所得映像與之逐字相符。ERC-20 transfer 於 2026-09-19 在一部 128 GB 的 droplet 上以 tier 18 完成證明(峰值 85.0 GB,53.8 分鐘);tier 20 的 SPL Token 證明據推算約需 330 GB,尚未完成(證明記憶體)。兩者均不能在鏈上調用:單次調用上限為 tier 14 |
| M5 | 遞歸 VM(rVM):一部 24 條指令、原生於 Goldilocks 的機器,其程式驗證 Rand zkVM 證明;每種內層證明形態對應一個 N 通用的聚合程式;CPU 與 CUDA 後端分離;以及一個自我驗證者(M5.1 至 M5.4,2026-09-13 至 2026-09-16) | 50 份真實的生產 bundle 證明被接受,50 份被竄改的證明在指明的步驟被拒絕;一份針對一份真實 bundle 證明的驗證程式的 rVM 證明可原生驗證(測試設定) | 已構建;生產證明需要大型機器。 以 crates/randprotocol-rvm 納入。鏈上聚合已合併,並在所有鏈上關閉(見下文) |
| set 7 | 每個 LogUp 終端均加入遮蔽;每張已聲明的表下限為 2⁷ 行;對輸入、公開及鹽值字作 32 位元範圍檢查;POSEIDON2_LEN syscall;一項 JALR 修正;驗證密鑰由 key_derivation_v2 加鹽 | 2026-09-27 及 28 日 zkVM 審查中會改動驗證密鑰的修正,一次過納入 | 完成。 Fullnode v0.6.1,chain 16(2026-09-28),屬硬分叉 |
| set 8 | gas 計量器:cpu 表中的 GAS 欄及公開的 GAS_LIMIT,並在電路內證明 GAS ≤ GAS_LIMIT;該次運行的確切 gas 保持私密 | 調用按其聲明的上限付費,且每份 bundle 證明均聲明同一個固定上限 | 完成。 Fullnode v0.6.7-rc1,chain 18(2026-09-29),屬硬分叉。bundle_gas_limit 為 20,479 |
屏蔽池階段
fullnode 的賬本分三個階段落地,每個階段均為硬分叉(docs/shielded.md §7)。S1 以 note 池取代賬戶賬本;S3 把橋接以 note 形式帶回,並率先落地;S2 在其上加入質押。三者均已併入 main,並在當前鏈上運行。
S2 以下各列為 v0.5 的工作。每一列都是一次硬分叉;這些變更合併為一條全新的鏈,即 chain 14,於 2026-09-20 由構建 b3c594c 切出,並在經已部署的來源端點完成一次 zUSD 實時往返後,於同日標記為 v0.5。Chain 15 自 2026-09-26 起以 v0.5.8 及其後版本上線,承載了全部內容,並啟用了審計 v4 與 v5 中以創世區塊為條件的修復:設有每 epoch 預算的白名單水龍頭、延遲生效的質押、質押權重上限、與創世區塊綁定的註冊、consensus_domain 1、橋接規則 v2,以及代幣註冊表的上限、被銷毀的註冊費和 2⁶³ 票據上限。Chain 20 自 2026-10-01 06:17 UTC 起以 v0.6.8(c9c9bd3c)上線,是 chain 19 的硬分叉,保留了全部內容並加入 v0.6 各版本的工作;chain 21 自 2026-10-12 10:31 UTC 起以 v0.8.0(c0878c3f)上線,是 chain 20 的硬分叉,保留以上全部內容,並加入約束集 9、私密多重簽名、被銷毀的費用下限、RPL-3 永續合約和多重簽名賬戶,詳見下文。
| id | 範圍 | 完成準則 | 狀態 |
|---|---|---|---|
| S1 | 資金池本身:票據、2 入 2 出的已證明捆包、深度為 32 的 Poseidon2 承諾樹與作廢符集、附本地 prover 的 rand 錢包、經遮蔽的 RPC | 在集群測試套件中,錢包之間的屏蔽轉賬、兩個驗證節點之間的雙花競爭,以及以捆包支付的部署並調用均告通過 | 已完成。 自 chain 6(2026-09-12)起在公共機羣上線 |
| S3 | 以票據形式呈現的橋接:橋接持倉帶有註冊表的資產索引,一份證明會存入一張由鏈自行計算的票據,BridgeBurn 是唯一一種含兩個捆包的交易;調用輸入的密封信封,可由調用者、每次調用的密鑰或指定的審計者開啟 | 橋接資產以票據形式被鑄造、花費和銷毀;調用者可以在不公開的前提下披露程序所運行的輸入,且 rand open-call 會對照 H_IN 檢查開啟結果 | 已完成。 最先落地。Chain 9 至 13 的創世區塊不含橋接部分;自 chain 14 起的每條鏈均包含。自 chain 14 起,一次銷毀只需一個捆包,不再是兩個 |
| S2 | 屏蔽鏈上的質押:公開的驗證節點登記冊、由捆包銷毀額支付的 Bond、歷時兩個 epoch 的 Unbond、提取至收款地址票據的 Withdraw、每 1,000 個區塊一個並重新推導驗證節點集的 epoch,以及對登記冊與資金池的供應量審計 | 第五個驗證節點完成登記、質押,並自下一個 epoch 起提出區塊;另一個驗證節點退出驗證節點集並提取至一張其收款錢包可花費的票據;兩者均在集群測試套件中通過 | 已完成。 錢包的本地承諾樹於 2026-09-21 跟進:錢包自行計算見證,不再向其節點透露所花費的是哪一片葉 |
| RPL | 代幣標準(docs/tokens.md):代幣是賬本中的一項註冊表條目,附有 62 個字元的 rpl1… bech32m id;創建無需許可,只須支付以 RAND 計的註冊費;鑄造權限在註冊時固定為無、某個密鑰或橋接;代號不要求唯一;rand token create、mint、set-authority、burn、info、list,以及 rand_getTokens、rand_getToken、rand_getTokenSupply | 代幣在同一資金池中以票據形式被註冊、鑄造、經 rand send --asset 發送並銷毀 | 自 chain 14(v0.5)起運行。 自 chain 20 起,註冊費為 1 RAND 並予以銷毀,註冊表最多容納 4,096 個代幣,創世區塊在索引 1 列出 zUSD |
| RPL-2 | 程序狀態(docs/program-state.md):每個程序各自的單元(由 8 個字組成的鍵對應 8 個字組成的值,納入狀態根)、每種資產一個公開金庫、僅可由其程序鑄造的代幣,以及 Invoke 操作(Action 33),即一次聲明其所讀寫的單元及所支付票據的調用;rand program invoke、state、vault,以及 rand_getProgramCell、rand_getProgramCells、rand_getProgramVault | 只有在每項已聲明的讀取仍然成立且金庫足以支付每筆付款時,賬本才會應用該狀態轉換;過時的讀取會被拒絕並重新證明 | 自 chain 20(v0.6.8)起運行。 每創建一個單元收取 cell_fee 0.01 RAND;每次 invoke 最多 8 次讀取、8 次寫入和 4 筆付款。參見程序 |
| 隱藏資產捆包 | 每筆交易恰好攜帶一個 4 入 4 出的捆包,以取代 2 入 2 出的捆包:槽位 0–1 存放私密資產(僅 RAND 的轉賬則為虛設項),槽位 2–3 一律為 RAND 並支付費用。含兩個捆包的代幣轉賬與含兩個捆包的橋接銷毀均已取消 | RAND 的轉賬與任何 RPL 代幣的轉賬公布完全相同的形態,因此被轉移的資產得以隱藏 | 自 chain 14(v0.5)起運行。 層級 14,證明約需 100 s,在 chain 14 和 15 上證明約 1.42 MB;當時的 hc_bundle 為 83d3a370…。Chain 18 至 20 固定使用捆包 guest v3,hc_bundle 為 60af094a…,約 1.49 MB |
| 交易綁定 | 每個捆包證明均針對 H("rand-tx-bind-1", chain_id ‖ tx with proofs blanked) 生成並據此驗證,該值載於公開輸入段 | 將未經修改的證明原樣複製,並在更改目的地、驗證節點或備註後重新提交,會被拒絕 | 自 chain 14(v0.5)起運行。 自 chain 20(binding_domain 1)起,原像為 H("rand-tx-bind-2", genesis hash ‖ chain_id ‖ …),且每條已簽名的操作消息亦帶有創世區塊哈希,因此為某一條鏈證明或簽署的內容,在另一條鏈上不會通過驗證 |
| B1–B4 | 橋接加固(docs/bridge.md §§14–20)。B1:每種支持資產每日的鑄造上限,以及一把只能暫停的暫停密鑰(解除暫停須經 PQ 法定人數)。B2:區塊時間戳比其父區塊晚超過 60 s 即屬無效,而驗證節點不會為比自身時鐘超前超過 15 s 的區塊投票,因此驗證節點須使用 NTP。B3:每次鑄造均須取得 Dilithium2 聯署法定人數。B4:在創世後,於 PQ 守護者法定人數之下上架橋接代幣或支持資產,無須切換新鏈 | zUSD 是一種擁有七項支持資產的代幣(Ethereum、Binance Smart Chain、Tron 和 Solana 上的 USDT 與 USDC),以交易註冊,且 total_supply == Σ backings.locked 由構造保證成立。本地九階段關卡(zusd_e2e.rs:四個驗證節點、真實證明、水龍頭至註冊至存入至轉賬至銷毀至審計)九項全部通過 | 自 chain 14(v0.5)起運行。 自 chain 20 起:每種支持資產每日鑄造上限 100,000 zUSD,另設每滾動 24 小時合共 4,000 zUSD 的全局上限(橋接規則 v2);守護者集 1 含八位 PQ 守護者;每次鑄造和每次銷毀收取 10 bps 的 zUSD 費用(bridge.fees);守護者輪換須持有密鑰並等待 86,400 s(bridge.rotation)。與 chain 20 一樣,zUSD 列於 chain 21 的創世區塊,連同其七項支持資產及切換時鎖定的 100.001999 zUSD |
| 審計 v3 | 第三輪內部審計的修復,由一位聯合創辦人主持(2026-09-19;尚未進行獨立審計)。POOL-1:水龍頭 Mint 攜帶其票據開啟值(pk、time、r),准入時重新計算承諾,鑄造者簽署 rand-mint-2;創世分配票據同樣攜帶開啟值。RPC-1:rand_getWitness(es) 同時最多進行兩次樹重建,並在 10 s 後回應 -32000 busy。OPS-1:全部十八把驗證節點密鑰均已輪換,於倉庫之外生成,倉庫中不追蹤任何密鑰 | 承諾所開啟的數額超過其金額的鑄造會被拒絕;倉庫中從未出現過任何 chain 14 的密鑰 | 自 chain 14(v0.5)起運行。 PRIV-1,即指明葉的見證請求,已於 2026-09-21 由錢包自身的樹關閉 |
v0.5 之後的版本
每個版本都是一個 git 標籤,並在 fullnode 的 CHANGELOG.md 中有一項記錄。更改共識、線路格式或驗證密鑰的版本會隨一條新鏈發佈;其餘版本則逐個節點滾動升級至現行鏈。
| 版本 | 內容 | 鏈 |
|---|---|---|
| v0.5 至 v0.5.8 | RPL 代幣、zUSD 及加固後的橋接(見上文);審計修復;歷史修剪;共識與同步加固 | 14, 15 |
| v0.5.9 | 重新掃描修復:水龍頭僅從創世驗證者鑄造、同步退避、流言傳播預檢 | 15 |
| v0.5.10 | 地址分享:指紋、randpay: 連結及 QR 碼;加密備註,由鏈 18 首次啟用 | 15 |
| v0.5.11 | 團隊、投資者及合作夥伴配額的時間鎖定創世歸屬。受創世閘控,未在任何鏈上啟用 | 無 |
| v0.6 | 九月審查所得的 zkVM、rVM 及聚合修復 | 15 |
| v0.6.1 | 約束集 7:LogUp 盲化、2⁷ 表下限、32 位範圍檢查、POSEIDON2_LEN、JALR 修復。鏈 16 以 hardening_v6 及交易束客體程式 v2 切出 | 16 |
| v0.6.2 | 委託證明,第一階段:rand-prover 二進位檔及錢包的 --prover。第一階段的證明者會收到花費密鑰 | 16 |
| v0.6.3, v0.6.4 | 委託證明,第二階段:拆分授權。交易束證明不再取用花費密鑰,改由 10 級授權證明取用,交易 id 域變為 rand-txid-3 | 17 |
| v0.6.6, v0.6.7-rc1 | Gas:約束集 8、每項證明宣告的 gas 上限、動態 gas 及位元組價格;備註功能啟用。v0.6.6 從未以標籤版本切出 | 18 |
| v0.6.7 | 鏈 18 上不改變任何共識規則的修復:封存證明修剪(休眠)、信封格式釘定、查看密鑰衛生、rVM 分配器、GPU 內核別名、ALU 測試覆蓋。在完整工作區測試套件完成前即已打上標籤 | 18, 19 |
| v0.6.8 | RPL-2:程式單元、程式保險庫及 Invoke 動作。zUSD 橋接費用,雙向適用。最後的 audit-v6 修復:不自動釋放鎖定(CON-4)及超時證書節拍器(CH-1);--public-rpc 監聽器、讀取限制、保留的驗證者對等節點、同步與流言傳播預算、交易池的位元組上限、證明標頭所宣告階數的上界(ZKV-4);以及鏈 20 啟用的創世閘控規則:創世哈希綁定、testnet、1,024 個區塊的證明窗口、gas 價格上限及付費位元組負載、按投票准入、以比例表示的質押進入上限、橋接輪換的持有證明與延遲。錢包須使用此版本方可在鏈 20 上發送 | 20 |
| v0.7.0, v0.7.1 | 僅限節點,逐個節點滾動升級至鏈 20(2026-10-01 及 2026-10-07)。首批由發佈工作流程依標籤構建並由發佈密鑰簽署的版本;audit v7 補編(依據未簽署的宣稱高度而開放的按哈希取回、上限為 16 MiB 回覆的 rand_getBlocks 分頁、rand-prover 的證明超時、限於迴環並配以系統調用過濾器的證明者池);--threads、--cpu,以及 CUDA 構建默認使用 GPU;自 v0.7.1 起,所有 RandProtocol 儲存庫統一版本編號 | 20 |
| v0.8.0 | 約束集 9(rVM 第四階段的 Merkle 跨度及 MODQ 晶片):每個驗證者密鑰及證明編碼均有改變,故此構建自鏈 21 起運行,並拒絕鏈 18 至 20。私密多重簽名:於第二個授權客體程式(hc_auth_multisig,18 級)內證明的 M-of-N Dilithium2 策略,鏈上只得知交易束已獲授權;固定的驗證者密鑰隨發佈版本附帶。鏈 21 啟用的創世閘控部分:fees(每個交易束的下限費用被銷毀,提議者保留小費)、perps(RPL-3:zUSD 上的一個 BTC-PERP 市場,由 18 級狀態證明結算)、multisig(餘額公開的 M-of-N 賬戶;基金會財庫,3 取 2,100,000 RAND)。在每條鏈上均僅限節點:緊湊區塊、啟動檢查點、驗證緩存、跟隨者在共識循環以外應用區塊、掃描頭(rand_getScanLeaves)。已構建但未在任何鏈上啟用:以美元計價的證明者報酬(SetRandPrice)、樹狀聚合。錢包須使用此構建方可在鏈 21 上發送 | 21 |
目前的界限
與白皮書不一致之處,如實陳述,不加粉飾。每一項均在相應 crate 自身的文檔中追蹤,並註明了解決它的里程碑。
hc具綁定性而不具隱藏性:它不帶鹽值,因此猜測的程式可被確認,同一程式的兩次部署亦可被關聯。M3.4 所消除的,是驗證者以明文持有整個程式這一情況。- 2026-09-21 之前構建的錢包會向其節點索取見證,而見證請求會指明即將花費的葉子。現時的
rand自行保存樹的副本,從不索取;節點仍為較舊的錢包提供rand_getWitness。 - 存款在邊界處是公開的:水龍頭鑄造、創世票據及橋接存款均以明文帶有其金額(自鏈 14 起,鑄造及創世票據亦帶有其開啟值,因此擁有者密鑰同樣公開),與任何地方由透明轉入屏蔽的存款所具有的一跳可見性相同。
- 零知識是統計性的,而非完美的。這正是 Plonky3 0.7 的隱藏式 FRI 實際提供的性質,crate 中亦如此說明。
- 轉錄哈希為使用開發用輪常數的 Poseidon2,而非論文所用的 SHA3-384 / BLAKE3-384。這是配置替換,而非重寫。
- 在 80 次 FRI 查詢下,交易束證明於鏈 14 及 15 上約為 1.42 MB(至鏈 13 約為 1.3 MB)。自鏈 17 起,一筆轉賬帶有約 2.85 MB 的證明:交易束證明約 1.49 MB,授權證明約 1.37 MB。在默認鏈上,區塊為 4 MiB、證明上限為 2 MiB,含 Keccak 的證明直接超出證明上限;鏈 20 的創世設定為 20 MiB 區塊及 4 MiB 證明上限(鏈 13 至 16 設定為 8 MiB);鏈 21 的設定為 19 MiB 區塊及 6 MiB 證明上限,為 18 級多重簽名授權證明留出空間。
- 調用證明的標頭並不隱藏。它宣告層級以及 Keccak 與 SHA-256 表的高度,因此可看出調用是否進行過哈希運算。在 v0.6 證明者下限之前於鏈 15 上提交的調用暴露更多:少於 2⁷ 行的私有表可從證明中讀出。v0.6 證明者下限為新的調用堵住了此漏洞,而約束集 7 連同
hardening_v6自鏈 16 起將其定為鏈的規則。 - 一次調用以 14 級為上限,至多 2¹² 行 Keccak(128 次置換)及 2¹³ 行 SHA-256(128 次壓縮),且在
hardening_v6下,超過 8,180 個字的程式不能部署。EVM 與 sBPF 解釋器客體程式,以及經轉譯的 ERC-20 與 SPL Token 映像,均超出此限。 - 持有見證者可看見一切。ZK 保護的是驗證者的視野,而非證明者的視野。自鏈 17 起,錢包可將交易束證明交給配對的
rand-prover,而無須交出花費密鑰,但該證明者仍持有查看密鑰並可看見票據。CUDA 後端於 2026-09-28 首次在硬件上運行,尚無生產環境的量度數據。
儲存庫佈局
fullnode 的 Cargo 工作區,依其 README 及 crates/ 目錄所示。
| 路徑 | 內容 |
|---|---|
crates/randprotocol-core/ | 純邏輯,無 I/O:密碼學、票據與承諾樹、賬本規則、gas、創世、HotStuff 狀態機 |
crates/randprotocol-zkvm/ | Rand zkVM,於約束集 8 自 zkp-circuits/research 引入(電路 aeacf31;以 deploy/sync-zkvm.sh 重新同步),另有鏈端證明驗證者及其驗證者密鑰緩存 |
crates/randprotocol-rvm/ | 遞歸虛擬機,自 zkp-circuits/recursion 引入:一部原生於域上的機器,其程式用於驗證 Rand zkVM 證明 |
crates/bridge-codec/ | 守護者橋接的線路格式及法定人數規則,與 Solidity 合約及 Solana 程式逐位元組共用 |
crates/randprotocol-node/ | RocksDB 儲存、libp2p 網絡、交易池、區塊同步、JSON-RPC 服務器及 rand-node 二進位檔 |
crates/randprotocol-client/ | rand 錢包二進位檔及 RpcClient 庫,不依賴 RocksDB 或 libp2p |
crates/randprotocol-prover/ | rand-prover 二進位檔:為配對錢包證明交易束的委託證明者 |
deploy/ | Testnet 創世文件、nodes.env、運行腳本、雲端部署、切換及重建腳本。自鏈 14 籌備起,此處不再追蹤任何密鑰 |
docs/ | 參考文檔及設計規格 |
scripts/ | 本地雙驗證者 testnet |
已規格化,尚未發佈
這些組件見於論文或 fullnode 的文檔,但並未運行:要麼不在儲存庫之中,要麼已構建但未在任何鏈上啟用。列出它們,是為了讓規格與代碼之間的差距清晰可見,而非有待推斷。
| 元件 | 狀態 |
|---|---|
| bridge · guardian | 以端到端方式運行證明格式的 guardian 與 relayer 守護程式;合約、編解碼器及全節點的接收部分已隨附發佈,守護程式則未發佈 |
| fullnode · aggregation | 以遞歸虛擬機進行區塊聚合:封存、修剪及封存形式同步。已建成,在所有鏈上均處於關閉狀態;rand-node 會拒絕帶有 aggregation 段落的創世區塊。此功能仍需進行端到端的偽造聚合證明測試,而且它只移除打包證明,不移除授權證明。生產環境的 rVM 證明需要大型機器:在約束集 7 下,兩個區塊的聚合耗用 133 GB,三個耗用 221 GB,退出證明則超過 256 GB(於 2026-09-28 及 29 日量度;未在約束集 8 下重新量度) |
| fullnode · vesting | 為團隊、投資者及合作夥伴而設的時間鎖定創世分配(v0.5.11,docs/vesting.md)。以創世區塊啟用:沒有 vesting 段落時,四項 vesting 操作會被拒絕,而目前沒有任何鏈設有該段落。鏈 21 的供應量審計與鏈 20 一樣,所有 vesting 計數器均報告為零。自 v0.6.8 起,可撤銷的條目由其撤銷者達到門檻後撤銷,且只能撤銷至其創世條目所指定的國庫 |
| fullnode · slashing | 針對領導者雙重簽署的罰沒與監禁機制已於 v0.6.8 建成,置於 staking.slashing 之後,並在鏈 20 及鏈 21 上關閉(兩者的創世區塊均沒有該設定,而全部 26 個驗證者密鑰屬於同一營運者)。區塊獎勵、雜湊抽籤式領導者信標及跨程式呼叫尚未建成;僅追加式的 nullifier 累加器(incremental_nullifier_root)已建成並以創世區塊啟用,但沒有任何鏈採用。持久化的每程式狀態已作為 RPL-2 發佈(上文) |
| fullnode · prover pay, tree aggregation | 於 v0.8.0 建成並以創世區塊啟用,但沒有任何鏈採用:以美元計價的封存補貼,按驗證者集合投票決定的 RAND/USD 價格(SetRandPrice、rand_getRandPrice)支付;出塊者與聚合者的費用分成(proposer_share_bps、prove_base);以及樹狀聚合(aggregation_tree,即以一棵 rVM 樹對 L·2^d 個打包進行一次聚合)。以上全部有待聚合功能本身啟用,而鏈 21 並未啟用該功能 |
prover/ | GPU 證明守護程式:從佇列領取批次,並競相提交。CUDA 核心位於 zkp-circuits,並於 2026-09-28 首次在 NVIDIA H100 上運行;市場守護程式並不存在。已隨附發佈的 rand-prover 為與其配對的錢包生成證明,但不是市場 |
| zkp-circuits · M4.4 exit proof | 一個 SPL Token 轉帳的證明(第 20 層),外推約需 330 GB。ERC-20 轉帳(第 18 層)已於 2026-09-19 在一部 128 GB 的 droplet 上完成證明。兩者均無法在鏈 21 上呼叫,因為該鏈將呼叫上限定於第 14 層(永續合約狀態證明是該鏈接納的唯一一個第 18 層證明,而它並非一次呼叫) |
Build and test
Rust 的標準工作流程適用於各個儲存庫。全節點是一個 Cargo 工作區,使用固定版本的工具鏈,並設有一套會透過 TCP 啟動真實節點的叢集測試套件。其建置需要將電路儲存庫簽出到旁邊一個名為 circuits 的目錄,並位於供應商化(vendored)的 crate 所同步自的提交(v0.6.7 及 v0.6.8 為 aeacf31,v0.8.0 為 d217252)。zkVM 是 zkp-circuits 內一個獨立的 crate,有自己固定的工具鏈,並附有一個示範程式,說明保密呼叫會披露甚麼、不會披露甚麼。
全節點:
git clone https://github.com/randprotocol/fullnode.git
git clone https://github.com/randprotocol/zkp-circuits.git circuits # the sibling directory must be named circuits
git -C circuits checkout "$(sed -n 's/^circuits: //p' fullnode/crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md)"
cd fullnode
# Rust 1.98.1 is pinned by rust-toolchain.toml; first build pulls RocksDB and Plonky3, 10 to 20 minutes
cargo build --release # target/release/rand-node, target/release/rand, target/release/rand-prover
# All crates; release because STARK proving is slow in debug. One to two hours, mostly proving
cargo test --release
# One machine, two validators
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status
研究用 zkVM,位於 zkp-circuits/research:
# Toolchain is pinned by rust-toolchain.toml; the first build pulls Plonky3
cargo build --release
# Narrated demo: thirteen proofs, one at production FRI parameters (~6-7 min)
cargo run --release
# Emulator, per-table constraints, cheating provers, ZK, end-to-end, viewing keys, compiled guests (395 tests, ~17 min)
cargo test
全節點測試套件於 v0.6.1 在一部 16 個 vCPU 的機器上的量度結果:core 521 項測試,node 373 項,client 117 項,作弊證明者套件 116 項,隱藏打包作弊測試 21 項(75 分鐘),錢包流程 6 項(53 分鐘),叢集 26 項(44 分鐘),以及 zUSD 端到端關卡 2 項(51 分鐘)。遞歸虛擬機的生產環境證明不在其內,並需要上文所列的記憶體。
Running a node 說明如何以此建置加入公開 testnet;testnet 創世區塊、引導節點及運行腳本均隨附於全節點的 deploy/ 目錄,而下載頁面載有簡短版本。
Contribute
全節點以 GNU General Public License v3.0(GPL-3.0-only)授權;此前為 Apache-2.0。如發現錯誤或有設計建議,請在變更所涉及的儲存庫提出 issue。歡迎提交 pull request:提交前請運行 cargo fmt && cargo clippy,並保持變更範圍集中。可從 fullnode issues 入手。
架構、隱私電路、費用代幣證明及後量子取捨,均載於論文頁面上的白皮書。全節點儲存庫自身的 docs/ 目錄,是本文檔每個頁面所核對的依據。