blockchainjapan’s blog

旬のブロックチェーンを記事を厳選して提供!

2つの機能によるサブグラフのパフォーマンス改善


2つの機能によるサブグラフのパフォーマンス改善

The Graph

このブログは、The Graphのコア開発者であるEdge & Nodeが、2022年4月に公開したものです。

Edge & Nodeと他のThe Graphコミュニティは、サブグラフのインデックス作成とクエリのパフォーマンスの向上に注力しています。Edge & Nodeは、これらの分野に役立つ2つの機能「イミュータブル・エンティティとエンティティのIDとしてBytesを使用」することに取り組んできました。イミュータブル・エンティティの場合は、サブグラフスキーマを少し変更するだけでよく、バイト文字列をIDとして使用する場合は、マッピングを少し変更するだけでよいというように、この2つの機能は互いに独立しています。

これらの拡張は、インデックス作成速度を向上させて、サブグラフに保存する必要のあるデータ量を減らし、さらにいくつかのクエリを高速化します。インデックス作成速度の向上は、サブグラフがデータベースへのデータ書き込みに費やす時間が、コントラクトの呼び出しやデータベースからのエンティティの読み取りなど、他の操作と比較してどの程度多いかに依存します。

各新機能は、現在ホスティングサービス上で展開されており、グラフノードのバージョン0.26.0以降に搭載されます。また、サブグラフの作者は、これらの機能を使用するために、少なくとも0.28のバージョンのgraph-cliと、少なくとも0.26のバージョンのgraph-tsを使う必要があります。

パフォーマンス測定

Edge&Nodeチームは、同じサブグラフの4つのバリエーション(IDをidのタイプとして使用し、イミュータブル・エンティティを使用しない基本バリエーション、BytesをIDとイミュータブル・エンティティのタイプとして使用するバリエーション、および両方を使用するもの)を展開した制御環境において、パフォーマンス測定を実施しました。この2つの機能による性能向上は目を見張るものがあります。

ブロックの処理にかかる平均時間と、サブグラフが必要とするストレージの量を測定しました。平均ブロック時間の短縮は、同期の高速化に直結し、ストレージ要件の削減は、ストレージ効率に優れるだけでなく、クエリ速度にも好影響を与えます:

イミュータブル・エンティティの使用

多くのエンティティはオンチェーンデータを表すため、イミュータブルである。サブグラフの作成者は、サブグラフの GraphQL スキーマ@entity アノテーション@entity(immutable: true) に変更することによって、これらのエンティティが一度作成されると決して変更されないことをシステムに示すことができます。

例えば、Transferエンティティの場合、スキーマは次のようになります:

エンティティタイプがイミュータブルとマークされている場合、graph-node は通常のミュータブルなエンティティタイプに必要なものよりもはるかに安価に構築・維持できるデータベースインデックスを使用することができます。もちろん、不変のエンティティを変更しようとすると、インデックス作成エラーが発生します。

バイトをidとして使用する

多くのサブグラフでは、アドレスのようなバイナリデータをエンティティのidとして使用する。これまでgraph-nodeはidフィールドの型としてID(Stringの同義語)しか認めていませんでした。バイト文字列を文字列に変換してidとして使用する場合、バイナリデータを格納するためにバイト文字列の2倍のスペースを必要とし、UTF-8文字列の比較ではロケールを考慮しなければならず、バイト文字列の比較に使用するバイトワイズ比較よりもはるかにコストがかかるという欠点があります。

Bytesをエンティティのidフィールドの型として使用することができるようになりました。Subgraphの作成者は、上記の例を参考に、id属性の型定義を変更することができるようになりました:

さらに、いくつかのコードの変更も必要です。最も明白な変更は、toHexString()への多くの呼び出しを削除することで、以下のようなコードが可能になります:

次のようになります:

idがバイト配列とカウンタの連結からなるエンティティについては、文字列idを”${address}-${counter}”に設定すると、単にカウンタをアドレスに連結するように変更する必要があり、次のようなコードがあります:

このようになります:

日次の取引量など、集計されたデータを保存するエンティティでは、通常、idには日数が含まれます。ここでも、バイト文字列をidとして使用することが有効である。idを決定するには、次のようにします:

最後に、特殊なアドレスを表す定数もバイト列化する必要がある場合があります。このように定義します:

これは次のようになります:


Edge & NodeではRustエンジニアを募集しています!

Edge & Nodeはソフトウェア開発組織であり、The Graphの初期チームです。私たちは、分散型の未来を築くプロトコルやdappsを作成・サポートしています。Edge&Nodeのビジョンについてはedgeandnode.com で、TwitterLinkedInで私たちをフォローしてください。


The Graphについて

The Graphは、web3のインデックスとクエリーのレイヤーです。 開発者はサブグラフと呼ばれるオープンAPIを構築・公開し、アプリケーションはGraphQLを使用してクエリを実行することができます。

The Graphは現在、Ethereum, NEAR, Arbitrum, Optimism, Polygon, Avalanche, Celo, Fantom, Moonbeam, IPFS, PoAなど40種類のネットワークからのインデックスデータをサポートしており、さらに多くのネットワークが近日中に登場する予定です。現在までに、88,900以上のサブグラフがホスティングサービス上に展開されています。

グラフネットワークの開発者向けセルフサービス体験を2021年7月にローンチして以来、800以上のサブグラフがネットワークに移行し、450以上のインデクサーがサブグラフのクエリを提供し、11,300以上のデリゲーター、2,500以上のキュレーターが参加しています。

Web3アプリケーションを構築している開発者であれば、ブロックチェーンからのデータのインデックシングやクエリにサブグラフを利用することができます。The Graphによって、高い効率性とパフォーマンスによるUIデータ表示が可能になり、他の開発者もあなたのサブグラフを使用することができます。また、Subgraph Studioを使ってネットワークにサブグラフをデプロイしたり、Graph Explorerにある既存サブグラフをクエリすることができます。

The Graph Foundationは、The Graph Networkを統括しており、同時にThe Graph Foundationは、Technical Councilによって統括されています。Edge & Node、StreamingFast、Semiotic Labs、The Guild、Messari、GraphOpsが、The Graphエコシステム内の外部組織として貢献参加しています。

The Graphの各コンテンツをフォローしてご参加ください!