Rand はオープンソースです。フルノード、エクスプローラー、ブリッジ、証明の研究、ウォレットクライアントは、それぞれ GitHub 上の独立したリポジトリにあります。コードを読み、テストを実行し、パッチを送ってください。このページはその地図です。各コンポーネントの所在、使用技術、証明システムのここまでの到達点、そして現時点での限界をまとめています。
リポジトリ
| リポジトリ | 内容 | 言語 |
|---|---|---|
randprotocol/fullnode | リファレンス実装のフルノードとウォレット。chained HotStuff BFT、libp2p ネットワーキング、シールデッド RAND ノートプール、zkVM 証明検証器、JSON-RPC、rand ウォレット CLI、委任型証明器 rand-prover を含みます。 | Rust |
randprotocol/randscan.org | randscan.org を支えるブロックエクスプローラー。PostgreSQL 上の REST および WebSocket API を備えた axum インデクサーと、Next.js フロントエンドで構成されます。 | Rust · TypeScript |
randprotocol/bridge | Ethereum、Binance Smart Chain、Tron、Solana からの USDT と USDC を扱うガーディアンブリッジ。カストディコントラクト、共通のアテステーション形式、そのテストベクターを含みます。 | Solidity · Rust |
randprotocol/zkp-circuits | 証明システムの解説(Groth16 と STARK の比較、シールデッドプール、リング署名、ミキサー)、research/、Rand リファレンス zkVM、recursion/(再帰 VM、ゲストツールチェーン、2 つのトランスレーター)、CUDA カーネル。fullnode のビルドには、このリポジトリを circuits/ として隣に配置しておく必要があります。 | Rust |
randprotocol/clients | ウォレットクライアント。デスクトップ、Web、iOS、Android。 | Rust · Swift · Java · JavaScript |
スタック
端から端まで Rust です。Rand は独自のチェーンです。libp2p ゴシップ層を備えた HotStuff BFT ノード、台帳としての完全シールデッドなノートプール、ポスト量子署名とノート暗号化、機密計算のための Rand zkVM を備え、そのすべてが fullnode リポジトリにあります。証明システムそのものは、以下に述べるとおり、現在も研究が進められている部分です。
| レイヤー | 動作するもの |
|---|---|
| コンセンサス | Chained HotStuff BFT、ステーク加重クォーラム、three-chain コミット |
| ネットワーキング | libp2p:TCP、Noise、Yamux、gossipsub、Kademlia、LAN 上では mDNS |
| 台帳 | シールデッドノートプール:深さ 32 の Poseidon2 ツリー、ナリファイアセット、1 トランザクションにつき 4-in-4-out の隠蔽アセットバンドル 1 つ(chain 13 までは 2-in-2-out)。chain 17 以降は、バンドル証明と並んで 2 つ目の tier-10 認可証明(分割認可)を伴います。chain 18 以降は、暗号化メモ付きの 1,860 バイトのノートエンベロープを使用します |
| トークン | RPL:トークンはコントラクトではなく、rpl1… の id を持つ台帳レジストリのエントリです。同じプール内でノートとして移動します |
| ステーキング | 公開バリデータ登録:バンドルからのボンド、2 エポックのアンボンディング、1,000 ブロックのエポック。chain 20 以降、新しいバリデータはバリデータセットの投票によって承認されます |
| 機密計算 | Rand zkVM:Plonky3 のバッチ STARK 上の RV32IM、ZK 隠蔽 FRI、制約セット 8。chain 18 以降、呼び出しは回路が強制するガスリミットを宣言し、ガスと KiB 単位で支払います。chain 20 以降、プログラムはセルに状態を保持し、ボールト(RPL-2)に価値を保持します |
| 暗号 | Dilithium2 · ML-KEM-768 · Poseidon2 · BLAKE3 · ChaCha20-Poly1305 |
| ストレージ | ノードごとに 1 つの RocksDB、fsync されたコミット、起動時の整合性チェック。履歴のプルーニング(--prune-history 24h)は任意で、アーカイブノードはすべてを保持します |
| ブリッジ | 4 つのチェーン上でのガーディアン認証付きロック。すべてのミントに Dilithium2 の共同署名クォーラムを要します。ブリッジされたアセットは同じプール内のノートです |
| 言語 | 全体を通して Rust。ブリッジには Solidity、エクスプローラーには TypeScript |
すべてのプログラムに共通する 1 つの関係
ホワイトペーパーの普遍的な実行関係 R_exec は、コードとして存在します。それが rand_zkvm で、Goldilocks 体上の Plonky3 による単一のバッチ STARK で証明される RV32IM マシンです。これは、ソルト付きの H_IN によってコミットされた入力に対し、あるトレースがプログラム hc を実行してこれらの公開出力に至ったことを証明します。プログラムに関する情報が検証器のパラメータになることはありません。機密プログラムの公開とは、ハッシュを登録することであり、専用の回路を生成することではありません。
この証明システムは透明であり、トラステッドセットアップもペアリング曲線も不要で、その仮定は衝突耐性ハッシュです。証明に関わる他のすべてのコンポーネントは、独自の仕組みを増やすのではなく、このクレートに収束していくことが想定されています。クレートは zkp-circuits/research にあり、制約セット 8(circuits aeacf31、fullnode v0.6.7 および v0.6.8)で fullnode にベンダリングされています。以下の表と測定値は、特定の行が後のセットに言及している場合を除き、制約セット 5(マイルストーン M4.2)について述べたものです。これらは 2026-09-13 時点の fullnode の docs/zkvm.md、docs/zkvm-milestones.md、docs/confidential.md から取ったもので、測定値は目標値ではなく、Apple Silicon ノート PC での実測値として記載しています。
名前付きバス上の 8 つのテーブルと、必要に応じて加わる 9 つ目
コミットメントは 1 つ、FRI のオープニングも 1 つです。テーブル同士が互いを呼び出すことはありません。テーブルは名前付きの LogUp バス(PROGRAM、PROGRAM_WORD、MEMORY、ALU、POSEIDON2、INPUT_DIGEST、INPUT_READ、KECCAK、そしてレンジおよびニブルのルックアップ)を介してファクトをやり取りし、検証器はすべてのバスがグローバルに釣り合っていることを確認します。各テーブルの最大制約次数は、FRI のブローアップが許容する上限 8 を下回ることがテストで固定されています。
| テーブル | 種類 | 役割 |
|---|---|---|
program | ウィットネス | 生の命令語。M3.4 以降は回路内でデコードされ、cpu によって hc にダイジェストされます |
cpu | ウィットネス | サイクルごとに 1 行。加えて、プログラムを hc に、ソルト付き入力を H_IN に吸収させるダイジェスト行があります |
memory | ウィットネス | レジスタと RAM を 1 つのテーブルに収め、(space, addr, ts) でソート。サブワードアクセスは M2.5 以降 |
alu | ウィットネス | バイトリムの算術、シフト、比較。RV32M の乗算と除算は M2.6 以降 |
range | 前処理済み · 256 行 | レンジチェックと 2 のべき乗のルックアップ |
nibble | 前処理済み · 256 行 | 4 ビットの AND、OR、XOR。ヒットは両オペランドに対するレンジチェックにもなります |
poseidon2 | ウィットネス | 順列の 1 ラウンドにつき 1 行、32 行ブロック単位。POSEIDON2 バスと両方のダイジェストに対応します |
input | ウィットネス · M4.1 以降 | プライベート入力ワード 1 つにつき 1 行。INPUT_DIGEST と INPUT_READ に対応するため、読み取りがコミットメントを逃れることはできません |
keccak | ウィットネス · 任意 | 32 行ブロックの Keccak-f[1600]。ゲストが KECCAK を呼び出した証明にのみ存在します(M4.2) |
その後、3 つの制約セットが加わりました。セット 6 では、プログラムのデプロイ時の公開入力のための必須の public テーブル(ソルトなしのダイジェスト H_PUB に束縛)と、keccak と並ぶ任意の sha256 テーブルを追加しました。セット 7(chain 16)では、すべての LogUp ターミナルを新しい BLIND バス上でブラインドし、宣言されたすべてのテーブルに 2⁷ 行の下限を設け、長さ束縛付きの POSEIDON2_LEN システムコールを追加しました。セット 8(chain 18)では、cpu テーブルに GAS 列を追加し、公開値として宣言された GAS_LIMIT を 1 つ加えました。
証明が明かすもの
公開されるもの: コードハッシュ hc(回路内ダイジェストの 8 ワード)、ソルト付き入力コミットメント H_IN(8 ワード)、ガス tier、そして 8 つの出力ワード。制約セット 6 以降は入力の公開ダイジェストである H_PUB も、制約セット 8 以降は宣言されたガスリミットも公開されます。証明のヘッダーは Keccak および SHA-256 テーブルの高さを宣言するため、呼び出しがハッシュを行ったかどうか、そして 2⁷ の下限を超える場合はおおよその量が分かります。
隠されるもの: プライベート入力(H_IN はソルト付きなので、束縛性に加えて隠蔽性も持ちます)、すべての命令語(検証器が確認するのは hc であってプログラムではないため)、すべてのレジスタとメモリの値、実行された分岐のすべて、正確なサイクル数と正確なガス使用量、そして、2 つのハッシュテーブルの高さから分かること以外の、どのシステムコールが実行されたか。
tier が証明ごとに公開されるのは、STARK のサイズがすでにトレースの高さを明かしているためです。インデックスを隠しても得られるものはありません。hc は束縛的であり、隠蔽的ではありません。現時点での限界を参照してください。
制約セット 5 での測定値
| FRI | 80 クエリ · 20 PoW ビット · ブローアップ 8 · アリティ 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-in-2-out バンドルゲスト:3,811 ワード、約 9,160 サイクル、tier 14。証明に約 100 秒、証明サイズは約 1.3 MB。chain 14 の 4-in-4-out 隠蔽アセットゲストは同じ tier に固定されています。約 100 秒、約 1.42 MB |
| 検証 | ウォームなキーで約 16 ms。新しい (tier, heights) キーでの最初の検証は約 230 ms |
| ブロック | 4 MiB の予算と 2 MiB の証明上限:80 クエリでブロックあたりシールデッド転送が約 3 件 |
Apple Silicon ノート PC、リリースビルドでの値です。証明時間を動かしたのは M2.3 のバイトテーブル分割であり、証明サイズを再び押し上げたのは 80 クエリのプロファイルです。検証器キーはプログラムの内容に依存せず、tier と、証明が宣言するプログラム、入力、keccak の高さによってキー付けされるため、ノードは 1 つのキーをウォームにして再利用できます。
後のセットでサイズが変わりました。制約セット 7 では、本番プロファイルでの tier-10 の証明は 1,367,688 バイト、Keccak を含む tier-10 の証明は 3,283,898 バイトです(2026-09-28 計測)。chain 17 以降、転送には 2 つの証明が付きます。約 1.49 MB の tier-14 バンドル証明と、約 1.37 MB で証明に約 7 秒かかる tier-10 認証証明です。chain 20 のジェネシスでは、ブロックの上限を 20 MiB、証明の上限を 4 MiB とし、呼び出しは tier 14 を超えられません。
3 つのターゲット、1 つの回路
ネイティブに実行されるのは RISC-V だけです。Solidity と Solana のプログラムは、同じリレーション内のインタープリタ・ゲストでバイトコードを入力として実行されるか、オフチェーンで RISC-V プログラムに変換されます。変換後の出力は、インタープリタの出力とワード単位で一致します。高コストなオペコードは、ビット単位のシミュレーションではなく、専用のコプロセッサ・テーブルで処理します。
| ターゲット | 経路 | コプロセッサ |
|---|---|---|
| RISC-V | ネイティブ。RV32IM。asm.rs による手書きアセンブリ、riscv32im-unknown-none-elf 向けにコンパイルした no_std Rust(M4.1 以降はフラットバイナリとしてロード)、または rand-guest が Rust や C からイメージコンテナにビルドしたもの(Deploy a Rust program) | Poseidon2(セット 7 以降は POSEIDON2_LEN も)、M4.2 以降は Keccak-f[1600]、セット 6 以降は SHA-256 |
| Solidity | solc --bin-runtime で EVM バイトコードを生成し、evm.bin インタープリタ・ゲスト(バイトコードを入力とする)で実行するか、evm2rv でバイトコードを C に変換し、rand-guest で同じ出力を持つ RV32IM イメージにビルドします(The Ethereum transpiler) | Keccak-256(テーブル同梱)、256 ビット剰余算術、ECRECOVER、ストレージ用の Merkle ウィットネス・システムコール |
| Solana / SVM | sBPF ELF。sbpf.bin インタープリタ・ゲストで実行するか、sbpf2rv で同じ出力を持つ RV32IM イメージに変換します(The Solana transpiler) | SHA-256、Ed25519 検証、64 ビット乗算 |
マイルストーン
マイルストーン 1 では、汎用マシンを証明しました。マイルストーン 3 では、これをシールド・プールに発展させました。インサーキットでメンバーシップを示す転送は R_exec の下で証明され、検証者はプログラムのワードを一切見ることなく hc を検査します。マイルストーン 4 は互換性です。そのローダー、入力コミットメント、Keccak テーブルは制約セット 4 と 5 として、SHA-256 テーブルはセット 6 として出荷されました。EVM と sBPF のインタープリタ・ゲスト、rand-guest ツールチェーン、2 つのトランスレータは構築済みです。ERC-20 の転送は 128 GB のマシンで証明されましたが、tier 20 の SPL Token の証明はまだです。マイルストーン 5 はブロック集約の基盤となる再帰 VM で、構築済みですが、どのチェーンでも無効です。制約セット 7 と 8 は、9 月のレビューとガスモデルを受けて追加されました。
| id | 範囲 | 完了基準 | ステータス |
|---|---|---|---|
| M1 | 5 つのテーブル、RV32I 基本 ISA、HALT/WRITE_OUTPUT/READ_INPUT、ZK オン、tier パディング、アセンブラ、エミュレータ | fib、memcpy、bubble_sort、alu_mix、balance_check が証明・検証でき、不正を試みるテストがすべて拒否される | 完了。 44 テスト。後続のレビューで、5 件の健全性ギャップを一括で解消 |
| M1.5 | ビューイングキー:1 入力 1 出力のシールド転送ゲスト、ML-KEM-768 と ChaCha20-Poly1305 によるノート・エンベロープ、当事者単位・トランザクション単位の開示、シミュレートされた台帳 | 転送が tier 12 で証明されて台帳に受理される。各開示スコープは自身の行だけを開く。ビューイングキーでは支出できない | 完了。 ノードには取り込んでいません |
| M2 | 検証鍵キャッシュ、100 ビットの推測ターゲットに再調整した FRI、range と nibble に分割したバイトテーブル、サブワードのロードとストア、RV32M 拡張 | 当初の範囲より狭く提供:フラットバイナリ・ローダーとより強固な READ_INPUT バインディングは M4.1 に持ち越し | 完了。 tier 10 の fib:証明は 892 KB から 268 KB、証明時間は 21.6 秒から 3.1 秒、初回検証は 2.17 秒から 16 ms。制約セット 3、ハードフォーク |
| M3 | Poseidon2 チップとシステムコール。それを土台にしたゲストルーチンとしての NOTE_COMMIT、NULLIFY、MERKLE_VERIFY。支出されたコミットメントを公開出力から除外。インサーキットで hc をダイジェストするウィットネスとしてのプログラムテーブル | 転送リレーションがインサーキットのメンバーシップとともに R_exec の下で証明され、verify(hc, proof) がプログラムのワードを一切見ない | 完了。 転送ゲスト:4,554 命令、4,903 サイクル、tier 14。Merkle ウォークはカウント付きループになったため、プログラムのサイズはツリーの深さに比例しなくなりました |
| CUDA | GPU プーバー・バックエンド:Plonky3 の Dft と Mmcs トレイトの背後にある CUDA カーネルとしての NTT と Poseidon2 Merkle コミットメント。rand send、call、deploy は --cuda を受け付ける | すべてのゲストが、純 Rust のリファレンス・ツインとモックドライバで証明・検証される。CPU 検証者はバックエンドを区別できない | 完了。ハードウェアでの初回実行は 2026-09-28。 NVIDIA H100 上で、カーネルは sm_80 と sm_90 向けの PTX にビルドされ、CPU および Plonky3 リファレンスと一致しました。フリートの GPU ノードでの本番再計測は未実施です。CUDA の呼び出しでは入力エンベロープを封印できません。ソルトが証明者の外に出ないためです |
| M4.1 | フラットバイナリ・ローダーと、riscv32im-unknown-none-elf 向けの最初のコンパイル済み no_std Rust ゲスト。専用の入力テーブルを持つソルト付き入力コミットメント H_IN により、READ_INPUT はコミット済みベクトルに対するルックアップになる | 標準ツールチェーンでビルドしたゲストがロード、証明、検証できる。同一の入力インデックスを 2 回読むと値が一致し、入力が H_IN に束縛される | 完了。 2026-09-11 に制約セット 4 として反映:公開値 26 個、テーブル 8 つ、ハードフォーク |
| M4.2 | 手書きの Keccak-f[1600] コプロセッサ・テーブルと KECCAK システムコール。ゲストが使用したときのみ証明に含まれる。証明で宣言するメモリ高さ。4 つの構成要素をキーとする検証鍵。2026-09-12 の監査後に FRI を 80 クエリへ戻す | keccak256 がコンパイル済みゲストとして証明でき、テーブルのない証明は 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 です |
| M4.3 · M4.4 | RV32IM にコンパイルした EVM と sBPF のゲスト・インタープリタ(外部のバイトコードを入力とする)。Keccak と並ぶ SHA-256 コプロセッサ・テーブル。続いて rand-guest ツールチェーンと evm2rv、sbpf2rv トランスレータ(2026-09-18) | ERC-20 の転送と SPL Transfer が、それぞれ R_exec の下で証明される | 構築済み。完了基準の証明は 1 件。 evm.bin(18,009 ワード)と sbpf.bin(8,317 ワード)は ERC-20 と SPL Token のベクトルを実行し、変換後のイメージはそれらとワード単位で一致します。ERC-20 の transfer は 2026-09-19 に 128 GB のドロップレットで tier 18 として証明されました(ピーク 85.0 GB、53.8 分)。tier 20 の SPL Token の証明は約 330 GB と外挿されており、未実施です(証明のメモリ)。どちらもチェーン上では呼び出せません。呼び出しは tier 14 が上限です |
| M5 | 再帰 VM(rVM):Rand zkVM の証明を検証するプログラムを実行する、24 命令の Goldilocks ネイティブなマシン。内側の証明の形状ごとに N 汎用の集約プログラムを 1 つ用意し、CPU と CUDA のバックエンドを分離し、自己検証器を備える(M5.1 から M5.4、2026-09-13 から 2026-09-16) | 本番のバンドル証明 50 件が受理され、改ざんされた 50 件が指定のステップで拒否される。実際のバンドル証明 1 件に対する検証プログラムの rVM 証明が、ネイティブで検証できる(テストプロファイル) | 構築済み。本番の証明には大型マシンが必要。 crates/randprotocol-rvm として取り込み済み。チェーン側の集約はマージ済みで、どのチェーンでも無効です(後述) |
| セット 7 | すべての LogUp ターミナルをブラインド化。宣言されたすべてのテーブルを 2⁷ 行以上に引き上げ。入力、公開値、ソルトのワードに 32 ビットのレンジチェック。POSEIDON2_LEN システムコール。JALR の修正。key_derivation_v2 によるソルト付きの検証鍵 | 2026-09-27 と 28 の zkVM レビューによる修正のうち、検証鍵を変えるものを 1 回でまとめて取り込む | 完了。 Fullnode v0.6.1、chain 16(2026-09-28)、ハードフォーク |
| セット 8 | ガスメーター:cpu テーブルの GAS 列と公開の GAS_LIMIT。GAS ≤ GAS_LIMIT をインサーキットで証明し、実行の正確なガスは非公開のまま | 呼び出しは宣言した上限分を支払い、すべてのバンドル証明が同じ固定の上限を宣言する | 完了。 Fullnode v0.6.7-rc1、chain 18(2026-09-29)、ハードフォーク。bundle_gas_limit は 20,479 です |
シールド・プールのフェーズ
fullnode の台帳は 3 つのフェーズで実装され、いずれもハードフォークでした(docs/shielded.md §7)。S1 はアカウント台帳をノート・プールに置き換えました。S3 はブリッジをノートとして復活させ、最初に実装されました。S2 はその上にステーキングを載せました。3 つとも main に入っており、現行のチェーンにも反映されています。
S2 より下の行は v0.5 の作業です。どの行もハードフォークで、まとめて 1 本の新しいチェーン、chain 14 として 2026-09-20 にビルド b3c594c から切り出し、デプロイ済みのソースエンドポイントを通した zUSD のライブ往復の後、同日に v0.5 としてタグ付けしました。2026-09-26 から v0.5.8 以降で稼働した chain 15 は、そのすべてを引き継ぎ、監査 v4 と v5 のジェネシス制御の修正を有効にしています。エポックごとの予算を持つ許可リスト方式のフォーセット、遅延されるボンドの有効化、ステークウェイトの上限、ジェネシスに結び付けられた登録、consensus_domain 1、ブリッジルール v2、トークンレジストリの上限、焼却される登録手数料、2⁶³ のノート上限です。2026-10-01 06:17 UTC から v0.6.8(c9c9bd3c)で稼働している chain 20 は chain 19 のハードフォークで、これらをすべて維持したうえで v0.6 リリースの作業を加えています。その内容は下記に挙げています。
| id | 範囲 | 完了基準 | 状況 |
|---|---|---|---|
| S1 | プール本体:ノート、2 入力 2 出力の証明済みバンドル、深さ 32 の Poseidon2 コミットメントツリーとナリファイアセット、ローカルの証明者を備えた rand ウォレット、秘匿化された RPC | ウォレット間のシールド転送、2 つのバリデータ間の二重支払い競合、バンドルで支払うデプロイと呼び出しが、いずれもクラスタのテストスイートに合格する | 完了。 chain 6(2026-09-12)から公開フリートで稼働中 |
| S3 | ノートとしてのブリッジ:ブリッジされた保有分はレジストリのアセットインデックスを持ち、アテステーションはチェーン自身が計算する 1 つのノートを入金し、BridgeBurn は 2 バンドルからなる唯一のトランザクションです。呼び出し入力用の封印されたエンベロープは、呼び出し元、呼び出しごとの鍵、または指名された監査人が開封できます | ブリッジされたアセットがノートとして発行・使用・焼却される。呼び出し元は、プログラムが何を入力に実行したかを公開せずに開示でき、rand open-call は開封内容を H_IN と照合する | 完了。 最初に反映されました。chain 9 から 13 はジェネシスからブリッジの節を除いており、chain 14 以降はすべて含んでいます。chain 14 以降、焼却は 2 バンドルではなく 1 バンドルです |
| S2 | シールドされたチェーン上のステーキング:公開のバリデータレジスタ、バンドルの焼却分から行う Bond、2 エポックにわたる Unbond、支払先アドレスのノートへ引き出す Withdraw、バリデータセットを再導出する 1,000 ブロックのエポック、レジスタとプールにわたる供給監査 | 5 番目のバリデータが登録・ボンドを行い、次のエポックから提案を行う。1 つのバリデータがセットから Unbond して、支払先ウォレットが使えるノートへ Withdraw する。どちらもクラスタのテストスイートに合格する | 完了。 ウォレットのローカルコミットメントツリーが 2026-09-21 に続きました。ウォレットは自分でウィットネスを計算し、どのリーフを使うかをノードに伝えなくなりました |
| RPL | トークン標準(docs/tokens.md):トークンは台帳内のレジストリエントリで、62 文字の rpl1… bech32m の id を持ちます。作成は RAND での登録手数料を払えば誰でもでき、ミント権限は登録時に none、鍵、ブリッジのいずれかに固定されます。シンボルは一意ではありません。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 トークンを保持し、ジェネシスは zUSD をインデックス 1 に載せています |
| 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 は作成されるセル 1 つにつき 0.01 RAND で、invoke 1 回あたり読み取りは最大 8、書き込みは最大 8、支払いは最大 4 です。Programs を参照 |
| hidden-asset bundle | すべてのトランザクションは、2 入力 2 出力のバンドルの代わりに、ちょうど 1 つの 4 入力 4 出力バンドルを持ちます。スロット 0〜1 は秘匿アセットを保持し(RAND のみの転送ではダミー)、スロット 2〜3 は常に RAND で手数料を支払います。2 バンドルのトークン転送と 2 バンドルのブリッジ焼却は廃止されました | RAND の転送と任意の RPL トークンの転送が同一の形で公開され、移動したアセットが秘匿される | chain 14(v0.5)から稼働中。 Tier 14 で、証明に約 100 秒、証明サイズは chain 14 と 15 で約 1.42 MB です。そこでの hc_bundle は 83d3a370… です。chain 18 から 20 はバンドルゲスト v3、hc_bundle 60af094a…、約 1.49 MB に固定しています |
| transaction binding | すべてのバンドル証明は、公開入力セグメントに載せた 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:バックingごとの 1 日あたりのミント上限と、停止のみができる停止鍵(停止の解除には PQ クォーラムが必要)。B2:親より 60 秒を超えて先のブロックタイムスタンプは無効で、バリデータは自身の時計より 15 秒を超えて先のブロックには投票しないため、バリデータには NTP が必要です。B3:すべてのミントに対する Dilithium2 の共同署名クォーラム。B4:ジェネシス後にブリッジされたトークンやバッキングを PQ ガーディアンクォーラムの下で上場でき、チェーンの切り直しは不要です | 7 つのバッキング(Ethereum、Binance Smart Chain、Tron、Solana 上の USDT と USDC)を持つ 1 つのトークンである zUSD が、トランザクションによって登録され、total_supply == Σ backings.locked が構造上成り立つ。ローカルの 9 フェーズのゲート(zusd_e2e.rs:バリデータ 4 つ、実際の証明、フォーセットから登録、入金、転送、焼却、監査まで)は 9 件中 9 件に合格した | chain 14(v0.5)から稼働中。 chain 20 では、ミント上限はバッキングごとに 1 日 100,000 zUSD に加えて全体で 24 時間のローリングあたり 4,000 zUSD(ブリッジルール v2)、ガーディアンセット 1 は PQ ガーディアン 8 名、ミントと焼却のそれぞれに zUSD で 10 bps の手数料(bridge.fees)、ガーディアンのローテーションは鍵の保持を要し 86,400 秒待機します(bridge.rotation)。zUSD は chain 20 のジェネシスに、7 つのバッキングと切り出し時点でロックされていた 99 zUSD とともに載っています |
| audit v3 | 共同創業者が主導した第 3 回内部監査ラウンドの修正(2026-09-19。独立した監査は実施されていません)。POOL-1:フォーセットの Mint はノートのオープニング(pk、time、r)を持ち、受理時にコミットメントを再計算し、ミンターは rand-mint-2 に署名します。ジェネシスの alloc ノートもオープニングを持ちます。RPC-1:rand_getWitness(es) は同時に最大 2 回までしかツリーを再構築せず、10 秒後に -32000 busy を返します。OPS-1:18 個のバリデータ鍵をすべてローテーションし、リポジトリ外で生成し、リポジトリには鍵を一切追跡させていません | コミットメントが金額を超える値にオープンされるミントは拒否される。chain 14 の鍵がリポジトリに入ったことは一度もない | chain 14(v0.5)から稼働中。 PRIV-1、すなわちリーフを名指しするウィットネスのリクエストは、2026-09-21 にウォレット自身のツリーによって解消されました |
v0.5 以降のリリース
すべてのリリースは git タグであり、fullnode の CHANGELOG.md にエントリがあります。コンセンサス、ワイヤフォーマット、検証鍵のいずれかを変更するリリースは新しいチェーンとともに出荷され、それ以外は稼働中のチェーンに 1 ノードずつ順次反映されます。
| リリース | 内容 | チェーン |
|---|---|---|
| v0.5 〜 v0.5.8 | RPL トークン、zUSD、強化されたブリッジ(前述)。監査での修正、履歴のプルーニング、コンセンサスと同期の強化 | 14, 15 |
| v0.5.9 | 再スキャンの修正:faucet はジェネシスのバリデータからのみミントする、同期のバックオフ、ゴシップの事前チェック | 15 |
| v0.5.10 | アドレスの共有:フィンガープリント、randpay: リンク、QR コード。暗号化メモ(チェーン 18 で初めて有効化) | 15 |
| v0.5.11 | チーム、投資家、パートナー向け配分のタイムロック付きジェネシス・ベスティング。ジェネシスで有効化する方式で、どのチェーンでも有効ではありません | なし |
| v0.6 | 9 月のレビューを受けた zkVM、rVM、アグリゲーションの修正 | 15 |
| v0.6.1 | 制約セット 7:LogUp のブラインディング、2⁷ のテーブル下限、32 ビットのレンジチェック、POSEIDON2_LEN、JALR の修正。チェーン 16 は hardening_v6 とバンドルゲスト v2 で切り出されました | 16 |
| v0.6.2 | 委任証明、フェーズ 1:rand-prover バイナリとウォレットの --prover。フェーズ 1 の証明者は花費鍵を受け取ります | 16 |
| v0.6.3, v0.6.4 | 委任証明、フェーズ 2:認可の分割。バンドル証明は花費鍵を取らなくなり、代わりにティア 10 の認可証明が取ります。トランザクション ID のドメインは rand-txid-3 になります | 17 |
| v0.6.6, v0.6.7-rc1 | ガス:制約セット 8、証明ごとに宣言するガス上限、動的なガス価格とバイト価格。メモの有効化。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 ブロックの証明ウィンドウ、ガス価格の上限と有償バイト負荷、投票による参加承認、ステーク参入上限の割合指定、ブリッジのローテーションにおける保有証明と遅延。チェーン 20 で送金するには、このビルドがウォレットに必要です | 20 |
現時点での限界
ホワイトペーパーからの逸脱を、ぼかさずに記します。それぞれ、解消するマイルストーンとともに、該当クレートのドキュメントで追跡されています。
hcは束縛性を持ちますが、秘匿性は持ちません。ソルトを含まないため、推測したプログラムを確認でき、同一プログラムの 2 つのデプロイを関連付けられます。M3.4 が取り除いたのは、検証者がプログラム全体を平文で保持することです。- 2026-09-21 より前にビルドされたウォレットは、ノードにウィットネスを要求します。ウィットネスの要求には、これから花費するリーフが示されます。現行の
randはツリーの写しを自前で保持するため、要求しません。ノードは古いウォレット向けに、引き続きrand_getWitnessを提供します。 - 入金は境界で公開されます。faucet のミント、ジェネシスのノート、ブリッジの入金はいずれも金額を平文で含みます(チェーン 14 以降、ミントとジェネシスのノートはオープニングも含むため、所有者の鍵も公開されます)。これは、透明からシールドへの入金がどこでも持つ、1 ホップの可視性と同じです。
- ゼロ知識性は完全ではなく、統計的です。これは Plonky3 0.7 の hiding FRI が実際に提供する性質であり、クレートもそう明記しています。
- トランスクリプトのハッシュは、論文の SHA3-384 / BLAKE3-384 ではなく、開発用のラウンド定数を持つ Poseidon2 です。書き直しではなく、設定の差し替えで済みます。
- FRI のクエリ数が 80 の場合、バンドル証明はチェーン 14 と 15 で約 1.42 MB でした(チェーン 13 までは約 1.3 MB)。チェーン 17 以降、1 件の送金が運ぶ証明は約 2.85 MB で、内訳はバンドル証明が約 1.49 MB、認可証明が約 1.37 MB です。ブロックが 4 MiB、証明の上限が 2 MiB というデフォルトのチェーンでは、Keccak を含む証明は証明の上限をそのまま超えます。チェーン 20 のジェネシスはブロックを 20 MiB、証明の上限を 4 MiB に設定しています(チェーン 13 〜 16 は 8 MiB)。
- コール証明のヘッダは秘匿されません。ティアと、Keccak および SHA-256 のテーブルの高さを宣言するため、コールがハッシュを行ったかどうかが分かります。v0.6 の証明者の下限以前にチェーン 15 でコミットされたコールは、さらに多くを露出していました。2⁷ 行未満の非公開テーブルを、証明から読み出せたのです。v0.6 の証明者の下限が新規のコールについてこれを塞ぎ、制約セット 7 と
hardening_v6により、チェーン 16 以降はチェーンのルールになりました。 - コールはティア 14 までに制限され、Keccak は最大 2¹² 行(128 回の置換)、SHA-256 は最大 2¹³ 行(128 回の圧縮)です。また
hardening_v6では、8,180 ワードを超えるプログラムはデプロイできません。EVM と sBPF のインタプリタ用ゲスト、および変換済みの ERC-20 と SPL Token のイメージは、いずれもこれを超えています。 - ウィットネスを持つ者にはすべてが見えます。ZK が守るのは検証者の視点であり、証明者の視点ではありません。チェーン 17 以降、ウォレットは花費鍵を渡さずに、ペアリングした
rand-proverへバンドル証明を委任できますが、その証明者は引き続き閲覧鍵を保持し、ノートを見ることができます。CUDA バックエンドは 2026-09-28 に初めて実機で動作しましたが、本番環境での計測はまだありません。
リポジトリの構成
フルノードの Cargo ワークスペースを、その README と crates/ ディレクトリに沿って示します。
| パス | 内容 |
|---|---|
crates/randprotocol-core/ | I/O を持たない純粋なロジック:暗号、ノートとコミットメントツリー、台帳のルール、ガス、ジェネシス、HotStuff のステートマシン |
crates/randprotocol-zkvm/ | Rand zkVM。制約セット 8 の時点で zkp-circuits/research からベンダリングしたもの(circuits aeacf31、deploy/sync-zkvm.sh で再同期)。加えて、チェーン側の証明検証器とその検証鍵キャッシュ |
crates/randprotocol-rvm/ | 再帰 VM。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/ | テストネットのジェネシスファイル、nodes.env、実行スクリプト、クラウドのプロビジョニング、切り替えと再構築のスクリプト。チェーン 14 の準備以降、鍵は一切追跡されていません |
docs/ | リファレンスドキュメントと設計仕様 |
scripts/ | ローカルの 2 バリデータ構成のテストネット |
仕様にあるが、まだ出荷されていないもの
以下のコンポーネントは、論文またはフルノードのドキュメントに記載されていますが、稼働していません。リポジトリに存在しないか、構築済みでもどのチェーンでも有効化されていないかのいずれかです。仕様とコードの差が、推測ではなく明確に分かるよう、ここに挙げます。
| コンポーネント | 状況 |
|---|---|
| ブリッジ · ガーディアン | アテステーション形式をエンドツーエンドで動かすガーディアンとリレイヤーのデーモン。コントラクト、コーデック、フルノードの受信側は出荷済みですが、デーモンは出荷されていません |
| フルノード · アグリゲーション | 再帰 VM によるブロックのアグリゲーション:封印、プルーニング、封印形式での同期。構築済みですが、どのチェーンでも無効です。rand-node は aggregation セクションを持つジェネシスを拒否します。偽造アグリゲートに対するエンドツーエンドの検証がまだ必要で、取り除かれるのはバンドル証明のみであり、認可証明は残ります。本番の rVM 証明には大型のマシンが必要です:制約セット 7 では、2 件のアグリゲートで 133 GB、3 件で 221 GB、終了証明では 256 GB 超を要しました(2026-09-28 と 29 に計測。制約セット 8 では再計測していません) |
| フルノード · ベスティング | チーム、投資家、パートナー向けのタイムロック付きジェネシス配分(v0.5.11、docs/vesting.md)。ジェネシスで有効化する方式です。vesting セクションがなければ 4 つのベスティングアクションは拒否され、それを持つチェーンは存在しません。チェーン 20 の供給量監査では、ベスティングのカウンタはすべてゼロと報告されます。v0.6.8 以降、取り消し可能なエントリは、取り消し権者の閾値により、ジェネシスのエントリが指定するトレジャリーに対してのみ取り消されます |
| フルノード · スラッシング | リーダーの二重提案に対するスラッシングとジェイルは v0.6.8 で構築され、staking.slashing の背後にあり、チェーン 20 では無効です(そのジェネシスには設定がなく、26 個のバリデータ鍵はすべて 1 つのオペレーターに属しています)。ブロック報酬、ハッシュ・ソートィションによるリーダービーコン、ナリファイアのアキュムレータ、プログラム間コールは構築されていません。プログラムごとの永続的な状態は RPL-2 として出荷されました(前述) |
prover/ | GPU 証明デーモン:キューからバッチを取得し、提出を競います。CUDA カーネルは zkp-circuits にあり、2026-09-28 に NVIDIA H100 で初めて動作しました。マーケットのデーモンは存在しません。出荷済みの rand-prover は、ペアリングしたウォレットのために証明を行うもので、マーケットではありません |
| zkp-circuits · M4.4 終了証明 | SPL Token 送金(ティア 20)の証明で、約 330 GB と外挿されています。ERC-20 送金(ティア 18)は、2026-09-19 に 128 GB のドロップレットで証明されました。コールをティア 14 までに制限するチェーン 20 では、どちらも呼び出せません |
ビルドとテスト
標準的な Rust のワークフローを各リポジトリで使います。fullnode は、ツールチェーンを固定した 1 つの Cargo ワークスペースで、実際のノードを TCP 上で起動するクラスターテストスイートを備えています。ビルドには、circuits リポジトリを circuits という名前のディレクトリとして隣にチェックアウトしておく必要があり、そのコミットは、vendored クレートの同期元のもの(v0.6.7 と v0.6.8 では aeacf31)です。zkVM は zkp-circuits 内の独立したクレートで、独自のツールチェーン固定を持ち、機密コールが何を明らかにし何を明らかにしないかを説明するデモが付属しています。
fullnode:
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
zkp-circuits/research 内のリサーチ用 zkVM:
# 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 のマシンで計測した fullnode スイートの内訳は次のとおりです。core 521 テスト、node 373、client 117、cheating-prover スイート 116、hidden-bundle の不正テスト 21(75 分)、ウォレットフロー 6(53 分)、クラスター 26(44 分)、zUSD のエンドツーエンドゲート 2(51 分)です。再帰 VM の本番証明はこの範囲外で、上記に記載したメモリが必要です。
Running a node では、このビルドで公開 testnet に参加する方法を説明しています。testnet の genesis、ブートストラップピア、実行スクリプトは fullnode の deploy/ ディレクトリに含まれており、download page に要点をまとめています。
貢献する
fullnode のライセンスは GNU General Public License v3.0(GPL-3.0-only)です。以前は Apache-2.0 でした。バグや設計提案は、変更が関わるリポジトリで issue を立ててください。プルリクエストを歓迎します。提出前に cargo fmt && cargo clippy を実行し、変更の範囲は絞ってください。まずは fullnode issues をご覧ください。
アーキテクチャ、プライバシー回路、手数料トークンの証明、ポスト量子のトレードオフは、いずれも papers page にあるホワイトペーパーに記載されています。fullnode リポジトリ自体の docs/ ディレクトリは、このドキュメントの各ページの照合元となる情報源です。