このページは、マシンを用意する前にサイズを見積もるためのものです。バリデータは軽量です。証明はそうではありません。証明のメモリはティアが上がるにつれて急激に増え、そのマシンで処理を完了できるかどうかは、この数値で決まります。ここに挙げた数値はすべて、testnet またはフルノードの記録による実測値です。確定していない数値にはその旨を記しています。
各ロールの役割
| ロール | 役割 | 実行コマンド | 証明を行うか |
|---|---|---|---|
| バリデータ | トランザクションを順序付け、すべてのブロックのすべての証明を検証し、HotStuff で投票する | rand-node run --validator | いいえ |
| オブザーバ | 同期し、すべての証明を再検証し、JSON-RPC を提供する。投票はしない | rand-node run | いいえ |
| プルーバ(ウォレット) | 自身のバンドルと呼び出しをローカルで証明してから送信する | rand send, rand call, rand program deploy | はい、すべてのトランザクションで |
| 委任プルーバ | ペアリングされたウォレットのバンドル証明を生成する。chain 20 では、そのウォレットの閲覧鍵が送られ、支出鍵は送られない | rand-prover run、または rand-node run --prover | はい、バンドル証明のみ |
| アグリゲータ | シーリングブロックのために、バンドル証明のウィンドウ全体に対する再帰証明を 1 つ生成する | rand-node aggregate --watch | はい、最大規模の証明 |
| ビルドホスト | rand-node と rand をコンパイルし、バイナリを小規模なノードに配布する | cargo build --release | いいえ |
バリデータとオブザーバは証明を行いません。シールドされた送金や呼び出しは、それを送信するウォレットが証明します。バンドル証明のみであれば、そのウォレットがペアリングされたプルーバが証明します(ノードの運用)。現時点では、フリートのバリデータは何も証明していません。
ブロックアグリゲーションは実装済みですが、有効になっていません。ジェネシスに aggregation セクションが必要です。chain 20 にはこのセクションがありません。chain 9 から 19 と同様、アグリゲーションは無効であり、このセクションを含むジェネシスではビルドは起動を拒否します。
サイズの目安
| ロール | RAM | CPU | ディスク |
|---|---|---|---|
| バリデータまたはオブザーバ | 2 GB(当初のフリート)。バリデータには同期された時計も必要です(時計) | 1 vCPU(当初のフリートの大半) | --prune-history 24h を指定した場合、約 1 日分のブロック。chain 14 での実測でブロックテーブルは 3.3〜4.4 GB。空きは 4 GB を超えて確保してください(ディスク) |
| アーカイブ(全履歴) | バリデータと同じ | バリデータと同じ | チェーンとともに増加します。chain 14 の 18 署名 QC、1.4 秒ブロックで実測 1 日あたり約 3.6 GB。chain 18 から 20 では QC に最大 26 署名が含まれるためこれより増えますが、再測定はしていません。testnet の 2 つのアーカイブは 250 GiB のボリュームで稼働しています |
| ビルドホスト | 8 GB(ノード E) | 4 vCPU(ノード E) | ソースツリー、target/、および 20 GB 以上の空き |
| プルーバ、シールド送金(ティア 14) | chain 18 の送金でピーク 6.1 GB、支払いバンドルを伴う呼び出しで 6.1〜6.6 GB(2026-09-30) | 1 コア。chain 18 では 2 つの証明があり、ティア 14 のバンドル証明が 102〜134 秒、ティア 10 の認可証明が 7〜23 秒(Apple Silicon のノート PC、2026-09-30)。chain 14 の 4 入力 4 出力の隠しアセットバンドルのみで約 100 秒。chain 13 の 2 入力 2 出力バンドルはノート PC で 92.2〜96.0 秒を実測(本番、2026-09-19) | 小 |
| 委任プルーバ | 同時に実行する証明 1 件につき 5.74 GB、加えて 1 GiB の余裕。利用可能なメモリがこれより少ない場合は起動を拒否します | 証明 1 件につき 1 コア | 小 |
| プルーバ、ティア 18 の呼び出し(ERC-20。v0.5.6 以降チェーン上では拒否されます。証明のメモリを参照) | 85.0 GB(変換済み transfer)/ 85.5 GB(インタプリタ)。m-16vcpu-128gb で実測 | 1 コア | 小 |
| プルーバ、ティア 20 の呼び出し(SPL Token。v0.5.6 以降チェーン上では拒否されます) | 未証明。外挿で約 330 GB となり、DigitalOcean で最大メモリの droplet(m-32vcpu-256gb、256 GB)を上回ります | 1 コア | 小 |
| アグリゲータ、N = 1 | 2026-09-28/29 の実行以前は、少なくとも 64 GB が下限でした。アグリゲータを参照 | 現時点では CPU | バリデータと同じ |
| アグリゲータ、N = 2 / N = 3 | 制約セット 7 で 133 GB / 221 GB を実測(2026-09-28/29) | 本番の N ≥ 2 では GPU ノード | バリデータと同じ |
プルーバは現時点ではシングルスレッドです。 16 vCPU の droplet は 1 コアの 99% で動作しました。コア数を増やしても 1 件の証明は速くなりません。証明が完了するかどうかを決めるのは RAM です。
バリデータとオブザーバ
メモリと CPU
当初の 18 台のバリデータは 2 GB の droplet で稼働しています。証明の検証は軽量です。
| 操作 | コスト |
|---|---|
| バンドル証明の検証、ウォームな検証鍵 | 約 16 ms |
| 新しいシェイプでの最初の検証 | 約 230 ms |
| デプロイ済みプログラムの検証鍵の構築(1 回、バックグラウンド) | 2 vCPU のサーバーで約 7 秒 |
| 集約証明 1 件の検証(アグリゲーション有効時) | コールドで約 0.8 秒、ウォームで約 16 ms(設計値) |
ティア 18 またはティア 20 の呼び出し証明を検証するためにバリデータが必要とするメモリは、現在一部が実測されています。測定は 48 GB の Apple Silicon ノート PC で、各証明を生成した DigitalOcean の droplet とは独立に行いました。ティア 18 の transfer 証明の検証には、ピーク RSS 3.66 GB(変換済み)で 50.2 秒、またはインタプリタで 49.6 秒(RSS は個別に記録していません)かかりました。ティア 16 の approve 証明の検証には 12.2 秒かかりました(RSS は個別に記録していません)。ティア 20 は未測定です。検証できるティア 20 の証明がまだ存在しないためです。v0.5.6 以降、バリデータがそれほど大きな鍵を構築することはありません。呼び出し証明のヘッダは検証鍵を構築する前に検査され、ティア 14 を超える呼び出し(または keccak テーブルが 2^12 を超える、あるいは sha256 テーブルが 2^13 を超える呼び出し)は、受け入れ時にもブロック有効性ルールとしても拒否されます。受け入れ可能な呼び出しヘッダのうち最悪のものでも、検証に 4.7 秒、312 MB でした。
1 vCPU、2 GB の droplet ではバイナリをビルドできません。より大きなマシンでビルドしてコピーしてください(セットアップを参照)。
ディスク
| 項目 | 値 | 出典 |
|---|---|---|
| v0.5.5 以前の、アイドル状態の chain 14 のブロック | blocks に約 60 KB、qcs に約 49 KB。18 署名の Dilithium2 QC が二重に保存され、1.4 秒ブロックで 1 日あたり約 6.6 GB | 2026-09-24 のディスク障害、AGENTS.md |
| v0.5.5 以降の同じブロック | 約 60 KB。コミット済みブロックの QC は、その子の justify に 1 回だけ保存されます。1.4 秒ブロックで 1 日あたり約 3.6 GB | docs/deploy.md、v0.5.5 のロールノート |
| RocksDB の先行書き込みログ | 2026-09-24 の修正以降は 256 MB が上限。それ以前はバリデータ 1 台あたり 13 GB の未パージのログ | AGENTS.md |
--prune-history 24h を完了した後の chain 14 のバリデータ(2026-09-25) | ブロックテーブルは 19 GB から 3.3〜4.4 GB に。ディスク使用率は 18〜37% | AGENTS.md、v0.5.7 |
| ノード A のデータディレクトリ、高さ 62,276 の chain 12 | 約 10 GB | deploy/README.md、v0.3 のロールアウト |
| フルブロックを処理し続けるチェーン | 2 秒ごとに 4 MiB、1 日あたり約 170 GB(chain 12 までのブロック上限。chain 20 は 20 MiB) | docs/block-space.md |
| フリートがビルド用に確保している空き容量 | 20 GB 以上 | docs/block-space.md |
| 3 つのチェーンのデータディレクトリを収めた 30 GB のディスク | 満杯。RocksDB の No space left on device、クラッシュループ | mkc1 と mem1、deploy/README.md |
chain 20 では chain 19 と同様に、26 台のバリデータのうち 24 台が --prune-history 24h で稼働し、約 1 日分のブロックを保持します。台帳そのもの(ノート、ヌリファイア、アンカー、レジスタ)は決してプルーニングされません。アーカイブである obs1 と rand-archive-2(どちらもバリデータを兼ねます)は、このフラグなしで稼働しています。mainnet のノードがこれを渡すことはありません。ノードは、データディレクトリのファイルシステムの空きが --min-free-disk-mb(デフォルトは 1,024 MB)未満の場合、起動を拒否します。また rand_getHealth は、その 4 倍未満になると disk_low を返します。ok を待つロールは、容量が逼迫しているノードで停止します。プルーニング済みのノードが引き続き応答できる内容については、履歴のプルーニングを参照してください。
退役したチェーンのデータディレクトリは、カットオーバーの後に削除してください。データディレクトリはジェネシスハッシュをキーとしており(data-<name>-<hash8>。チェーン 20 は -6210cf07、チェーン 19 は -a3defc93、6 台のガーディアンホストは /var/lib/randnode/data-20 を使用)、古いものは削除するまで残ります。チェーン 20 のカット時には、リージョンのバリデーター 1 台(syd1)が空き 3.9 GB で disk_low のまま起動し、26 台中 25 台のところで開始が止まりました。チェーン 14 から 17 のディレクトリが残っていたためで、これらを削除して 22 GB が空きました。直前のチェーンのディレクトリは、ロールバック先として 1 日残してから削除してください。ブロックが満杯のとき、生のバンドル証明 1 件はチェーン 14 以降で約 1.42 MB です(チェーン 13 までは約 1.3 MB)。チェーン 17 以降は、すべてのバンドルが認可証明も運ぶため、トランスファー 1 件の証明は約 2.85 MB になります。内訳は、バンドル証明が約 1.49 MB、認可証明が約 1.36 MB です(本番プロファイル、2026-09-29 計測)。アグリゲーションが有効になると、封印されたバンドルの証明は約 3 KB まで刈り込まれます。ただし、ノードを --keep-raw-proofs 付きで実行している場合は除きます。認可証明はこの対象に含まれず、フルサイズのまま残ります。
ネットワーク
公開ノードでは TCP 30303 のインバウンドを開けてください。NAT の内側にあるノードは --bootstrap を指定して外向きに接続します。4 MiB のブロックが満杯のとき、バリデーターのリンクは約 2 MB/s を運びます。
クロック
バリデーターには NTP が必要です。チェーン 14 は、実時間がコンセンサスの一部となる最初のチェーンです(ブリッジ強化 B2)。
| ルール | 上限 | 種別 |
|---|---|---|
| ブロックのタイムスタンプは、親ブロックのものからこれ以上先に進んではならない | 60 s(MAX_TIMESTAMP_STEP_MS) | 有効性ルール。このブロックは無効になります(BlockError::TimestampLeap) |
| バリデーターは、自身のクロックよりこれ以上先のタイムスタンプを持つブロックに投票しない | 15 s(MAX_CLOCK_DRIFT_MS) | 投票ルール |
クロックが 20 s 遅れているバリデーターは、何も表示されないまま投票をやめます。正直なブロックがすべて自分のクロックより先にあるように見えるため投票を保留し、どこにも失敗は現れません。チェーン 20 では、何かをコミットするのに 26 台中 18 台の投票が必要です。すべてのバリデーターを確認し、クロックが同期されていない場合は chrony をインストールしてください。
timedatectl # want "System clock synchronized: yes" and "NTP service: active"
chronyc tracking 2>/dev/null || timedatectl show-timesync --all 2>/dev/null
apt-get install -y chrony && systemctl enable --now chrony
同じ 15 s の上限はジェネシスにも適用されます。timestamp_ms はローンチ時刻に近い値にし、決してそれより先にしないでください。15 s を超えて未来のジェネシスは、実時間がそこに達するまでブロック 1 をコミットしません。また、はるか過去のジェネシスではブロック時刻が実時間より遅れ、1 ブロックあたり最大 60 s の速さでしか追いつきません(docs/deploy.md)。オブザーバーは投票しないため、投票ルールの制約を受けません。
テストネットが動作する DigitalOcean のサイズ
| サイズ | RAM、vCPU、ディスク | ノード | 備考 |
|---|---|---|---|
s-1vcpu-2gb | 2 GB、1 | リージョンのバリデーターの大半(ams3、nyc1、nyc2、sfo2 など) | ビルドできないため、バイナリをコピーして配置します |
s-1vcpu-2gb-amd | 2 GB、1 | atl1 | 同上 |
s-2vcpu-2gb-intel | 2 GB、2 | D(ric1) | |
s5-1vcpu-2gb-30gb | 2 GB、1、30 GB | mkc1、mem1(そのリージョンで唯一の小さいサイズ) | チェーン 13 のカットオーバー時にディスクが満杯(29 GB)になりました。消滅したチェーン 11 のデータディレクトリを削除した後で空きは 7 GB です。リサイズが必要です |
| 4 vCPU、8 GB | 8 GB、4 | E(sgp1) | バリデーター、ビルドホスト、エクスプローラー |
この表は、当初の 18 台のバリデーターを対象としています。2026-09-27 以降、バリデーター A もノート PC ではなくドロップレット(sgp1)で動いています。チェーン 15(2026-09-27)では、さらに 8 台のバリデーターがボンドされました。2 台のアーカイブ(obs1 と rand-archive-2(fra1))と、6 台のガーディアンホストです。これらのドロップレットのサイズはここには記録されておらず、mkc1 と mem1 がリサイズされたかどうかも記録されていません。チェーン 20 では、チェーン 19 と同様に 26 台すべてがジェネシスバリデーターで、ボンドは各 1,000 RAND です。2026-09-30 時点で、26 個すべての鍵を 1 人のオペレーターが保持しています。
証明に必要なメモリ
ウォレットは送信するすべてのトランザクションを証明するため、プログラムの呼び出し側には、そのプログラムのティアに見合うメモリが必要です。以下は計測された下限です。ティア 18 の実行は DigitalOcean 上で完了し、証明と検証まで済んでいます。ティア 20 は未完了です。v0.5.6 以降、チェーンはティア 14 を超えるコール証明を拒否します(MAX_CALL_TIER)。したがって、以下のティア 16、18、20 の行は計測値であり、チェーン 20 が受け付けるコールではありません。チェーン 14 でコミットされたコールはすべてティア 10 でした。
| ワークロード | ティア | サイクル数 | 計測内容 | 必要なもの |
|---|---|---|---|---|
シールドトランスファー(bundle ゲスト) | 14 | チェーン 13 で約 9,160(2 入力 2 出力のゲスト) | Apple Silicon のノート PC で 92.2〜96.0 s(本番、チェーン 13、2026-09-19)。ピークメモリは未記録。チェーン 14 の 4 入力 4 出力の隠しアセットゲストも同じティアに固定されており、約 100 s、証明は約 1.42 MB です。チェーン 20 ではトランスファーは 2 つの証明になります(チェーン 17 以降の認可分割)。ティア 14 のバンドル証明(102〜134 s、約 1.49 MB)と、ティア 10 の認可証明(7〜23 s、約 1.36 MB)です。トランザクション全体のピークメモリは 6.1〜6.6 GB(Apple Silicon のノート PC、チェーン 18、2026-09-30) | 開発用ノート PC で動作します |
ERC-20 approve(本番、チェーン 13、2026-09-19) | 16 | 48,119 | コール証明 388.7 s、3,412,405 バイト。rand call 全体は 622.8 s で、48 GB の M シリーズのノート PC でピーク RSS 22.9 GB | 48 GB のノート PC |
| ERC-20 コール | 18 | 約 66k〜162k | ステージ 1 の transfer(79,203 サイクル、コードガード導入前)は、48 GB のノート PC で 1,016 s 後に 24.7 GB の時点で SIGKILL により強制終了されました。64 GB のドロップレットでの実行は、25 分の時点で 47 GB を超えていました | ピーク RSS 85.0 GB(変換版)/ 85.5 GB(インタープリタ版)、証明時間 3,230.5 s / 3,143.3 s、証明サイズ 811,600 / 805,108 バイト。m-16vcpu-128gb で計測、2026-09-19 |
| SPL Token のベクター | 20 | 約 700k〜770k | 変換版の Transfer(692,854 サイクル、ELF ガード導入前)は、48 GB のノート PC で 225 s 後に 30.77 GB の時点で、証明の途中で停止されました。ティア 20 の実行は、64 GB のドロップレットで 10 m 41 s 後に 65.1 GB の時点で OOM により強制終了されました | 未証明。約 330 GB、約 3.6 h と外挿(ティア 16/18 の計測されたスケーリング:+2 ティアごとにメモリは約 ×3.9、時間は約 ×4.1)。DigitalOcean で最大のメモリ搭載ドロップレット(m-32vcpu-256gb、256 GB)を上回ります |
| rVM ティア 21 の本番イグジット(再帰 VM の内部で検証される 1 つのバンドル証明) | 21 | 1,968,619 行 | 実行前に導出した要件は 48.6 GB。制約セット 7 では 256 GB のドロップレットが持つ量を超えて必要でした(2026-09-28/29) | 256 GB 超。制約セット 8 では再計測していません |
ERC-20 のコールはティア 16 と 18、SPL Token はティア 20 に位置します(Ethereum、Solana)。ティア 18 や 20 の証明は、48 GB のマシンではまだ生成されていません。
アグリゲーター
アグリゲーターはチェーンを監視し、ファイナライズされたブロックのウィンドウからバンドル証明を集めて、それらに対する 1 つの再帰的なアグリゲートを証明し、提出します。それを含むブロックが封印ブロックです。アグリゲーターには、対象となったバンドルの証明シェアに加えて、新規 RAND によるブロック補助金が、登録済みのペイアウトアドレスに支払われます。アグリゲーションはパーミッションレスで、ボンドを持つオペレーターなら誰でも登録できます。
アグリゲーションは、ジェネシスに aggregation セクションがあるチェーンにのみ存在します。チェーン 20 にはそれがなく、そのビルドは、このセクションを持つジェネシスでは起動を拒否します。
ハードウェア
| アグリゲート | ホスト RAM | バックエンド |
|---|---|---|
| N = 1 バンドル | 64 GB 以上 | CPU。テストプロファイルでは、負荷のかかったノート PC で 1 件を約 26 分で証明しました(327,035 バイト) |
| N = 2 | 計測値 133 GB(以前の下限は 128 GB 以上) | 本番では GPU バックエンド |
| N = 3 | 計測値 221 GB(以前の下限は 160 GB 以上) | 本番では GPU バックエンド |
| フリートの GPU ノード | ホスト 160 GB 以上、デバイス 80 GB(H100 または A100-80G) | Linux、R580 以上のドライバー、CUDA 13、LLVM 21、sm_80 以上。現時点では存在しません |
N = 2 と N = 3 の値は、2026-09-28/29 に 256 GB の DigitalOcean ドロップレットで、制約セット 7 のもとで計測したものです。本番のイグジット証明は、そのマシンの 256 GB を超えて必要でした。チェーン 18 から 20 が実行している制約セット 8 では、いずれも再計測していないため、N = 1 の行は下限として扱ってください。CUDA バックエンドは、2026-09-28 に NVIDIA H100 という実機で初めて動作しました。そのカーネルは sm_80 と sm_90 向けの PTX にビルドされ、CPU リファレンスと一致します。フリートの GPU ノードでの本番計測は、まだ行われていません。また、すべてのノードは、アグリゲートプログラムのために一度だけ起動時の鍵生成を行います。テストプロファイル(2¹⁹)では 13.0〜13.4 s、本番(2²¹)では 30〜70 s が見込まれます。
コマンド
# print a signed registration; the bond burns out of a wallet bundle as the register bundle's burn
rand-node aggregator register --key agg.key.json --bond <RAND> --payout rand1… --rpc http://127.0.0.1:8545
# the daemon: poll rand_getUnsealed, fetch the raw bundles, prove, seal the payment note, submit
rand-node aggregate --key agg.key.json --rpc http://127.0.0.1:8545 --watch
# leave, then withdraw the released bond into a note at the payout address
rand-node aggregator unbond --key agg.key.json --rpc http://127.0.0.1:8545
rand-node aggregator withdraw --key agg.key.json --rpc http://127.0.0.1:8545
aggregate フラグ | デフォルト | 意味 |
|---|---|---|
--key | 必須 | レジスターが認識している aggregator キー。すべての aggregate に署名します |
--rpc | http://127.0.0.1:8545 | ポーリングと送信の対象となるノード |
--watch | off | 一度だけ送信せず、ポーリングを続けます |
--interval-secs | 15 | --watch 指定時のポーリング間隔 |
--no-wait | off | ノードが aggregate を受理した時点で戻ります |
このようなチェーンでは、rand status に aggregation セクションが表示されます。登録済みの aggregator、未封印のブロック、補助金スケジュールのインデックスです。rand_getUnsealed が作業リストです。
セットアップ
以下の手順は、testnet が使用するスクリプト(deploy/vps-setup.sh、deploy/update-droplet.sh)に沿っています。Linux の validator または observer を構築できます。
1. ビルドホストでビルドする
ビルドには build-essential clang cmake pkg-config libssl-dev、Rust 1.98.1(rust-toolchain.toml で固定)、および fullnode のチェックアウトと並べた circuits のチェックアウトが必要です。初回のビルドには 10 分から 20 分かかります。
git clone https://github.com/randprotocol/fullnode
git clone https://github.com/randprotocol/zkp-circuits circuits
cd fullnode
git checkout v0.6.8 # c9c9bd3c, the build chain 20 runs
git -C ../circuits checkout "$(sed -n 's/^circuits: //p' crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md)" # aeacf31 for v0.6.8
git show origin/main:deploy/genesis-chain20.json > deploy/genesis-chain20.json # committed after the tag
cargo build --release -p randprotocol-node -p randprotocol-client
sha256sum target/release/rand-node # compare on every node you copy it to
chain 20 では、init の前にすべてのノードを v0.6.8 にする必要があります。 そのジェネシスには、それ以前のビルドが読み取らないフィールド(testnet、binding_domain、proof_window_blocks、program_state、ブリッジの rotation グループと fees グループ、ガス上限、投票によるステーキング参加承認)が含まれており、v0.6.8 には audit v6 の CON-4 と CH-1 のコンセンサス変更が入っています。証明は、chain 18 および chain 19 と同様に制約セット 8 のもとで生成され、各バンドル証明に認可証明(hc_auth)が添えられます。v0.6.8 のビルドは、chain 14 から 17 のジェネシスを run と verify で拒否します。フリートが実行しているビルドと同じものを実行してください。ジェネシスファイルは fullnode の main(コミット 74cfaca0)にあり、v0.6.8 タグには含まれていません。そのため 3 行目の git があります。circuits のチェックアウトは、リリースがベンダリングされたコミットでなければならず、そのコミットは上の 2 行目の git が fullnode ツリーから読み出します。rand-prover もビルドするには、-p randprotocol-prover を追加してください。
2. ノードにバイナリをインストールする
scp target/release/rand-node target/release/rand deploy/genesis-chain20.json root@<node>:/root/
ssh root@<node> 'install -m 755 /root/rand-node /root/rand /usr/local/bin/'
3. キー、ジェネシス、ファイアウォール
ノード上で次を行います。
install -d -m 700 /root/keys
test -e /root/keys/node.key.json || rand-node keygen --out /root/keys/node.key.json # prints the address; keep the seed secret
rand-node init --datadir /root/data-6210cf07 --genesis /root/genesis-chain20.json
timedatectl # "System clock synchronized: yes" (see Clock)
ufw allow 22/tcp && ufw allow 30303/tcp && ufw enable
キーは上記のとおりノード上で生成し、いかなるチェックアウトにも置かないでください。fullnode リポジトリでは、キーはもう追跡されていません(audit v3、OPS-1)。chain 8 から 13 向けにコミットされた deploy/node-*.key.json ファイルは公開されたシードです。chain 20 の validator キー(chain 14 用に生成された 18 個と、chain 15 でボンドされた 8 個)はリポジトリ外で生成されており、フリートは各 droplet のキーをソースツリーの外にある /root/keys/node-<name>.key.json に保管しています。フリートのスクリプトでプロビジョニングされたノードでは、この場所が重要です。deploy/rebuild-vps.sh と deploy/push-to-vps.sh は /root/fullnode を --delete 付きで rsync するため、そのツリー内に置いたキーは次回のリビルドで削除され、ユニットは再起動できなくなります。v0.6.8 以降、keygen は既存のファイルの上書きを拒否します(v0.6.7 は確認なしに上書きしていました)。test -e により、どちらのバージョンでも再実行して安全な行になります。ボンドする前に、キーをホストの外にバックアップしてください。
init はジェネシスハッシュを出力します。その値は 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135(chain 20)でなければなりません。ジェネシスファイルは、fullnode リポジトリの main にある deploy/ 内の genesis-chain20.json です。データディレクトリには、フリートと同様にハッシュの先頭 8 文字にちなんだ名前(data-<name>-6210cf07)を付けてください。そうすれば、chain 19(-a3defc93)や後続のチェーンのものと衝突しません。ジェネシスは次の上限を設定します。証明の上限は chain 13 から 16 では 8 MiB でしたが、トランザクションが最大 3 つの証明を運ぶようになった chain 17 以降は 4 MiB です。
| 上限 | chain 20 |
|---|---|
max_program_words | 65,535 |
max_proof_bytes | 4,194,304(4 MiB) |
max_block_bytes | 20,971,520(20 MiB) |
max_call_envelope_bytes | 65,536 |
max_program_public_words | 32,768 |
envelope_bytes | 1,860(メモフィールドを含む暗号化されたすべての note エンベロープ) |
proof_window_blocks | 1,024(chain 19 では 256) |
program_state | セル手数料 0.1 RAND(10,000,000 ユニット)。invoke あたり最大 8 回の読み取り、8 回の書き込み、4 回のペイアウト |
aggregation セクション | なし(aggregation は off) |
chain 20 のジェネシスには、consensus_domain: 1、binding_domain: 1、testnet: true、投票による参加承認を伴う staking セクション、価格上限を持つ gas セクション、ブリッジの rotation グループと fees グループ、hardening_v6、2 つのゲストピン hc_bundle と hc_auth も含まれています。これらが何を設定するかは、ノードの実行に一覧があります。
4. systemd ユニット
これは、上記のパスを使って deploy/vps-setup.sh が書き出すユニットです。
[Unit]
Description=RAND full node
After=network-online.target
[Service]
Environment=RUST_LOG=info,libp2p=warn,libp2p_mdns=off
ExecStart=/usr/local/bin/rand-node run --datadir /root/data-6210cf07 --key /root/keys/node.key.json --validator --listen /ip4/0.0.0.0/tcp/30303 --rpc 127.0.0.1:8545 --no-mdns --prune-history 24h --bootstrap <multiaddr> --bootstrap <multiaddr>
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
observer では --validator を外してください。--prune-history 24h は testnet の validator が実行しているオプションですが、アーカイブは除きます。完全な履歴を保持するノードでは外してください。mainnet では決して指定しないでください。chain 20 のブートストラップ multiaddr は、ノード C(fra1)、D(ric1)、E(sgp1)で、chain 19 から変更ありません。chain 20 は chain 14 用に生成された validator キーで動作し、p2p ID は validator キーから導出されるため、これらの peer id は chain 14 で使われたものと同じです。ジェネシスから同期する新しいノードには、完全な履歴を持つピアも必要です。2 つのアーカイブ(obs1、次に rand-archive-2)のうち 1 つを追加してください。
/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
/ip4/168.144.46.203/tcp/30303/p2p/12D3KooWS5usdMPvsbaWSaT2xtKndHvDYurwmueoNvaRRarb2wRf
/ip4/206.81.29.236/tcp/30303/p2p/12D3KooWPocyZGcNB9Vp68VSfgVvNXhSzBBoJa4h9R1yMkp71XHh
ファイアウォールで保護されていない限り、RPC は 127.0.0.1 のままにしてください。公開サービスを提供するノードは、v0.6.8 の公開リスナー(--public-rpc <ADDR>)をそれと並べて開き、プロキシはその前に置きます。--rpc の前には決して置かないでください(JSON-RPC)。v0.6.7 から引き継いだユニットには --prover-accept-spend-key を指定してはいけません。v0.6.8 は起動時にこれを拒否します。
systemctl daemon-reload && systemctl enable --now rand-node
journalctl -u rand-node -f
rand status # height climbing, peer_count rising
5. validator セットに参加する
新しいキーは、どのエポックのセットにも含まれていません。chain 20 では、まず投票で承認される必要があります。そのジェネシスは staking.admission_by_vote を設定しているため、投票権重の 3 分の 2 を超える validator がそれぞれ rand-node admit sign --candidate <key or registration> --key <validator key> --genesis-hash <chain 20's hash> で署名し、1 つが rand-node admit submit で投票を送信します。その後、rand_getAdmitted がそのキーを一覧表示します。次に、少なくとも 1,000 RAND をボンドします。rand-node register --key /root/keys/node.key.json --payout rand1… --v2 で登録情報を出力し(chain 20 は v1 の登録を拒否します)、ウォレットから rand bond <address> 1000 --registration <hex> でボンドします。ボンドはアクティベーションのエポックまで待機します。コミットされてから最短で 1,000 ブロック境界 3 つ後で、境界ごとに新たな権重となるのはアクティブ権重の最大 2,500 bps です(chain 19 では固定の 10,000 RAND が上限でした)。ステーキングで順を追って説明しています。
6. アップデート
これは、同じチェーンを実行するビルドに適用されます。以前のチェーンから chain 20 への移行はアップデートではありません。新しいバイナリ、新しいジェネシス、新しいデータディレクトリが必要で、古いチェーンのデータディレクトリは後で削除できます(deploy/retire-chain-dirs.sh。フリートはロールバックに備えて 1 日保持します)。チェーンの切り替えを伴わずに新しいビルドをロールアウトするには、一度ビルドし、rand-node と rand の両方の sha256 を比較し、サービスを停止し、インストールして再起動します。これを 1 ノードずつ行います。リリースによっては、1 ノードずつではなく、全停止・全起動でロールアウトされます(v0.5.6 のコールティア規則、v0.5.7 の Status ワイヤ変更、v0.6 のより厳格な証明検証)。どちらの方法かは、各リリースのノートに記載されています。v0.6.7 は chain 18 に 1 ノードずつロールアウトされました。v0.6.8 は chain 20 とともに、全停止・全起動で行われました。その CON-4 と CH-1 のコンセンサス変更は、ノードごとに順次ロールアウトしてはならないためです。次のノードに進む前に、各ノードが再参加するのを待ってください。そうすれば、定足数が 1 ノードを超えて不足することはありません。deploy/update-droplet.sh <ip> [build-host] は、これを SSH 経由でそのまま実行します。
v0.6.8 までのリリースは、1 台のホストで手作業でビルドされており、署名されていません。v0.6.8 の GitHub リリースには、ノード E でビルドされた rand-node、rand、rand-prover、SHA256SUMS が含まれます。このチェックサムは破損したダウンロードを検出しますが、ビルドホストを保証するものではありません。v0.6.8 にはタグからバイナリをビルドするリリースワークフローが付属しており、deploy/update-droplet.sh は ALLOW_UNSIGNED=1 が設定されていない限り、署名済みの SHA256SUMS がないインストールを拒否します。deploy/release-signers にはまだキーが一覧されていないため、署名付きの経路は使われたことがありません。
chain 15、16、17、18 は 2.7 日以内(2026-09-26 から 2026-09-29)に稼働を開始し、いずれもフリートの全停止でした。chain 19 は 2026-10-01 の 03:43 UTC に続き、同じビルドでの chain 18 の再ジェネシスでした。chain 20 は同日の 06:17 UTC に、v0.6.8 のハードフォークで chain 19 のスナップショットから切り出されました。すべてのノードは chain 19 の高さ 7,700 で停止しました。文書化されたカット方針(2026-09-30)は chain 20 以降に適用されます。chain 20 のカット記録では、1 人のオペレーターがすべてのキーを保持しているため、2 人目のオペレーターによるリビルドは免除されました。カットには、ローリングアップデートでは満たせない理由、カットが引き継ぐものと切り捨てるものの公開リスト、事前に完了したクライアントのリビルドチェックリスト、ジェネシスを同じハッシュに再構築する 2 人目のオペレーター、ロールバック計画、そして一度も使われたことのないチェーン ID が必要です。