運行 Rand 節點
參考全節點及其錢包均以 Rust 編寫,可從源代碼編譯。編譯後得到兩個二進制檔案:rand-node 為節點及營運工具;rand 為錢包,持有屏蔽花費密鑰,可透過 JSON-RPC 連接任何節點,並在本機為每一筆轉賬及每一次保密調用運行 zkVM 證明器。實驗性測試網(鏈 21)已在 DigitalOcean 虛擬主機上以 26 個驗證者運行,尚未經審計,亦不具任何實際價值。兩者的 Linux x86_64 二進制檔案已附於 v0.8.0 版本發布,即機群所更新至的構建版本。
# 1. Rust(rustup 會自動採用固定的 1.98.1 工具鏈)及 RocksDB 的編譯依賴
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
sudo apt install build-essential clang cmake pkg-config libssl-dev # Linux
# 2. 克隆並編譯(首次需時 10–20 分鐘)
git clone https://github.com/randprotocol/fullnode.git
cd fullnode
cargo build --release # target/release/rand-node, target/release/rand
# 3. 在本機建立雙驗證者鏈(RPC 位於 8545 及 8546)
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status
# 4. 測試;使用 release 模式,因為 STARK 證明在 debug 模式下速度極慢(678 項測試,於 2026-09-14 實測約需 43 分鐘)
cargo test --workspace --release
# 版本 v0.8.0 (c0878c3f) 運行 chain 21,更早的版本均不能:chain 21 運行約束集 9,其驗證密鑰及證明編碼是更早版本所沒有的。請從標籤自行編譯,或在 Linux x86_64 上使用
# 取用發布的二進制檔案,並對照隨版本發布的 SHA256SUMS 核對
git checkout v0.8.0 && cargo build --release
curl -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/rand-node -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/rand \
-LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/msauth-vk-production.bin# 已固定的多重簽名驗證密鑰:rand-node 會從其二進位檔旁載入該密鑰,缺少時拒絕啟動
sha256sum rand-node rand msauth-vk-production.bin # 必須輸出與該版本相同的值(SHA256SUMS,以 SHA256SUMS.sig 簽署):
# 324a4ab1029d39e67fc2de36b036341b0f88f13089997d7fe24c596363a58278 rand-node
# e3a38e74ee28743a960fc1c3eb1ac6c538e18dc259411e10afff7f54e268bbf4 rand
# 68facb06c7f321aaf1d4d541acf6b5c0e9d7f17788ed1c9add6c5a8a8f7acd30 msauth-vk-production.bin
# 你的節點身份:Dilithium2 驗證者密鑰與 p2p 對等節點 ID 合於一個檔案。請自行生成
# 並存放於檢出目錄之外;儲存庫不再追蹤任何密鑰
rand-node keygen --out node.key.json
# 創世檔隨儲存庫提供;每個節點必須持有完全相同的檔案。
# init 會輸出其雜湊值,必須與下方的雜湊值一致
rand-node init --datadir ./data --genesis deploy/genesis-chain21.json
# 連接公共驗證者(chain 21 沿用 chain 14 的密鑰,因此其對等節點 ID 與 IP 亦相同)。
# 請省略 --validator:你的密鑰不在驗證者集合之內。驗證者還需要 NTP
rand-node run --datadir ./data --key node.key.json \
--listen /ip4/0.0.0.0/tcp/30303 --rpc 127.0.0.1:8545 --no-mdns \
--bootstrap /ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe \
--bootstrap /ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw \
--bootstrap /ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ
# 錢包是獨立的屏蔽密鑰。其 rand1… 地址約為 1.6 KB 的文字
rand keygen && rand address
# 水龍頭鑄幣由驗證者簽署,因此需要驗證者的 RPC:在本機
# 雙驗證者鏈上可直接使用;觀察節點會回應「ask a validator node」。在 chain 21 上
# 水龍頭只會向其創世檔許可名單中的 16 個錢包鑄幣,且只經由其指定的驗證者
rand faucet # 100 RAND 進入只有你能開啟的 note
rand balance # 以你的密鑰掃描 Merkle 樹;其他人無法做到
rand send <rand1 address> 1.5 # 要求確認、生成證明(約 2 分鐘)、等待提交
# 組裝內置的 guest 程式:若四個私密餘額足以支付,則支付超出 1000 的餘額
rand program build --guest private_payment --arg 1000 --out pp.json
rand program deploy pp.json # 輸出程式 ID(其內容哈希值)
# 在本機生成證明;只有證明、八個輸出字及一份密封的輸入記錄會上鏈
rand call <program id> --input 400 --input 250 --input 300 --input 75
rand receipt <tx> # 輸出 [1, 0, 25, 0, ...]:餘額盈餘,以數據形式公布
# 其後打開該記錄,並對照證明所公布的 H_IN 核實
rand open-call <tx> # inputs: [400, 250, 300, 75] — verdict: faithful
系統要求
- 操作系統
- Linux x86_64 或 macOS arm64
- Rust
- 1.98.1,由 rust-toolchain.toml 固定;rustup 會自動安裝
- 編譯依賴
- C++ 編譯器、cmake、pkg-config、OpenSSL 頭文件(RocksDB)
- 首次編譯
- 10 至 20 分鐘:從源代碼編譯 RocksDB 及 Plonky3
- 連接埠
- 公共節點須開放 TCP 30303 入站;RPC 位於 127.0.0.1:8545
- 伺服器
- 1 至 2 vCPU 的雲端實例即可運行測試網驗證者
- 時鐘
- 驗證者須運行 NTP(chrony):若區塊的時間比自身時鐘快逾 15 秒,驗證者會拒絕為其投票,因此時鐘過慢會在無提示下停止投票
- 證明
- 目前僅使用 CPU:在手提電腦上一筆屏蔽轉賬約需兩分鐘(7 秒的授權證明加約 110 秒的 bundle 證明),並佔用約 6 GB 記憶體;小型調用另加約 30 秒
選擇角色
- 觀察者 任何人皆可參與
使用相同的二進制檔案,但不加 --validator。同步區塊鏈,驗證每份證書以及每個 bundle 和調用證明,重新執行每個區塊,比對收據,並提供 JSON-RPC 服務。這是新密鑰在公共測試網上運行的角色。
- 驗證者 需質押
在鏈式 HotStuff 下投票及提出區塊。在 chain 21 上,一如 chain 20,新驗證者須先經投票獲准加入:持有超過三分之二質押量的驗證者為其密鑰簽署 AdmitValidator 操作。隨後它登記節點密鑰(rand-node register --v2),自錢包綁定至少 1,000 RAND,並於綁定後的第三個 1,000 區塊紀元邊界進入驗證者集合(chain 18 的兩個紀元綁定延遲)。Chain 18 以 26 名驗證者起步,每名質押 1,000 RAND;須有超過三分之二質押量,即 26 名中的 18 名,在線並參與投票,方可提交區塊。請自行生成密鑰:儲存庫不再保存任何驗證者密鑰,而為早前各鏈提交的密鑰檔案屬已公開的種子。
- 錢包及證明器 本機
rand 客戶端持有 256 位元的花費密鑰,本身不簽署任何內容:授權由兩個證明構成,一個是以花費密鑰生成的小型證明,另一個是 4 入 4 出的 bundle 證明。它掃描默克爾樹以找出屬於自己的 note,並在你的機器上生成這兩個證明;RAND 與任何 RPL 代幣均採用相同形式;進行保密調用時,亦會為程式生成證明。上鏈的只有證明、承諾、nullifier 及密封信封。
不運行節點?同一個錢包亦提供 iOS、Android、Chrome 及 Firefox 版本:錢包。
每個節點都會檢查所有內容
同步中的節點在接受前,會重新驗證每份證書,重新執行每個區塊(包括其中的證明),並比對收據。啟動時,它會檢查自身資料庫,截去任何不一致的部分,同時保留其投票安全狀態,再從對等節點重新取回缺失的區塊。
# 節點已停止:哈希值、QC、簽名、證明、重放
rand-node verify --datadir ./data --mode full
rand-node verify --datadir ./data --repair
故障測試在實時測試網上進行
- ›停止四個驗證者中的一個:鏈繼續提交區塊,該節點重新上線後數秒內即可追上。
- ›停止四個中的兩個:鏈因缺乏法定人數而停止,待其重新上線後恢復運作,且不會分叉。
- ›損毀某節點的資料庫:啟動時被偵測到,經截斷後從對等節點重新同步,其後與原來逐位元組完全一致。
- ›經由不同節點進行轉賬:全部已提交,各處餘額一致,總供應量不變。
- ›斷開的對等節點連線,會由重新撥號邏輯在約 30 秒內重新建立。
尚未實現
特此列出,讓論文與節點之間的差距一目了然,而非任由讀者自行推斷。
- ›程式的持久化獨立狀態及跨程式調用
- ›錢包本身內置編譯器:程式可以是內置的已組譯 guest,或以獨立的 rand-guest 工具鏈建構的映像檔
- ›罰沒與監禁(slashing 與 jailing)、區塊獎勵、費用市場、哈希抽籤式領導者信標
- ›nullifier 累加器、終局性確立後的證明修剪、證明批次處理
- ›SPL Token 轉帳的 tier-20 證明,以及白皮書所述的 GPU 證明者市場