使用本頁可了解一筆轉賬在 Rand 中流轉時,各方分擔甚麼工作。生成證明成本高昂,驗證證明成本低廉,因此工作按這條界線劃分。發送方負責生成證明;驗證者只負責核查證明、排序交易並投票;聚合者一旦啟用,會把多個證明折疊為一個。下圖追蹤一筆轉賬由錢包到最終區塊的全過程,其後各節逐一說明每個角色。
一筆轉賬的路徑
- 錢包構建轉賬。 錢包挑選其輸入 note,取得這些 note 的 Merkle 見證,構建四個輸出,並將每個輸出封存於 ML-KEM-768 信封之中。接着計算交易的綁定值(binding),即對除證明以外的全部內容所作的哈希(Transactions)。
- 錢包自行證明授權。 這是針對花費密鑰及一個新鮮鹽值的 tier-10 證明,只需數秒。它是唯一觸及花費密鑰的證明,並且一律在錢包自己的機器上生成。
- 捆綁證明在有足夠記憶體之處生成。 此 tier-14 證明用以證明擁有權、成員資格、nullifier 及餘額,記憶體用量峰值約 6 GB。桌面應用程式及擁有約 8 GB 記憶體的手機會自行生成。配置較低的裝置則把工作交予與其配對的證明者:可以是你自行運行的證明者,亦可以是位於
prover.randprotocol.org的驗證者證明者池。兩者收到的都是查看密鑰與鹽值,絕不會收到花費密鑰(Proofs)。 - RPC 節點進行核查。 錢包提交交易的節點會重新計算捆綁摘要,對照綁定值驗證兩個證明,檢查手續費,然後才向其對等節點廣播該交易(Proofs、Mempool)。
- 驗證者排序並使其最終確定。 該視圖(view)的領導者選取仍然適用的交易,按每 KiB 手續費由高至低排列,並提出一個區塊。每名驗證者都會重新驗證區塊內的每個證明,然後投票。當三個法定人數證書在連續視圖中銜接於該區塊之上,區塊即告提交,這需要鏈 21 的 26 名驗證者中有 18 名在線(Consensus)。
- 區塊已成最終狀態,任何人都可核實。 當
rand_getTransaction返回一個區塊時,該交易即為最終確定。日後才同步的節點會重新驗證每一份證書及每個證明,而非信任簽名。
各個角色
| 角色 | 職責 | 是否生成證明? | 可見內容 | 運行方式 |
|---|---|---|---|---|
| 錢包 | 構建、授權並提交轉賬及調用;以自己的密鑰掃描鏈上數據 | 授權證明必定自行生成;裝置具備足夠記憶體時,亦自行生成捆綁證明 | 與自己的 note 有關的一切 | Clients 頁面上的應用程式,或 rand;在鏈 21 上為 Rand Wallet 或 rand v0.8.0(在鏈 20 上為 v0.6.8 或更新版本) |
| 委託證明者 | 為與其配對的錢包生成捆綁證明;錢包會先檢查每一個回覆,然後才提交任何內容 | 僅限捆綁證明 | 配對錢包的查看密鑰:其全部歷史,包括過去與未來;它無法花費 | rand-prover run,或 rand-node run --prover |
| 驗證者證明者池 | 由四台主機運行的委託證明者,包括兩名驗證者及兩台只負責生成證明的機器,共用一個名稱及一把密鑰,供沒有自己證明者的錢包使用;不收費 | 僅限捆綁證明 | 與任何委託證明者相同,涵蓋每個與其配對的錢包 | prover.randprotocol.org,指紋 RGTF-7HKJ-XZFV-GQ1J |
| RPC 節點(觀察者) | 同步、重新驗證每個證明、提供 JSON-RPC、廣播已驗證的交易;不投票 | 否 | 僅限公開欄位:承諾、nullifier、已封存的信封、證明 | rand-node run |
| 驗證者 | 觀察者所做的一切,另加在其視圖中提出區塊,並在 HotStuff 中投票 | 否 | 僅限公開欄位 | rand-node run --validator |
| 聚合者 | 針對一個窗口內已最終確定的捆綁證明生成一個遞歸證明,並提交以供封存區塊使用 | 是,且是網絡上最大的證明 | 僅限公開欄位及證明 | rand-node aggregate --watch,須在設有 aggregation 區段的鏈上運行 |
生成證明與驗證是兩項獨立的工作,驗證者並不需要證明者硬件。證明者池四名成員之中,有兩名是同時以服務形式運行證明者的驗證者;另外兩台是專用的證明者機器,並不持有驗證者密鑰。運行證明者池並不屬於驗證工作的一部分。各角色所需的規格,以及每個 tier 實測的證明記憶體用量,載於 Validator and aggregator hardware。
各角色能夠得知甚麼
一筆轉賬的私隱取決於誰持有哪把密鑰,而非取決於對網絡的信任:
- 驗證者、RPC 節點及瀏覽器所見的,與每個節點所見相同:承諾、nullifier、已封存的信封、手續費及證明。看不到金額、資產、發送方或接收方。
- **委託證明者(包括證明者池)**會收到查看密鑰。憑此密鑰,它可以讀取配對錢包的全部歷史。它永遠無法花費,因為針對花費密鑰的授權證明是在錢包自己的機器上生成的。與證明者池配對,即是選擇讓其營運者看到該歷史。若希望保密,請在自己的裝置上生成證明,或自行運行證明者。
- 委託證明者無法欺騙錢包。 錢包會從所收到的每個證明中讀取摘要,檢查大小並在本機驗證,因此錯誤的證明絕不會到達節點。
聚合:已構建,尚未啟用
目前每個區塊都載有每一個原始證明,一筆轉賬約 2.85 MB,因此一個 20 MiB 的區塊約可容納七筆轉賬。區塊聚合是 fullnode 對此的解決方案。聚合者取得一個窗口內已最終確定區塊的捆綁證明(rand_getUnsealed),生成一個驗證全部證明的遞歸證明,並加以提交。包含該證明的區塊會封存該窗口。屆時驗證者只需驗證一個聚合證明,而非 N 個證明,節點亦可丟棄已被涵蓋的原始證明。聚合者須繳納保證金、無須許可,在 GPU 級別的機器上運行,並可獲得所涵蓋捆綁的證明份額,另加以新 RAND 發放的區塊補貼。
該功能已構建並合併,但尚未啟用。它需要在創世區塊中設有 aggregation 區段,而鏈 21 沒有,正如鏈 20 亦沒有,因此 rand_status 把所有聚合計數器都報告為零。啟用之前,必須在現行約束集下重新量度其捆綁形態,並須針對遞歸驗證器進行偽造聚合的演練。在採用拆分授權的鏈上,它亦只會封存捆綁證明,而不會封存授權證明(Proofs)。