デーモン
このセクションでは、技術的な観点からIBaxノード同士がどのように相互作用するかについて説明します。
サーバーデーモンについて
サーバーデーモンは、ネットワークノード上で実行される必要があります。これはさまざまなサーバー機能を実行し、IBaxのブロックチェーンプロトコルをサポートします。ブロックチェーンネットワークでは、デーモンはブロックやトランザクションの配布、新しいブロックの生成、受信したブロックやトランザクションの検証を行い、フォークの問題を回避することができます。
名誉ノードデーモン
名誉ノードは次のサーバー デーモンを実行します。
ガーディアンノードデーモン
ガーディアンノードは以下のサーバーデーモンを実行します:
BlockCollection daemon
このデーモンはブロックをダウンロードし、他のネットワークノードとブロックチェーンを同期します。
ブロックチェーンの同期
このデーモンは、ブロックチェーンネットワーク内の最大ブロック高さを決定し、新しいブロックを要求し、ブロックチェーンのフォーク問題を解決することで、ブロックチェーンを同期します。
ブロックチェーンの更新を確認する
このデーモンは、現在のブロックIDからすべての信頼ノードにリクエストを送信します。
デーモンを実行しているノードの現在のブロックIDが、どの信頼ノードの現在のブロックIDよりも小さい場合、ブロックチェーンネットワークノードは時代遅れと見なされます。
新しいブロックをダウンロードする
最大の現在のブロック高さを返すノードが最新のノードと見なされます。
デーモンは、すべての未知のブロックをダウンロードします。
フォーク問題の解決
ブロックチェーンでフォークが検出された場合、デーモンは共通の親ブロックまでブロックをダウンロードしてフォークを後退させます。
共通の親ブロックが見つかったら、デーモンを実行しているノードでブロックチェーンのロールバックが行われ、最新のブロックが含まれるまで正しいブロックがブロックチェーンに追加されます。
テーブル
BlocksCollectionデーモンは次のテーブルを使用します:
- block_chain
- transactions
- transactions_status
- info_block
リクエスト
BlockCollectionデーモンは、他のデーモンに対して次のリクエストを送信します:
- Type 10は、すべての信頼ノードの中で最大のブロックIDを指します。
- Type 7は、最大のブロックIDを持つデータを指します。
BlockGenerator daemon
BlockGeneratorデーモンは新しいブロックを生成します。
事前検証
BlockGeneratorデーモンは、ブロックチェーンの最新ブロックを分析して新しいブロック生成計画を立てます。
以下の条件が満たされている場合、新しいブロックを生成できます:
- 最新のブロックを生成したノードが、信頼ノードリスト内のノードであり、デーモンを実行していること。
- 最新の未検証ブロックが生成されてからの経過時間が最も短いこと。
ブロック生成
デーモンによって生成される新しいブロックには、他のノードのDisseminatorデーモンから受け取ることができるすべての新しいトランザクションが含まれます。また、デーモンを実行しているノードで生成されることもあります。生成されたブロックは、ノードのデータベースに保存されます。
テーブル
BlockGeneratorデーモンは以下のテーブルを使用します:
- block_chain(新しいブロックを保存する)
- transactions
- transactions_status
- info_block
リクエスト
BlockGeneratorデーモンは他のデーモンに対してリクエストを行いません。
Disseminatorデーモン
Disseminatorデーモンは、トランザクションとブロックをすべての信頼ノードに送信します。
ガーディアンノード
ガーディアンノードで作業している場合、デーモンはノードで生成されたトランザクションをすべての信頼ノードに送信します。
信頼ノード
信頼ノードで作業している場合、デーモンは生成されたブロックとトランザクションのハッシュをすべての信頼ノードに送信します。
その後、信頼ノードは自身が知らないトランザクションのリクエストに応答します。デーモンは完全なトランザクションデータを応答として送信します。
テーブル
Disseminatorデーモンは以下のテーブルを使用します:
リクエスト
Disseminatorデーモンは他のデーモンに対して次のリクエストを送信します:
- Type 1:トランザクションとブロックのハッシュを信頼ノードに送信します。
- Type 2:信頼ノードからトランザクションデータを受信します。
Confirmationsデーモン
Confirmationsデーモンは、自身のノードに存在するすべてのブロックがほとんどの他のノードに存在するかどうかをチェックします。
ブロックの確認
ネットワーク内の複数のノードによって確認されたブロックは、確認済みのブロックと見なされます。
デーモンは、データベース内で現在確認されていない最初のブロックから順番にすべてのブロックを確認します。
各ブロックは以下の方法で確認されます:
- 確認中のブロックのIDを含むリクエストをすべての信頼ノードに送信します。
- すべての信頼ノードがブロックのハッシュに応答します。
- 応答されたハッシュがデーモンノード上のブロックのハッシュと一致する場合、確認カウンタの値が増加します。一致しない場合は、キャンセルカウンタの値が増加します。
テーブル
Confirmationsデーモンは以下のテーブルを使用します:
リクエスト
Confirmationsデーモンは他のデーモンに対して次のリクエストを送信します:
- Type 4:信頼ノードからブロックのハッシュをリクエストします。
TCPサービスプロトコル
TCPサービスプロトコルは、BlocksCollection、Disseminator、Confirmationデーモンへのリクエストにおいて、バイナリプロトコルを使用し、信頼ノードとガーディアンノード上で動作します。
リクエストタイプ
各リクエストには、リクエストの最初の2バイトで定義されるタイプがあります。
Type 1
リクエスト送信元
このリクエストはDisseminatorデーモンによって送信されます。
リクエストデータ
トランザクションとブロックのハッシュ。
リクエスト処理
ブロックのハッシュがブロックキューに追加されます。
トランザクションのハッシュを分析および検証し、ノード上にまだ表示されていないトランザクションを選択します。
レスポンス
なし。リクエストの処理後、Type 2のリクエストが発行されます。
Type 2
リクエスト送信元
このリクエストはDisseminatorデーモンによって送信されます。
リクエストデータ
データサイズを含むトランザクションデータ:
data_size (4バイト)
トランザクションデータのバイト数。
data (data_sizeバイト)
トランザクションデータ。
リクエスト処理
トランザクションを検証し、トランザクションキューに追加します。
レスポンス
なし。
Type 4
リクエスト送信元
このリクエストはConfirmationsデーモンによって送信されます。
リクエストデータ
ブロックID。
レスポンス
ブロックハッシュ。
このIDのブロックが存在しない場合は0
を返します。
Type 7
リクエスト送信元
このリクエストはBlockCollectionデーモンによって送信されます。
Request data
ブロックID。
レスポンス
ブロックデータを含む、データサイズを含むレスポンス。
data_size (4バイト)
ブロックデータのバイト数。
data (data_sizeバイト)
ブロックデータ。
このIDのブロックが存在しない場合、接続は閉じられます。
Type 10
リクエスト送信元
このリクエストはBlockCollection daemonによって送信されます。
リクエストデータ
なし。
レスポンス
ブロックID。