ジェネシスブロック
ZooBC のチェーンはすべて、ジェネシスブロック、つまりブロック 0 から始まります。それはメッセージではなく、トランザクションも運びません。資金を供給されたアカウントからすべてのコンセンサスパラメータまで、チェーンの開始時の状態全体を表しています。そのすべてが 1 つのハッシュに確定され、そのハッシュがチェーンの身元になります。残高を 1 つ変えるだけで、別のチェーンになります。
設定から作られる
チェーンは設定ファイルからオフラインで作られます。ジェネシストランザクションはありません。設定そのものが状態です。設定は次のものを定めます。
- 資金を供給されたアカウントとその残高。アプリプール に資金を供給するアプリトレジャリーがあれば、それも含みます。
- ジェネシストークンとその残高。どのチェーンも、ZUSD や ZBTC など、同じ 14 種のジェネシスコインを持っています(トークンとマーケット)。
- ベスティングスケジュール
- 登録済みノード、つまりジェネシス席。各チェーンに 11 あり、ZooBC Foundation が保有し、それぞれノード自身のアカウントに 10 ZBC の運用残高を持ちます。
- ブロック間隔から開始時の価格まで、コンセンサスパラメータと、すべてのルールの有効化の高さ
- リリース権限者(リリースとアップデート)などの役割を持つ鍵と、ブリッジコインのカストディアドレス(ブリッジとラップドコイン)
ジェネシスの構築ツールはすべての入金を合計し、合計が 33,333,333.33333333 ZBC の供給上限を超えるジェネシスの書き込みを拒否します。配られなかった分はコインベースプールとなり、15 年かけて放出されます(供給量と発行)。高さ 0 と 1 ではコインベースは支払われません。
開始時の全体を 1 つのハッシュに
構築ツールは、重要なものすべてを 1 つの設定ハッシュにまとめます。そしてジェネシスハッシュが、ブロックのバージョン、高さ、タイムスタンプ、ゼロの直前ハッシュ、そしてその設定ハッシュから導かれます。ジェネシスブロック自体は、すべてゼロのシード、生成者の鍵、署名、直前ハッシュを持ち、そのハッシュは自身のバイト列のハッシュではなく、設定から導かれた値です。読み込まれても確定されない値が 2 つあります。total_supply と node_operating_balance です。
確定された値をどれか 1 つでも変えると新しいジェネシスハッシュになり、したがって別のチェーンになります。
チェーンの身元
ジェネシスハッシュはチェーンの唯一の身元です。ネットワーク ID のバイトはありません。
- ノードは接続するときにジェネシスハッシュを比較し、ハッシュの異なるピアを拒否します。
- すべてのトランザクションの署名がそれを対象にしています。署名者は SHA3-256("ZBC-TX" ‖ genesis hash ‖ the unsigned transaction bytes) に署名するため、あるチェーン用に署名されたトランザクションは他のすべてのチェーンで無効です(チェーン束縛署名)。
- ノードは
/api/v1/node/infoでそれをgenesis_hashとして報告するため、ウォレットはどのチェーンと通信しているかを知ることができます。 - 再立ち上げされたテストネットワークは新しいハッシュを得ます。
そのため devnet、testnet、mainnet は、残高も署名も共有しません(devnet、testnet、mainnet)。
ノードが自分でジェネシスを作ることは決してありません。ノードが起動するとき、ブロック 0 はすでにデータベースに入っていなければなりません(ノードの運用)。
マスターキーはない
ジェネシスは、後でチェーンを書き換えられる鍵を何も持っていません。ルールとパラメータが変わるのは、ルールが適用される高さを運ぶ新しいリリースと、レジストリの席による範囲の限られた価格投票(価格投票)を通じてだけです。メッセージに署名することでルール、パラメータ、残高を変えられる鍵はなく、自分のチェーンに記録されたルールの高さと食い違うノードのバイナリは動作を拒否します。バージョン 0.5.8 以降、121 のコンセンサスルールはすべて高さ 0 から有効です。