Rand Protocol
ドキュメント
はじめに

はじめに

Rand Protocol とは何か、現在 public testnet で何が稼働しているか、そしてそれを使って開発するために RAND を入手する方法を説明します。

このページでは、何を対象に開発を始めるか、どこから着手するかを判断できるように、チェーンのモデルを数段落で、稼働中の testnet のパラメータ、テスト用 RAND の入手方法、そして残りのドキュメントの地図をまとめています。

Rand Protocol とは

Rand は耐量子のシールドチェーンです。ネイティブコインは RAND で、RAND は完全にシールドされたプールの中に存在します。チェーン上にアカウントも残高もなく、あるのはノートコミットメントとヌリファイアだけです。送金とは、4 つのノートが別の 4 つのノートになったことを示すゼロ知識証明であり(未使用のスロットはダミーで埋められます)、どの資産が動いたかは明かされません。RAND と、チェーン独自の規格である RPL のすべてのトークンは、この 1 つのプールを共有します。同じコインが機密プログラムの手数料にも使われます。機密プログラムとは、ゼロ知識仮想マシンの内部でオフチェーン実行される RISC-V プログラムで、入力ではなく証明によってオンチェーンで決済されます。

すべてのプリミティブは、量子コンピュータを持つ攻撃者に対しても耐えられるように選ばれています。

レイヤー稼働するもの
署名Dilithium2(格子ベース)。バリデータはこれでブロックと投票に署名します。faucet、ステーキング操作、ブリッジ登録にも署名が使われます。ウォレットはトランザクションに署名しません。バンドルは自身の証明によって認可されます。
ノートの暗号化ML-KEM-768 による鍵カプセル化と ChaCha20-Poly1305。チェーン上のすべてのノートには、その所有者(と送信者)だけが開けられるエンベロープが付属します。
ハッシュアドレス、トランザクション ID、ステートルート、および証明系の外にあるそれ以外すべてには、ドメイン分離を施した BLAKE3 を使います。ノート、ヌリファイア、コミットメントツリー、および証明の内部にあるすべてには、Goldilocks 体上の Poseidon2 を使います。
証明隠蔽型 FRI(80 クエリ、blowup 8、proof-of-work 20 ビット)を用いた Plonky3 のバッチ STARK。透明性があり、trusted setup もペアリング曲線も不要で、前提となるのは衝突困難なハッシュだけです。
機密計算Rand zkVM。この STARK のもとで証明される RV32IM マシンです。プログラムは回路内ダイジェストで識別され、検証者は命令語を 1 つも目にしません。
コンセンサスChained HotStuff BFT。ステーク加重で 3 分の 2 超のクォーラム、ラウンドロビンのリーダー、連続 3 ビューのコミットルールを採用しています。
ストレージとネットワークノートごとに 1 つの RocksDB(fsync 付きコミットと起動時の整合性チェック)。ネットワークは libp2p(TCP、Noise、Yamux、gossipsub、Kademlia、LAN 上の mDNS)です。

リファレンス実装は Rust 製の randprotocol/fullnode です。rand-node バイナリがノート、rand バイナリがウォレットで、JSON-RPC メソッドには rand_ の接頭辞が付きます。エクスプローラーは randscan.org です。

testnet: チェーン 20

公開フリートはチェーン 20 を稼働させています。2026-10-01 06:17 UTC に fullnode v0.6.8 で稼働を開始しました。チェーン 15 から 19 は廃止されています。4 日間で 4 つのチェーンが切られましたが、いずれもすべての証明またはトランザクション形式を変える変更のためでした。

  • チェーン 16(2026-09-28、fullnode v0.6.1)は、zkVM を制約セット 7 に移行しました。これにより、小さな秘密入力について証明がこれまで明かしていた情報が秘匿されます。あわせて hardening_v6 ルールを有効にしました。
  • チェーン 17(2026-09-29、v0.6.3)は、送金の認可を証明から切り離しました。すべてのバンドルが、支払い鍵で作成される 2 つ目の小さな証明を持つため、大きな証明は閲覧鍵だけを持つマシンでも作成できます。
  • チェーン 18(2026-09-29、v0.6.7)は、機密呼び出しをガスで計量し(制約セット 8)、すべてのノートエンベロープで暗号化メモを有効にしました。
  • チェーン 20(2026-10-01、v0.6.8)は、すべての証明と署名付きメッセージをジェネシスハッシュに結び付け、プログラムの状態(RPL-2)を追加し、zUSD のブリッジのミントとバーンに手数料を課し、下の表に挙げた audit-v6 ルールを有効にします。

