Rand ノードを運用する
リファレンス実装のフルノードとそのウォレットは Rust で書かれており、ソースからビルドできます。生成されるバイナリは 2 つです。ノードとオペレーター用ツールである rand-node と、シールドされた支払い鍵を保持し、JSON-RPC で任意のノードと通信し、送金のたびに、また機密コールのたびに zkVM プルーバーをローカルで実行するウォレット rand です。実験的なテストネットであるチェーン 21 は、DigitalOcean の droplet 上の 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. このマシン上の 2 バリデーターのチェーン(RPC は 8545 と 8546)
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status
# 4. テスト。デバッグビルドでは STARK の証明が遅いためリリースビルドで実行します(678 件のテスト、2026-09-14 の計測で約 43 分)
cargo test --workspace --release
# リリース v0.8.0 (c0878c3f) は chain 21 を稼働させます。これより前のリリースでは動作しません。chain 21 は制約セット 9 を使用し、その verifier キーと証明のエンコーディングは、それ以前のどのリリースにも含まれていないためです。タグからビルドするか、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# 固定された multisig の verifier キー: 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 を 1 つのファイルにまとめたものです。ご自身で生成してください
# チェックアウトの外に保管してください。リポジトリは鍵を一切管理しなくなりました
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
# faucet のミントはバリデータが署名するため、バリデータの RPC が必要です。ローカルの
# バリデータ 2 台のチェーンではそのまま動作します。オブザーバは「ask a validator node」と応答します。chain 21 では
# faucet は、ジェネシスの許可リストにある 16 個のウォレットにのみ、かつ指定されたバリデータからのみミントします
rand faucet # あなただけが開けられる note に 100 RAND を入れます
rand balance # あなたの鍵でツリーをスキャンします。他の誰にもできません
rand send <rand1 address> 1.5 # 確認を求め、証明を生成 (約 2 分) し、コミットを待ちます
# 組み込みのゲストをアセンブルする: 4 つのプライベート残高で足りる場合に、1000 を超える余剰分を支払う
rand program build --guest private_payment --arg 1000 --out pp.json
rand program deploy pp.json # プログラム ID(そのコンテンツハッシュ)を出力します
# ローカルで証明する。チェーンに載るのは証明、8 つの出力ワード、封印された入力トランスクリプトのみです
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
動作要件
- OS
- 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 のみ: シールド送金はノート PC で約 2 分(7 秒の承認証明と約 110 秒のバンドル証明)かかり、メモリを約 6 GB 使用します。小さなコールでは約 30 秒が加わります
役割を選ぶ
- オブザーバー 誰でも参加可能
--validator を付けない同じバイナリです。チェーンを同期し、すべての証明書とすべてのバンドル証明およびコール証明を検証し、すべてのブロックを再実行してレシートを比較し、JSON-RPC を提供します。公開テストネットでは、新しい鍵はこの役割で動かします。
- バリデーター ボンド済み
chained HotStuff のもとで投票と提案を行います。chain 21 では chain 20 と同様に、新しいバリデータはまず投票によって承認されます。ステークの 3 分の 2 超を保有するバリデータが、その鍵に対する AdmitValidator アクションに署名します。その後、ノード鍵を登録し (rand-node register --v2)、ウォレットから 1,000 RAND 以上をボンドし、ボンドの後の 3 回目の 1,000 ブロックのエポック境界でセットに加わります (chain 18 の 2 エポックのボンド遅延)。chain 18 は 1 つあたり 1,000 RAND の 26 バリデータで開始しました。コミットするには、ステークの 3 分の 2 超、つまり 26 のうち 18 がオンラインで投票している必要があります。ご自身の鍵を生成してください。バリデータ鍵はリポジトリにもう保管されておらず、以前のチェーン向けにコミットされた鍵ファイルは公開されたシードです。
- ウォレットとプルーバー ローカル
rand クライアントは 256 ビットの支払い鍵を保持し、署名は一切行いません。承認となるのは 2 つの証明、すなわち支払い鍵で作る小さな証明と、4 入力 4 出力のバンドル証明です。ツリーをスキャンして自分のノートを見つけ、両方の証明をお使いのマシン上で生成します。これは RAND でも任意の RPL トークンでも同じ形で、機密コールではプログラムの証明も生成します。チェーンに届くのは、証明、コミットメント、ナリファイア、封印されたエンベロープだけです。
ノードを運用しない場合でも、同じウォレットを iOS、Android、Chrome、Firefox 向けのアプリとして利用できます。ウォレット。
すべてのノードがすべてを検証する
同期するノードは、受け入れる前に、すべての証明書を再検証し、証明を含むすべてのブロックを再実行し、レシートを比較します。起動時には自身のデータベースを検査し、投票の安全性に関する状態を保ったまま不整合な部分を切り捨て、欠けた範囲をピアから再取得します。
# ノード停止中: ハッシュ、QC、署名、証明、リプレイ
rand-node verify --datadir ./data --mode full
rand-node verify --datadir ./data --repair
障害テストはライブのテストネットで実行します
- ›4 台のバリデーターのうち 1 台を停止します。チェーンはコミットを続け、そのノードは復帰すると数秒で追いつきます。
- ›4 台のうち 2 台を停止します。クォーラムを欠くためチェーンは停止し、復帰するとフォークなしで再開します。
- ›ノードのデータベースを破損させます。起動時に検出され、切り捨てられ、ピアから再同期され、その後はバイト単位で一致します。
- ›異なるノードを経由した送金: すべてコミットされ、残高はどこでも同一で、供給量は変わりません。
- ›切断されたピア接続は、再接続ロジックにより約 30 秒以内に再確立されます。
未実装
論文とノードの間にある差を、推測ではなく一目で分かるようにするために記載しています。
- ›プログラムごとの永続的な状態と、プログラム間のコール
- ›ウォレット自体に組み込まれたコンパイラ:プログラムは、組み込みのアセンブル済みゲスト、または別途用意された rand-guest ツールチェーンでビルドしたイメージのいずれかです
- ›スラッシングとジェイリング、ブロック報酬、手数料市場、ハッシュソーティションによるリーダービーコン
- ›ナリファイアアキュムレータ、ファイナリティ後の証明のプルーニング、証明のバッチ処理
- ›SPL Token 転送のティア20の証明、および論文に記載された GPU プロ―バー市場