異なるプログラミング言語からAccumulateブロックチェーンにアクセスする


![acc-api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473244/92766db0-d407-adcc-7e55-aa65030ede1a.png)

Factomブロックチェーンで動作するSDKのセットをリリースしてから数年が経ちました。プロトコルは、将来のブロックチェーンに必要な技術的進歩とともに、ユニークな機能セットを導入する包括的なリブランディングと完全な技術のオーバーホールを経て、エコシステムは[Accumulate](https://accumulatenetwork.io/) Protocolに生まれ変わりました。

これらの技術的進歩をサポートするために、私はいくつかの便利なライブラリを作成することを命じられ、この記事はその前身（[複数プログラミング言語より Factom ブロックチェーンのアクセス](https://qiita.com/sigrlami/items/17d8e4d72a3c746a1033)）のステップを踏襲し、この記事では、どの言語を使用することができ、エコシステム全体でどのように使用されているかを詳しく説明する。

メインのリファレンスGoライブラリは特定の言語でSDKを生成するためのYAMLコンフィギュレーションを提供する。コアチームはGo、Java、JavaScriptのライブラリを生成するためにこのアプローチに従っている。メンテナンスに必要な時間を減らす一方で、慣用的なアプローチを取り除き、ターゲット言語では典型的でないかもしれない特定の考え方を強制します。これはもちろん意図的なもので、Accumulateはユニオン型を多用している。

私たちは初期の段階でそのようなアプローチを実験し、ライブラリー・ユーザーの声に耳を傾けました。その結果、イディオマティック・ライブラリーを維持し、リファレンス・ライブラリーを知識源としてのみ使用し、手作業でパリティを維持するという私の決断を後押ししてくれました。現在、以下のSDKが利用可能です：

- [Dart/Flutter](https://github.com/kelecorix/accumulate-dart-client) SDKは、当初Kompendium Validatorのために私が作成し、モバイルウォレットのコレクションで使用されていました。APIメソッドを完全にカバーしています。
- [Kelecorix](https://kelecorix.com/)チームによって作成され、我々の[ChainFold](https://chainfold.io/)エクスプローラーとアグリゲーション・サービスで使用されている[Haskell SDKは](https://github.com/kelecorix/accumulate-haskell-client)、最も便利なAPIメソッドを備えていますが、1.2リリース後に追加または変更された型をまだ見逃しています。
- Kelecorixチームによって作成された[Rust SDK](https://github.com/kelecorix/accumulate-rust-client)で、実験的なWASMサポートがあり、WASMウェブウォレット、[Tasset](http://tasset.app/)、いくつかの追加メトリクスサービス、IBC統合作業を支援します。また、ほとんどのメソッドと機能をカバーしています。

次の週には、各ライブラリに関する個別の記事と、Accumulateの上にそれを使ってシンプルなdAppを構築する方法を掲載する予定だ。

### APIを理解する

開発者として、あなたはAccumulateのAPIについていくつかの奇妙なことを理解する必要があります。Query "タイプは王様であり、ほとんどのレシーブレスポンスを駆動し、信じられないほど俊敏である。しかし、ライブラリのメンテナや一般的な開発者にとって、"Query "型なしでトップを構築するのはかなり難しい。

- クエリのバリエーション：APIは多様なクエリーオプションを提供し、異なるレスポンス構造をもたらす。クエリには、口座詳細や取引情報の取得が含まれ、それぞれがユニークなレスポンス形式を導きます。
- タグ付きユニオン：Accumulateは、アカウント、メッセージ、トランザクションなどのさまざまなタイプのレコードを分類するために、[タグ付けされたユニオンを](https://en.wikipedia.org/wiki/Tagged_union)多用しています。この手法により、システム内で異なるレコードタイプを明確に区別することができる。
- レスポンス・タイプ：特定のクエリにかかわらず、すべてのレスポンスはレコードと呼ばれる単一のレスポンス・タイプにカプセル化される。これらのレコードは多くの場合、タグ付けされたユニオン値の範囲を含み、アカウントやメッセージのような異なるデータ構造を表します。
- YAMLのデータ型：Accumulateのデータ型は[YAML](https://gitlab.com/accumulatenetwork/accumulate/-/blob/main/internal/api/v2/types.yml?ref_type=heads)ファイル内で構造化され定義されています。リポジトリ全体に分散されているにもかかわらず、これらのファイルはシステムのデータ構造と操作を理解するための重要なリファレンスとして機能します。
- よりクリーンなデータ構造仕様：現在進行中の取り組みは、システムのデータ構造仕様の改良に向けられている。このイニシアチブは、明確性を高め、複数のプログラミング言語のサポートを容易にし、開発プロセスを合理化し、プラットフォーム間の互換性を確保することを目的としている。

### 今後の課題

Accumulateは常にそのAPIとして進化しており、利用可能な3つのメソッドのみであった初期から、現在では数十のタイプと、すべての可能なクエリタイプに対する応答を持っています。我々のゴールはエコシステムと共に成長し、記述されたライブラリを多用する我々の製品をサポートすることである。この利他的なアプローチは、数年前に助成金のためにFactomライブラリを構築し、何百時間もの無給労働に終わって挫折した経験に比べれば、はるかにましだ。現在、私たちはライブラリをより良く進化させ、維持する方法を理解しています：

1. ライブラリの現在のバージョンに基づくYAMLファイルからの生成と、中間ステップを介したイディオム的なアプローチを統一することで、提供された型定義からイディオム的なバージョンを生成することができるHaskellテンプレートコードが完成しました。
2. JSON自動型ライブラリを再利用して、ElmやPurescriptのようなフロントエンドの関数型言語に自動導出を提供する。これは、Haskellベースのライブラリである[Kadmusによって](https://github.com/sigrlami/kadmus)可能になる。つまり、定義はすでに存在する特定の言語ジェネレータに渡されます。
3. プロトコルの進化に応じてライブラリを維持する。より構造化された定義をサポートするための追加作業が進行中であり、それを楽しみにしている。

一人一人では一滴。一緒になれば大海だ！

WAGMI!

>この記事のスポンサーはKelecorix, Inc.であり、Accumulate Foundation、関連団体、およびペルソナからの外部推奨はありません。本記事はKelecorix Inc.のスポンサーによるものであり、Accumulate Foundationおよび関連団体、ペルソナからの外部推奨はありません。