チェーン 19(2026-10-01 03:43 UTC、v0.6.7)は、同じビルドでのチェーン 18 の再ジェネシスであり、ルールは何も変えていません。チェーン 18 は高さ 143,776 で停止され、チェーン 19 は高さ 141,935 のスナップショットから切られました。そのジェネシスがチェーン 18 と異なっていたのは、チェーン ID、タイムスタンプ、引き継がれたノート、ブリッジセクションだけです。ブリッジセクションでは、Ethereum、Binance Smart Chain、Tron の各エンドポイントに新しいエミッタが設定され、シーケンスカウンタが引き継がれました。

チェーン 20 はチェーン 19 のハードフォークです。そのジェネシスは高さ 7,258 のチェーン 19 のスナップショットから切られ、チェーン 19 は高さ 7,700 で停止され、26 台のバリデータすべてが、同じ鍵、ピア ID、ブートストラップノードのまま、まとめてチェーン 20 で再起動されました。チェーン 19 とチェーン 18 は廃止されています。チェーン 20 で送金するには、ウォレット v0.6.8 が必要です。古いウォレットの証明と署名にはジェネシスへの結び付けが含まれないため、チェーンはそれらを拒否します。

各チェーンは新しいチェーンです。次のジェネシスに引き継がれたのは、オペレーターのウォレットにある RAND の残高と流通中の zUSD だけで、それ以外は何も引き継がれていません。あるチェーンにデプロイしたプログラムは、次のチェーンには存在しません。これは実験的なソフトウェアであり、監査を受けておらず、その上の RAND に価値はありません。

チェーン 20 上のプログラムは状態を保持できます。RPL-2 のプログラムセル、プログラムボールト、Invoke アクションが稼働しています。

