Tezosソフトウェアアーキテクチャ
.. _software_architecture:
Tezosソフトウェアアーキテクチャ[編集]
この文書には2つのセクションがあります。誰にでも読めるはずの最初のセクションは、Tezosの主要な要素を遠くから説明しています。それは、すべての配管工事、および内部とシステムの両方の依存関係から抽象化して、主要コンポーネント、責任、および相互作用の簡単な表示を提供します。 2番目の部分は開発者向けに書かれたもので、OPAMパッケージのレベルにあります。
大きな画像[編集]
.. _大きな絵:
下の図は、Tezosの非常に粗粒度のアーキテクチャを示しています。
| Tezosアーキテクチャ図|
Tezosをユニークなものにする特徴は、自己修正の特性です。自分自身を補正する部分は、「経済的な議定書」(タコの緑色の目)と呼ばれ、プロトコルによって短縮されることもありますし、ソースコード内でプロトタイプさえもあります。 Tezosノードの残りの部分は、「シェル」(青いタコ)と呼ばれています。
このプロトコルは、トランザクションおよびその他の管理操作の解釈を担当します。また、誤ったブロックを検出する責任もあります。
注意すべき重要なことは、プロトコルが常に1つのブロックチェーンだけを見ることです。言い換えれば、起源以来のブロックの線形シーケンス。ノードが代替ヘッドを提案できるオープンなネットワークに存在することは知られていません。
シェルだけが複数のヘッドについて知っています。それは、ネットワークのパン屋(新しいブロックを調理するプログラム)から来る様々なチェーンの提案の中から選択する責任があります。シェルは、代替チェーンを選択してダウンロードし、プロトコルにフィードし、エラーをチェックして絶対的なスコアを与える責任があります。シェルは単に、最高絶対スコアの有効な頭部を選択するだけです。シェルのこの部分は、ref:バリデータ<validation>
と呼ばれます。
残りのシェルには、ピアツーピア層、ブロックのディスクストレージ、ノードがチェーンデータを新しいノードに送信するための操作、および元帳のバージョン管理された状態が含まれます。検証者の間で、ピアツーピア層とストレージは、新しいチェーンデータの取得と複製をバリデータに抽象化する分散データベースと呼ばれるコンポーネントを配置します。
プロトコルは、2つのことをする微調整されたOCamlコンパイラ(画像の左側の緑色の部分)を使用してコンパイルされます。まず、プロトコルのメインモジュールが正しいタイプであることをチェックします。プロトコルをプラグインと見なすのが良いアナロジーです。この場合、共通のプラグインインターフェイスを尊重していることを意味します。次に、認可されたモジュールと関数だけを呼び出すように、プロトコルのコードの型定義環境を制限します。プロトコルをプラグインとして見ると、コードはプラグインAPIからのプリミティブのみを呼び出すことになります。これは、静的に強制されるサンドボックスの一種です。
最後に、RPCレイヤ(画像の右側の黄色)はノードの重要な部分です。これは、クライアント、サードパーティのアプリケーションとデーモンがノードとやり取りしてその状態を調べる方法です。このコンポーネントは、メインストリームのJSON形式とHTTPプロトコルを使用します。コード:ocplib-resto </code>と ocplib-json-typed
を使用します(モジュール:ref: Data_encoding&lt; data_encoding&gt;
)。これは、JSONスキーマを使用して、完全に相互運用可能で、自動記述的です。
.. | Tezosアーキテクチャ図| image :: octopus.svg
ソフトウェアアーキテクチャとパッケージrelashionships[編集]
..パッケージ:
以下の図は、Tezosのソースコードに含まれる主なOPAMパッケージとその依存関係を示しています。分かりやすくするために、 tezos -
接頭辞を削除しました。
| Tezosソースパッケージ図|
下の緑色にはバイナリがあります。黄色で伏せたのは、OPAMパッケージ(時には短縮名)です。黒い矢印は直接の依存関係を示しています。オレンジ色の矢印は、以下に説明する他の間接的な関係(コード生成、インターフェース共有)を示しています。青色で囲まれた部分には、Unixに依存しないモジュールが含まれているため、JavaScriptにコンパイルすることができます。この図には外部依存関係は示されていません。
ベースとそれ以下の ? ?
その中心にある:package: tezos-base
パッケージは、ブロックチェーン固有のコードが始まる場所です。これは基本的な操作のためにどこでも使用されるライブラリのセットです。
- :package:
tezos-stdlib
には、OCaml標準ライブラリ(いくつかの文字列プリミティブ、Option
モジュールなど)上にいくつかの拡張機能が含まれています。 </code>ユーティリティ、および単体比較演算子を実装するCompare
モジュールがあります。 - :package:
tezos-data-encoding
は社内のコミニュナーベースの直列化ライブラリです。単一の型記述t encoding
から、コードはバイナリとJSONの両方の表現t
型の値を読み書きできます。どちらの場合でも、図書館は、文書のコンビネータを使用して、機械可読文書と人間が書くことができる文書を提供します。 JSONの部分は、opam:ocplib-json-typed
に依存します。 A:ref:チュートリアル&lt; data_encoding&gt;
はこのライブラリで使用できます。 - :package:
tezos-error-monad
はOCamlの( 'a、' b)結果
型への社内モナドインタフェースであり、 b </code>を拡張可能なタイプのerror
(実際にはエラートレースを保持するリスト)に変換します。型を拡張する場合、プログラマは、きれいなプリンタと直列化のためのエンコーディングを登録するregister_error
関数も呼び出す必要があります。 A:ref:チュートリアル&lt; error_monad&gt;
は、このライブラリで使用できます。 - :package:
tezos-rpc
は、TezosのRPCサービスメカニズムの基本を提供します。 Ocsigen / Eliomのサービス階層を構築し、サービスを登録および呼び出しするためのコンビネータを提供します。このモジュールはopam:ocplib-resto
に基づいています。これは、マシンの自動生成と人間が理解できるサービスの階層を可能にします:URLの構造と入出力本体data_encoding
を使用します。 - :package:
tezos-crypto
は、私たちが使用する外部暗号ライブラリをラップします。可能な限り薄いバインディングで最小限のリファレンス実装を使用しようとしています。可能な計画は、HACLプロジェットからのライブラリを使用することです。そのため、すべての暗号はFstarから、薄いCバインディングで、またはOCamlで直接抽出されます。 - :package:
tezos-micheline
はスマート契約の言語であるマイケルソンが使用する具体的な構文です。ほとんどの場合、汎用の型なしAST、プリンタ、パーサが含まれています。 - :package:
tezos-base
は、これらすべてのモジュールをTezosの他のすべてのコンポーネントの共通基盤にまとめ、ブロックチェーンのデータ構造を導入します(Block_hash
シェル、経済プロトコル、クライアント、デーモン、および第三者間で共有されるBlock_header
、Block_locator
、Fitness
、P2pidentity
。また、特定のタイプのオールインワンモジュールを構築するファンクタとして、crypto
からいくつかのモジュールを再ラップします(たとえば、ブロックハッシュ用のモジュールには、すべてのコンバータ、コマンドラインとRPC引数ビルダー、プリンタ、オートコンプリータなど)。このパッケージには、一部の実行可能ファイルでコマンドライン解析を処理するために使用するcli_entries
モジュールも含まれています。
シェル?? ?
シェルは、すべての通信、ピアツーピアおよびRPCを担当するノードの一部であり、経済プロトコルの周りの繭として機能します。
- :package:
tezos-shell-services
には、ノードのサービス階層の定義、およびクライアント(またはサードパーティのソフトウェア)で使用する関数の呼び出しが含まれます。このライブラリは、型安全な方法でサービスを呼び出すためにクライアントにリンクされているため、ここではサービスの記述のみが行われます。ハンドラの登録は、ノードの残りの実装で行われます。 - :package:
tezos-rpc-http
は、opam:cohttp
を使ってRPC over HTTPサーバとクライアントを実装し、以下を使用して宣言されたサービスを実際に使用できるようにします:package:tezos-rpc
- :package:
tezos-p2p
は社内ピアツーピア層です。 - :package:
tezos-storage
には、連鎖データに使用される生の単純なキー値ストアと、元帳のコンテキスト(ブロックごとに1つのバージョン)を格納するために使用される生バージョンキー付き値ストアが含まれます。これはopam:irmin
と現在:opam:leveldb
を使って実装されています。 - :package:
tezos-protocol-updater
は、利用可能なプロトコルバージョンのテーブルを、埋め込みまたは動的にリンクしています。 - :package:
tezos-shell
は、ブロック検証、mempool管理、および分散データベースのスケジューリングを実装します。説明は次のとおりです:ref:このドキュメント<validation>
経済プロトコル環境とコンパイラ ?< / sub> >? ?
経済プロトコルは、OCamlコンパイラの特定のバージョンによってコンパイルされます。このコンパイラは、静的なサンドボックス化の一形式として、経済的プロトコルに利用可能なモジュールのセットを制限します。また、代替環境でプロトコルの実行を可能にするために、プロトコルのファンクション化されたバージョンを生成します。
- :package:
tezos-protocol-environment-sigs
には、経済的プロトコルで利用可能なモジュールが含まれています。このサンドボックスのレビューは、ref:here&lt; protocol_environment&gt;
で利用できます。このモジュールには、標準ライブラリを削除し、暗号API、RPC定義、およびキー値ストアへのインタフェースが含まれています。 - :package:
tezos-protocol-compiler
は、経済的なプロトコルのコンパイラです。OCamlの代替ドライバ:プロトコル環境内の型チェックを行うopam:ocaml-compiler-libs
プロトコルコードについてさらに検査を行う。 -
tezos-protocol-xxx
は、プロトコルコンパイラによって生成され、その標準ライブラリをパラメータとして持つプロトコルxxx
のファントレイ化バージョンを含んでいます。このパラメータは、以下の2つの実装で実装できます。 - :package:
tezos-protocol-environment-shell
はRPCサービスの登録とストレージアクセスがノードのものである環境のインスタンスです。これは、新しいプロトコルをロードするときにノードによって供給される環境です。 - :package:
tezos-protocol-environment
には、プロトコル環境の3つの代替インスタンスが含まれています。コンテキストアクセス機能は、プロトコルのタイプおよび非コンテキスト機能のみが必要な場合に使用できるダミーのものですテスト用にメモリ内のキー値ストアをシミュレートするもの、およびいくつかのコンテキストアクセサから環境を構築できるようにするファンクタです。 -
tezos-embedded-protocol-xxx
には、標準ライブラリがシェルの実装にプリインスタンス化されているプロトコルxxx
のバージョンが含まれています。 。それには、ノードのプロトコルテーブルにプロトコルを登録するモジュールが含まれています。
組込み経済議定書 ? sub>
主なTezosリポジトリには、3つの経済的なプロトコルが含まれています。
- :パッケージ:起源ブロックのプロトコルは、
tezos-protocol-genesis
(パッケージ:tezos-embedded-protocol-genesis
)です。これは、公開鍵がハードコードされている独裁者によって署名された単一のブロックを受け入れ、その単一のアクションは独裁者によって選択された新しいプロトコルに切り替えることである。 - :パッケージ:Tezos-protocol-alpha(:package:
tezos-embedded-protocol-alpha
)はTezosの最初の実プロトコルです。 A:ref:チュートリアル&lt; enter_alpha&gt;
を使用して、プロトコルのコードを読むことができます。 - :package:
tezos-protocol-demo
(パッケージ:tezos-embedded-protocol-demo
)は、面白いことはしませんが、正しい形をしたデモプロトコルです。
クライアントライブラリ? ? ~~
クライアントは多くのパッケージに分割されており、シェルと経済プロトコル、Unix依存とJavascript互換、ライブラリ対コマンドラインインタフェースの3つの分離線を適用しています。
- :package:
tezos-client-base
はクライアントコンテキストを定義します。クライアントコンテキストはメソッドがキーのウォレットへのアクセス、ユーザー経由の対話、RPC呼び出し、署名者によるデータ署名を可能にするオブジェクトですプラグイン。パッケージ:tezos-shell-services
と:package:tezos-protocol-alpha
のRPC呼び出し関数を含むほとんどのものは、このオブジェクト型で抽象化されています。そうすれば、ツールキットのさまざまなプラットフォームに同じコードを使用することができます。 - :package:
tezos-client-alpha
は、クライアントコンテキストからウォレットと署名者を使用してプロトコルアルファの操作を実行するためのいくつかの関数を提供します。 - :package:
tezos-client-commands
は、tezos-client-commands
コマンドのハンドラとしてパッケージ:tezos-client-base
クライアント</code>コマンドラインウォレットを使用します。 - :パッケージ:
tezos-client-alpha-commands
は、tezosのアルファ固有のコマンドのためのハンドラとしてパッケージ:<code> tezos-client-alpha
-client </code>コマンドラインウォレット。 - :package:
tezos-client-genesis
には、起源プロトコルで利用可能な基本的な独裁者のコマンドが含まれています。 - :package:
tezos-client-base-unix
は、Unixファイルに設定ファイルとウォレットストレージ、Unixコンソールを介したユーザ対話、ターミナルベースの署名者プラグインを実装しています。
テストパッケージ ? ?
テストはさまざまなパッケージに分割され、依存関係のチェーンに沿って、ますます多くの要素がテストされます。実行するには make test
を使用します。
- :package-name:
tezos-client
(ディレクトリ内:src:src / bin_client / test /
):シェルスクリプトとしてのエンドツーエンドテスト。サンドボックス化されたノードであり、クライアントを使用してさまざまなタスクを実行します - :package-name:
tezos-p2p
(ディレクトリ:src:src / lib_p2p / test /
):ピアツーピア層のテスト。 Tezosのゴシッププロトコル(接続の確立、ピアの伝播など) - :パッケージ名:
tezos-protocol-environment
(ディレクトリ:src:src / lib_protocol_environment / test /
):メモリ内コンテキストの実装をテストします。 - :package-name:
tezos-shell
(ディレクトリ:src:src / lib_shell / test /
):チェーンデータストレージをテストします。 - :package-name:
tezos-stdlib
(ディレクトリ:src:src / lib_stdlib / test /
):基本的なデータ構造をテストします。 - :package-name:
tezos-storage
(ディレクトリ:src:src / lib_storage / test / <code>):バージョン管理されたKey-Valueコンテキストをテストします。
- :パッケージ名:<code> tezos-client-alpha 、パッケージ名:
tezos-baking-alpha
(ディレクトリ:src:src / proto_alpha / lib_baking / test /
):OCamlクライアントライブラリのテスト。RPCを介してサンドボックス化されたノードへのさまざまな短いシナリオを実行します。 - :パッケージ名:
tezos-protocol-alpha
(ディレクトリ:src:src / proto_alpha / lib_protocol / test /
):アルファプロトコルのテストノード)。 - :package-name:
tezos-crypto
(ディレクトリ:src:src / lib_crypto / test /
):社内のMerkleツリーをテストします。 - :package-name:
tezos-data-encoding
(ディレクトリ:src:src / lib_data_encoding / test /
):JSONとバイナリのシリアル化とデシリアライズをテストします。
最終実行可能ファイル ? ??? ~~
- :package:
tezos-node
は、ノードランチャーのバイナリtezos-node
を提供します。すべてのアルゴリズムがシェルに実装されていますが、このパッケージはノードのCLIのみを実装しています。また、サンドボックス化されたノードシェルスクリプトランチャーも提供します(主なreadmeを参照してください)。 - :package:
tezos-client
は、tezos-client
およびtezos-admin-client
バイナリを提供します。前者には小文字のwalletが、後者にはノード用の管理ツールが含まれています。また、サンドボックス化されたノードと対話するシェル環境を構成するシェルスクリプトも提供します。 - :package:
tezos-baker-alpha
は、tezos-alpha-baker
バイナリを提供します。 - :package:
tezos-protocol-compiler
は、新しいプロトコルをオンザフライでコンパイルするためにノードによって使用されるtezos-protocol-compiler
バイナリを提供し、新しいプロトコルを開発するためのものです。
.. | Tezosソースパッケージ図| image :: packages.svg