※この記事は、Tobias Andersen氏(@ZaradarBH)が2022年10月22日公開した記事『TERRA CLASSIC INTEGRATION GUIDELINES(Terra Classic統合ガイドライン)』の内容を日本語訳した記事となります。
夏の間、私は私たちのプラットフォームのアーキテクチャを研究し、いくつかのノートにモックアップを作成しました。 このメモを記事にすることによって、エコシステム開発者の方々が調べ物をする際などの情報収集に役立てばと期待しています。
なお、これは「私にどんなことでも聞いてほしい」という意味ではありません。むしろ、質問によって日々の仕事や日常に支障が出てきているため、「そのような質問依頼を減らしたい」という思いで今回の記事を公開しています。
どうしても上手くいかない場合は Terra Rebels のアーキテクトのチームに相談してください。彼らは皆このような問題に対処できる能力を備えています。
アーキテクチャ
以下は、現在「Terra Classic」として知られるネットワークを構成する分散型システムの「概念的なアーキテクチャ」です。それぞれの「ノード(ブロックチェーンネットワークに接続している端末)」については、以下のセクションで説明します。
インターフェース
インターフェースとは、コンピュータシステムの2つ以上の別々の構成要素(コンポーネント)が情報を交換するための共有の境界線です。
情報交換は、ソフトウェア、コンピュータハードウェア、周辺機器、人間、およびこれらの組み合わせの間で行われます。
Terra Classicは以下の3種類のインターフェイスをサポートしています。
- アプリケーションプログラミングインターフェイス
- コマンドライン(タイプ入力)インターフェイス
- グラフィカルユーザーインターフェイス
API
APIとは"Application Programming Interface"の略で、主に外部システム間での情報交換で利用されます。
APIは、コンピュータシステムの特定の部分と統合するために外部アプリケーションが使用するプロトコルやサブルーチンの集合体です。
Terra ClassicはHTTP/2(*1)転送プロトコルを活用し、サブルーチンを公開して、ネットワーク上のすべてのクライアントに汎用的な「APIサーバ」を提供します。
Tendermintは、特定のネットワーク(columbus-5、rebel-1、rogue-1 など)に接続されているすべての terrad バイナリで「API サーバー」の状態についてコンセンサスが達成されるようにします。
CLI
CLIは"Command Line Interface"の略で、人や外部システムの両方を扱います。
一般的にCLIは外部システムによって使用されるサブルーチンの集合体で、コンピュータシステム内の1つまたは複数のコンポーネントと対話するためのより便利な方法を提供します。
Terra Classicは"terrad"という主要なCLIを持っており、ブロックチェーンを支える分散システムを管理するために必要なすべてのサブルーチンにアクセスすることができます。
terradのCLI機能のほとんどは、「Tendermint」と「Cosmos- SDK 」から継承されています。
GUI
GUIは"Graphical User Interface"の略で、主に人間の操作者を対象とします。
一般的にGUIは、ユーザーが複数のプロトコルやサブルーチンにまたがる複雑なワークフローを操作・推論したりできるように視覚的に抽象化したものです。
Terra Classicには以下の4つの主要なGUIがあります。
GUIクライアントコードはGitHubで確認することができます。
- Station-Desktop(デスクトップ)
- Station-Mobile(アプリ)
- Station-extension(ブラウザ)
- Web(ブラウザ)
エンドポイント
エンドポイントとは、ネットワーク上で利用可能なあらゆるデバイスのことです。ノートパソコンやデスクトップ、スマートフォン、タブレット、サーバー、仮想環境などのすべての端末がエンドポイントとなります。
エンドポイントと API は同じものではないことを理解しておくことが重要です。エンドポイントとは、1つまたは複数のAPIへのアクセスを提供するデバイスのことです。
エンドポイントは、APIが情報を交換する際に活用できるように、複数の転送プロトコルをサポートすることができます。
Terra Classicのエンドポイントは、一般的に以下のソフトウェアプロトコルをサポートしています。
- RPC (HTTP/2)
- LCD (HTTP/2)
- FCD (HTTP/2)
RPCエンドポイント
分散コンピューティングでは、コンピュータプログラムが別のアドレス空間(一般的には共有ネットワーク上の別のデバイス)でサブルーチンを実行させることを"RPC(Remote Procedure Call)"と呼びます。
このアイデアは、プログラマーが遠隔操作の詳細を明示的にコーディングすることなく、あたかもLPC(*2)のようにコードを書くことを可能にし、遠隔コード実行への宣言的アプローチを提供することです。
公共のネットワーク、例えば許可されていないDLT/DAGでは、悪意のある行為者がリモートコード実行攻撃でデバイスをハイジャックしようとするのを防ぐため、RPCエンドポイントを無効にする必要があります。したがって、一般的には、許可されたRPCエンドポイントに依存する方がより理にかなっています。
LCDエンドポイント
Light Client Daemon(LCD)は、RESTベースのアダプターを、RPC エンドポイントに提供します。これは、Aminoでエンコードされたブロックチェーンデータを解析可能なJSONにデコードするのにも役立ちます。 これにより、アプリは単純なHTTPを介してノードと通信できます。
Terra Classic SDKは、稼働中のLCDサーバーへのアクティブな接続に依存しています。SDK専用の接続が必要な場合は、LCDをセットアップして下さい。
Terra Classic LCDエンドポイントは、swagger APIを公開して、特定のLCDエンドポイントにインストールされたterradバイナリから利用可能なサブルーチンを検出できるようにします。
FCDエンドポイント
FCDエンドポイントは、LCD エンドポイントから「コレクター」アプリケーションを介して定期的に収集され、その後読み取り用に最適化されたデータベースでインデックス化されたデータへのアクセスを提供します。
また、FCDエンドポイントは、クライアントがインデックス化されたデータを照会するために使用するREST APIサーバーも提供します。
Terra Classic FCDエンドポイントは、REST APIから利用可能なサブルーチンを発見できるようにswagger APIを公開することができます。
これは、TFLが2つのエンドポイントのメタデータを同じ転送プロトコル(HTTP/2)を利用するように「インターリーブ(*3)」することを選択したためだと思われます。
SDKs(ソフトウェア開発キット)
SDKs(ソフトウェア開発キット)は、インストール可能な1つのパッケージにまとめられたソフトウェア開発ツールの集合体です。コンパイラ(*4)やデバッガ(*5)、時にはソフトウェアフレームワークを持つことでアプリケーションの作成を容易にします。
SDKはハードウェアプラットフォームとオペレーティングシステムの組み合わせに特化しています。
既存のTerra Classic SDKのほとんどは「オリジナル」です。SDKを一般企業にとってより魅力的なものにするため、Terra Rebelsは既存および将来のすべてのSDKを、Terra Classicブロックチェーンが提供する基礎APIとの高い忠実度を保証するコード生成実装に置き換えることを意図しています。
Terra.js
Terra.jsは、Node.js、ブラウザ、React Native(*6)環境からTerraブロックチェーンと対話するアプリケーションを記述するためのJavaScript SDKです。コアデータ構造やシリアライゼーション(複数の並列データを直列化して送信)機構、鍵管理サービス、APIリクエストの上にシンプルな抽象化レイヤーを消費者に提供します。
Terra.jsのコードは、こちらの GitHub で確認することができます。
Terra.py
Terra.pyは、Python環境からTerraブロックチェーンと相互作用するアプリケーションを書くためのPython SDKです。コアデータ構造やシリアライゼーション機構、鍵管理サービス、APIリクエストの上にシンプルな抽象化レイヤーを消費者に提供します。
Terra.pyのコードは、こちらの GitHub で確認することができます。
Anchor.js
Anchor.jsは、Webブラウザやサーバーバックエンド、React Native環境によるモバイルへの対応など、JavaScriptランタイム内からAnchorプロトコルと対話できるアプリケーションを構築するためのクライアントSDKです。
Anchor.jsのコードは、こちらの GitHub で確認することができます。
Dependencies(依存)
ソフトウェアにおける「Dependencies(依存)」とは、別のソフトウェアで再利用されるコードライブラリやパッケージのことを指します。
ソフトウェアの依存関係には以下の2つのタイプがあります。
- 直接:あなたのコードが直接呼び出すライブラリやパッケージ
- 遷移型:依存関係が呼び出すライブラリやパッケージ
Tendermint(テンダーミント)
TendermintはBFT(*6)エンジンで、任意のプログラミング言語で書かれた状態遷移マシンを受け取り、多数のマシンに安全に複製することができます。
Tendermintは、合意形成エンジンとアプリケーションレイヤーのロジックを使ってアプリケーションと通信します。すべてのメッセージタイプはprotobuf形式(*7)で定義されており、Tendermint Coreはあらゆるプログラミング言語で書かれたアプリケーションを実行することができます。
Tendermintについて詳細は こちら で確認することができます。
Cosmos-SDK
Cosmosは、BFT での合意形成に基づき構築された相互運用可能なブロックチェーンのネットワークです。拡大し続けるエコシステムは、SDK、トークン、ウォレット、アプリケーション、サービスを提供します。アプリケーションに特化したブロックチェーンを開発するために、Cosmos SDKを活用してください。
Cosmos-SDKの詳細については こちら で確認することができます。
CosmWasm
CosmWasmは、Cosmosエコシステムのために構築されたスマートコントラクトプラットフォームで、wasmer.io 1.0 から派生したものです。