チェーン ID20 (rand_chainId)
ジェネシスハッシュ6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135
ジェネシスファイルfullnode リポジトリの deploy/genesis-chain20.json
ビルドfullnode v0.6.8 (タグ c9c9bd3c)。ノードは rand_getVersion で自身のビルドを報告します。このビルドはチェーン 14〜17 を拒否し、v0.6.8 より古いウォレットはチェーン 20 で送金できません
ジェネシスバインディングbinding_domain 1: すべてのバンドルの証明バインディングと署名済みアクションメッセージにジェネシスハッシュが含まれるため、あるチェーン向けに証明または署名されたものが別のチェーンで検証を通ることはありません
testnet マーカーtestnet true: ジェネシスが自らをテストネットワークと宣言しており、これによりブリッジと並んでフォーセットを稼働できます
バリデータ26。それぞれステーキング最小額の 1,000 RAND をステークしています
クォーラム26 のうち 18: ステークの 3 分の 2 を厳密に超える割合
ブロック間隔デフォルトの --block-interval-ms 1000。約 1 秒に 1 ブロック
ブロック時刻親ブロックより 60 秒を超えて先のタイムスタンプは無効で、バリデータは自身のクロックより 15 秒を超えて先のブロックには投票しません。そのためバリデータは NTP を実行します
証明ウィンドウproof_window_blocks 1,024: バンドルのアンカーは直近 1,024 個のブロック終端ルートのいずれかでなければならず、その time もそれより古くてはなりません (チェーン 18 と 19 では 256 ブロック)
エポック1,000 ブロック。新しいボンドは有効になるまでさらに 2 エポック待ちます (bond_activation_epochs 2、エポック e + 3 で有効化)。アンボンドされたステークは 2 エポック後に解放されます
ステーキング登録は v2 (rand-node register --v2) で、新しい鍵は、重みの 3 分の 2 を超えるステークを持つバリデータが投票で承認した後にのみ登録されます (admission_by_vote)。1 つのバリデータの重みの上限は 33.33 %。エポック境界で新たに入るステークは、アクティブな重みの 25 % が上限です (max_stake_entry_bps_per_epoch 2,500)。スラッシングはありません
zkVM制約セット 8、本番用 FRI プロファイル (80 クエリ)
バンドルゲストhc_bundle 60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce: 4 入力 4 出力の隠蔽アセットバンドル、バージョン 3、tier 14
認可ゲストhc_auth 1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1: すべてのバンドルが持つ支払い認可、tier 10
ガスコールは回路が強制するガス上限を宣言し、その対価として gas_price を支払います。下限ではガス 1 あたり 100 ユニット、1 KiB あたり 800 ユニットで、どちらもブロックごとに、262,144 ガスと 10,485,760 バイトの目標に向けて変動し、ガス 1 あたり 10,000、1 KiB あたり 80,000 の上限を超えることはありません。バイト負荷に数えられるのは、バイト単価が課されるバイト (コールの証明と入力エンベロープ) だけであるため (byte_load: "paying")、送金のみのブロックでは上昇しません。すべてのバンドルは固定上限 20,479 を宣言し、定額の 0.001 RAND を支払います
プログラム状態RPL-2 オン: プログラムセル、プログラムボールト、Invoke (Action 33)。作成されるセルは 0.01 RAND (cell_fee 10,000,000 ユニット)。1 回の invoke で読み取れるセルは最大 8、書き込めるセルは最大 8、ペイアウトは最大 4 回です (rand_getLimits.program_state)
ノートエンベロープenvelope_bytes 1860: すべてのノートのエンベロープは 1,860 バイトで、暗号化されたメモを含みます
プログラム上限max_program_words 65,535。ただし hardening_v6 では、どの tier-14 コールも保持できないデプロイは拒否されます (ProgramUncallable): パブリックセグメントを持たないプログラムでは 8,180 ワードです
証明上限max_proof_bytes 4,194,304 (4 MiB)。チェーン 13〜16 では 8 MiB でした
ブロック上限max_block_bytes 20,971,520 (20 MiB)
コールエンベロープ上限max_call_envelope_bytes 65,536
プログラムごとのパブリック入力max_program_public_words 32,768、デプロイ時に固定
フォーセットオン。ただしジェネシスの許可リストにある 16 個のウォレット (staking.faucet_recipients) に対してのみ、またジェネシスがミンターとして指定する 18 のバリデータ (staking.faucet_minters) からのみ有効です。1 コールあたり最大 100 RAND、1 エポックあたり合計 10,000 RAND
機密計算オン。コールの証明は tier 14 が上限です。プログラムはチェーンの切り替えをまたいで引き継がれません。各プログラムがどのチェーンにデプロイされているかはサンプルプログラムに記載しています
トークンRPL レジストリはオン: 登録手数料は 1 RAND (バーン)。トークン数は最大 4,096。すべてのノート値は 2⁶³ 未満。zUSD はジェネシスのインデックス 1 に登録されています
ブリッジオン: ガーディアンセット 1 (ガーディアン 8 名)、8 名の Dilithium2 PQ ガーディアン、一時停止鍵、4 つのソースチェーンのエミッター、バッキングごとに 1 日あたり 100,000 zUSD のミント上限、およびすべてのバッキング合計で 24 時間のローリング期間あたり 4,000 zUSD のグローバル上限。zUSD には 7 つのバッキングがあり、その供給量はロックされている分で、rand_getTokenSupply からライブで読み取れます。チェーン 20 以降、各ミントと各バーンに 10 bps の手数料が zUSD で徴収され、財務アドレス宛のノートとして支払われます (bridge.fees): デposit はグロス額から手数料を引いた額をクレジットし、バーンはソースチェーンで amount − fee を解放します。PQ ガーディアンまたは一時停止鍵のローテーションには新しい各鍵自身の署名が付き、受理から 86,400 秒後に有効になります (bridge.rotation)
履歴24 のバリデータが 24 時間分のブロックを保持し (--prune-history 24h)、それより前については -32010 を返します。2 つのアーカイブノードはすべてのブロックを保持し、パブリック RPC https://rpc.randprotocol.org はアーカイブに転送します
ブロックアグリゲーションオフ (ジェネシスに aggregation セクションがありません。それを持つジェネシスではビルドが起動を拒否します)
ジェネシス値バリデータレジスタにステークされた 26,000 RAND に加え、チェーン 19 上のオペレーターのウォレットから引き継いだ、合計 5,184.243719258 RAND の 7 つのデposit ノート: フォーセットのミント前で 31,184.243719258 RAND (rand_getSupply は genesis_staked と genesis_deposited を報告します)。さらに、合計 99 zUSD の 2 つのジェネシスノートがあり、これはバッキングにロックされた 99 zUSD と一致します

ブートストラップノード (deploy/nodes.env):

/ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe
/ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw
/ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ

チェーン 20 は、チェーン 14〜19 が使用したバリデータ鍵で動作しているため、これらのピア ID はチェーン 14 の鍵ローテーション以降変わっていません。

エクスプローラー randscan.org はチェーン 20 をインデックスし、https://randscan.org/api/v1 で REST API を提供しています (Explorer API)。フルノードの JSON-RPC はデフォルトで 127.0.0.1:8545 にバインドされます。ノードを自分で運用する (Running a node)、信頼できるノードを使う、またはパブリックエンドポイント https://rpc.randprotocol.org (rand --rpc https://rpc.randprotocol.org …) を使うことができます。パブリックエンドポイントは、最初の同期やトランザクションの送信を含め、ウォレットに必要なすべてを提供しますが、アドレスごとに 1 分あたり読み取り 1,200 回、送信 6 回という制限があります。フォーセットは提供しません。

フォーセットから RAND を入手する

フォーセットはトランザクションの一種です。バリデータが公開された額の 1 つのノートをシールドアドレスにミントし、そのノートはアドレスの保有者にしか開けません。チェーン 20 では、ジェネシスの許可リストにある 16 個のアドレスにのみ支払われます。それ以外のアドレスへのミントは the faucet may not mint to this recipient (not in staking.faucet_recipients) で拒否されるため、許可リストにないウォレットは、誰かから送ってもらうことでテスト用 RAND を入手します。以下の 3 つの方法はいずれも、バリデータノードにミントを依頼します。オブザーバーは faucet mints are signed by validators; ask a validator node と応答し、パブリック RPC エンドポイントは rand_mint をまったく転送しません。

バリデータの RPC を指定した rand ウォレットを使う場合:

rand keygen                    # writes wallet.key.json; refuses to overwrite
rand address                   # the rand1… address on stdout (about 1,665 characters), its fingerprint on stderr
rand faucet                    # an allowlisted wallet: 100 RAND into a note only it can open
rand balance                   # scans the tree with this key; prints 100 RAND

rand faucet [ADDRESS] --amount <RAND> は、別のアドレスへ、またはより少ない額をミントします。100 RAND がデフォルトであり、1 コールあたりの上限でもあります。JSON-RPC では、同じリクエストは rand_mint です:

curl -s http://127.0.0.1:8545 -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"rand_mint","params":["rand1…", "100000000000"]}'

結果はミントトランザクションのハッシュです。rand_getTransaction がブロックを返すまでポーリングしてください。金額はユニットの文字列で、1 RAND は 10⁹ ユニットです。ウォレットアプリにも、ワンタップで使える同じフォーセットがあります。送金には、チェーン 20 向けの最初のリリースである Rand Wallet v0.6.8 以降を使ってください。このサイトのフォーセットページでは、devnet の付与に対するウェイトリストのリクエストを受け付けています。

ミントの金額はチェーン上で公開されます。これは、透明から シールドへのあらゆるデposit に共通する、1 ホップの可視性です。その後そのノートが誰にとってどれだけの価値を持つかは、他のすべてのノートと同様に秘匿されます。

次のステップ

fullnode リポジトリ自身の docs/ ディレクトリが、これらのページを照合する際の基準となるソースであり、論文には暗号技術の背景が記されています。

fullnode のコミット c0878c3f(チェーン 21)に対して 2026-10-12 に最終確認しました。