インデキシング
Reading time: 41 min
インデクサーは、The Graph Network内のノードオペレーターであり、インデックス化とクエリ処理のサービスを提供するためにGraph Token(GRT)をステークします。インデクサーは、そのサービスに対するクエリ料金とインデックスリワードを獲得します。また、指数的なリベート関数に従ってリベートされるクエリ料金も獲得します。
プロトコルにステークされた GRT は解凍期間が設けられており、インデクサーが悪意を持ってアプリケーションに不正なデータを提供したり、不正なインデックスを作成した場合には、スラッシュされる可能性があります。 また、インデクサーはデリゲーターからステークによる委任を受けて、ネットワークに貢献することができます。
インデクサ − は、サブグラフのキュレーション・シグナルに基づいてインデックスを作成するサブグラフを選択し、キュレーターは、どのサブグラフが高品質で優先されるべきかを示すために GRT をステークします。 消費者(アプリケーションなど)は、インデクサーが自分のサブグラフに対するクエリを処理するパラメータを設定したり、クエリフィーの設定を行うこともできます。
必要な技術レベル
ADVANCED
インデクサーの最低ステーク量は、現在 100K GRT に設定されています。
クエリフィー・リベート - ネットワーク上でクエリを提供するための手数料です。 この手数料は、インデクサーとゲートウェイ間のステートチャネルを介して支払われます。 ゲートウェイからの各クエリリクエストには手数料が含まれ、対応するレスポンスにはクエリ結果の有効性の証明が含まれます。
インデキシング報酬 - プロトコル全体のインフレーションにより生成される年率 3%のインデキシング報酬は、ネットワークのサブグラフ・デプロイメントのインデキシングを行うインデクサーに分配されます。
インデキシング報酬は、年間 3%の発行量に設定されているプロトコル・インフレから得られます。 報酬は、それぞれのサブグラフにおけるすべてのキュレーション・シグナルの割合に基づいてサブグラフに分配され、そのサブグラフに割り当てられたステークに基づいてインデクサーに分配されます。 特典を受けるためには、仲裁憲章で定められた基準を満たす有効な POI(Proof of Indexing)で割り当てを終了する必要があります。
Numerous tools have been created by the community for calculating rewards; you'll find a collection of them organized in the . You can also find an up to date list of tools in the #Delegators and #Indexers channels on the . Here we link a integrated with the indexer software stack.
POI は、インデクサーが割り当てられたサブグラフにインデックスを作成していることを確認するためにネットワークで使用されます。 現在のエポックの最初のブロックに対する POI は、割り当てを終了する際に提出しなければ、その割り当てはインデックス報酬の対象となりません。 あるブロックの POI は、そのブロックまでの特定のサブグラフのデプロイに対するすべてのエンティティストアのトランザクションのダイジェストです。
割り当ては、それがアクティブである間、継続的に報酬を発生させます。 報酬はインデクサによって集められ、割り当てが終了するたびに分配されます。 これは、インデクサーが強制的に閉じようとしたときに手動で行うか、28 エポックの後にデリゲーターがインデクサーのために割り当てを終了することができますが、この場合は報酬がミントされません。 28 エポックは最大の割り当て期間です(現在、1 エポックは約 24 時間です)
The RewardsManager contract has a read-only function that can be used to check the pending rewards for a specific allocation.
コミュニティが作成したダッシュボードの多くには保留中の報酬値が含まれており、次の手順に従って手動で簡単に確認できます。
query indexerAllocations {indexer(id: "<Indexer_ADDRESS>") {allocations {activeForIndexer {allocations {id}}}}}
Use Etherscan to call getRewards()
:
getRewards()
を呼び出します- Expand the 9. getRewards dropdown.
- 入力欄にallocationIDを入力
- Queryボタンをクリック
インデクサークエリとアロケーションは、期間中に The Graph 上で争議することができます。 争議期間は、争議の種類によって異なります。 クエリ/裁定には 7 エポックスの紛争窓口があり、割り当てには 56 エポックスがあります。 これらの期間が経過した後は、割り当てやクエリのいずれに対しても紛争を起こすことはできません。 紛争が開始されると、Fishermen は最低 10,000GRT のデポジットを要求され、このデポジットは紛争が最終的に解決されるまでロックされます。 フィッシャーマンとは、紛争を開始するネットワーク参加者のことです。
論争には 3 の結果が考えられます。漁師の預金も同様です
- 争議が却下された場合、フィッシャーマンが預かった GRT はバーンされ、争議中のインデクサーはスラッシュされません。
- 争議が引き分けた場合、フィッシャーマンのデポジットは返還され、争議中のインデクサーはスラッシュされることはありません。
- 争議が受け入れられた場合、フィッシャーマンがデポジットした GRT は返却され、争議中のインデクサーはスラッシュされ、フィッシャーマンはスラッシュされた GRT の 50%を獲得します。
紛争は、UI のインデクサーのプロファイルページの紛争
タブで確認できます。
クエリ料金はゲートウェイによって収集され、指数リベート関数に従ってインデクサーに分配されます (GIPを参照)。 指数リベート関数は、インデクサーがクエリを忠実に処理することで確実に最良の結果を達成する方法として提案されています。 これは、インデクサーが収集する可能性のあるクエリ料金の額と比較して、大量のステーク (クエリの提供時にエラーが発生した場合に削減される可能性がある) を割り当てるようインデクサーに奨励することによって機能します。
割り当てが閉じられると、リベートはインデクサーによって請求されることができるようになります。請求されると、クエリ料金のリベートは、クエリ料金のカットと指数的なリベート関数に基づいて、インデクサーとその委任者に分配されます。
クエリフィーカット
とインデキシングリワードカット
の値は、インデクサーが クールダウンブロックと共に設定できるデリゲーションパラメータで、インデクサーとそのデリゲーター間の GRT の分配を制御するためのものです。 デリゲーションパラメータの設定方法については、の最後のステップを参照してください。
-
queryFeeCut - クエリ料金のリベートの%を示します。これが95%に設定されている場合、インデクサーは割り当てが閉じられた際に獲得するクエリ料金の95%を受け取り、残りの5%は委任者に支払われます。
-
indexingRewardCut - インデックスリワードの%を示します。これが95%に設定されている場合、インデクサーは割り当てが閉じられた際に獲得するインデックスリワードの95%を受け取り、残りの5%は委任者で分割されます。
インデクサーは、サブグラフのインデキシングの決定に高度な技術を適用することで差別化を図ることができますが、一般的な考え方として、ネットワーク内のサブグラフを評価するために使用されるいくつかの主要な指標について説明します。
-
キュレーションシグナル - 特定のサブグラフに適用されたネットワークキュレーションシグナルの割合は、そのサブグラフへの関心を示す指標となり、特にクエリのボリュームが増加しているブートストラップ段階では有効となります。
-
コレクティド・クエリフィー - 特定のサブグラフに対してコレクティド・クエリフィー量の履歴データは、将来的な需要に対する指標となります。
-
ステーク量 - 他のインデクサーの行動を監視したり、特定のサブグラフに割り当てられた総ステーク量の割合を見ることで、インデクサーはサブグラフ・クエリの供給側を監視し、ネットワークが信頼を示しているサブグラフや、より多くの供給を必要としているサブグラフを特定することができます。
-
インデックス報酬のないサブグラフ - 一部のサブグラフは、主に IPFS などのサポートされていない機能を使用していたり、メインネット外の別のネットワークをクエリしていたりするため、インデックス報酬を生成しません。 インデクシング・リワードを生成していないサブグラフにはメッセージが表示されます。
- Small - いくつかのサブグラフのインデックス作成を開始するのに十分ですが、おそらく拡張が必要になります
- Standard - デフォルトのセットアップであり、k8s/terraform の展開マニフェストの例で使用されているものです
- Medium - 100 個のサブグラフと 1 秒あたり 200 ~ 500 のリクエストをサポートするプロダクションインデクサー
- Large - 現在使用されているすべてのサブグラフのインデックスを作成し、関連するトラフィックのリクエストに対応します
Setup | Postgres (CPUs) | Postgres (memory in GBs) | Postgres (disk in TBs) | VMs (CPUs) | VMs (memory in GBs) |
---|---|---|---|---|---|
Small | 4 | 8 | 1 | 4 | 16 |
Standard | 8 | 30 | 1 | 12 | 48 |
Medium | 16 | 64 | 2 | 32 | 64 |
Large | 72 | 468 | 3.5 | 48 | 184 |
-
オペレーター ウォレット - オペレーター ウォレットを設定することは重要な予防措置です。これにより、インデクサーは、ステークを制御するキーと日々の操作を制御するキーとの間の分離を維持できるようになります。 - デイ オペレーション。手順については、 を参照してください。
-
ファイアウォール - インデクサー サービスのみを公開する必要があり、管理ポートとデータベース アクセスのロックダウンに特に注意を払う必要があります: グラフ ノード JSON-RPC エンドポイント (デフォルト ポート: 8030)、インデクサー管理 API エンドポイント (既定のポート: 18000)、および Postgres データベース エンドポイント (既定のポート: 5432) は公開しないでください。
インデクサーのインフラストラクチャの中心にあるのは、インデックス化されたネットワークを監視し、サブグラフ定義ごとにデータを抽出してロードし、 として提供するグラフ ノードです。グラフ ノードは、各インデックス付きネットワークからのデータを公開するエンドポイントに接続する必要があります。データを調達するための IPFS ノード。そのストア用の PostgreSQL データベース。ネットワークとのやり取りを容易にするインデクサー コンポーネント。
-
PostgreSQL データベース - グラフノードのメインストアで、サブグラフのデータが格納されています。 また、インデクササービスとエージェントは、データベースを使用して、ステートチャネルデータ、コストモデル、およびインデクシングルールを保存します。
-
データ エンドポイント - EVM 互換ネットワークの場合、EVM 互換 JSON-RPC API を公開するエンドポイントにグラフ ノードを接続する必要があります。これは、単一のクライアントの形式をとる場合もあれば、複数の負荷を分散するより複雑なセットアップの場合もあります。特定のサブグラフには、アーカイブ モードやパリティ トレース API などの特定のクライアント機能が必要になることに注意してください。
-
IPFS ノード(バージョン 5 未満) - サブグラフのデプロイメタデータは IPFS ネットワーク上に保存されます。 グラフノードは、サブグラフのデプロイ時に主に IPFS ノードにアクセスし、サブグラフマニフェストと全てのリンクファイルを取得します。 ネットワーク・インデクサーは独自の IPFS ノードをホストする必要はありません。 ネットワーク用の IPFS ノードは、 でホストされています。
-
Indexer service - ネットワークとの必要な外部通信を全て処理します。 コストモデルとインデキシングのステータスを共有し、ゲートウェイからのクエリ要求をグラフノードに渡し、ゲートウェイとのステートチャンネルを介してクエリの支払いを管理します。
-
Indexer agent - ネットワークへの登録、グラフノードへのサブグラフのデプロイ管理、割り当ての管理など、チェーン上のインデクサーのインタラクションを容易にします。
-
Prometheus metrics server - Graph Node と Indexer コンポーネントは、自分のメトリクスをメトリクス・サーバーにログします。
注: アジャイルなスケーリングをサポートするには、クエリとインデックス作成の懸念事項を異なるノード セット (クエリ ノードとインデックス ノード) に分けることをお勧めします。
重要: ポートを公開する場合は注意してください。管理ポートはロックしておく必要があります。これには、Graph Node JSON-RPC と、以下に詳述するインデクサー管理エンドポイントが含まれます。
Port | Purpose | Routes | CLI Argument | Environment Variable |
---|---|---|---|---|
8000 | GraphQL HTTP server (for subgraph queries) | /subgraphs/id/... /subgraphs/name/.../... | --http-port | - |
8001 | GraphQL WS (for subgraph subscriptions) | /subgraphs/id/... /subgraphs/name/.../... | --ws-port | - |
8020 | JSON-RPC (for managing deployments) | / | --admin-port | - |
8030 | Subgraph indexing status API | /graphql | --index-node-port | - |
8040 | Prometheus metrics | /metrics | --metrics-port | - |
Port | Purpose | Routes | CLI Argument | Environment Variable |
---|---|---|---|---|
7600 | GraphQL HTTP server (for paid subgraph queries) | /subgraphs/id/... /status /channel-messages-inbox | --port | INDEXER_SERVICE_PORT |
7300 | Prometheus metrics | /metrics | --metrics-port | - |
Port | Purpose | Routes | CLI Argument | Environment Variable |
---|---|---|---|---|
8000 | Indexer management API | / | --indexer-management-port | INDEXER_AGENT_INDEXER_MANAGEMENT_PORT |
注:インデクサーは、AWS、Microsoft Azure、Alibabaを代替的に使用することができます。
- Google Cloud SDK
- Kubectl コマンドラインツール
- Terraform
-
Navigate to the
./terraform
directory, this is where all commands should be executed.
cd terraform
- Google Cloud で認証し、新しいプロジェクトを作成
gcloud auth loginproject=<PROJECT_NAME>gcloud projects create --enable-cloud-apis $project
-
Google Cloud Console の[billing page](課金ページ) を使用して、新しいプロジェクトの課金を有効にします。
-
Google Cloud の設定を作成します。
proj_id=$(gcloud projects list --format='get(project_id)' --filter="name=$project")gcloud config configurations create $projectgcloud config set project "$proj_id"gcloud config set compute/region us-central1gcloud config set compute/zone us-central1-a
- Google Cloud API の設定
gcloud services enable compute.googleapis.comgcloud services enable container.googleapis.comgcloud services enable servicenetworking.googleapis.comgcloud services enable sqladmin.googleapis.com
- サービスアカウントを作成
svc_name=<SERVICE_ACCOUNT_NAME>gcloud iam service-accounts create $svc_name \--description="Service account for Terraform" \--display-name="$svc_name"gcloud iam service-accounts list# Get the email of the service account from the listsvc=$(gcloud iam service-accounts list --format='get(email)'--filter="displayName=$svc_name")gcloud iam service-accounts keys create .gcloud-credentials.json \--iam-account="$svc"gcloud projects add-iam-policy-binding $proj_id \--member serviceAccount:$svc \--role roles/editor
- データベースと次のステップで作成する Kubernetes クラスター間のピアリングを有効化
gcloud compute addresses create google-managed-services-default \--prefix-length=20 \--purpose=VPC_PEERING \--network default \--global \--description 'IP Range for peer networks.' gcloud services vpc-peerings connect \--network=default \--ranges=google-managed-services-default
- Terraform 設定ファイルを作成(必要に応じて更新してください)
indexer=<INDEXER_NAME>cat > terraform.tfvars <<EOFproject = "$proj_id"indexer = "$indexer"database_password = "<database passowrd>"EOF
コマンドを実行する前に、に目を通し、このディレクトリにterraform.tfvars
というファイルを作成します(または、前のステップで作成したものを修正します)。 デフォルトを上書きしたい、あるいは値を設定したい各変数について、terraform.tfvars
に設定を入力します。
- 以下のコマンドを実行して、インフラを作成します。
# 必要なプラグインのインストールterraform init# 作成されるリソースのプランを見るterraform plan# リソースの作成(最大で30分程度かかる見込みです)terraform apply
kubectl apply -k $dir
ですべてのリソースをデプロイします。
gcloud container clusters get-credentials $indexerkubectl config use-context $(kubectl config get-contexts --output='name'| grep $indexer)
-
k8s/overlays
ディレクトリを新しいディレクトリ$dir,
にコピーし、$dir/kustomization.yaml
内のbases
エントリがk8s/base
ディレクトリを指すように調整します。 -
$dir
にあるすべてのファイルを読み、コメントに示されている値を調整します。
Deploy all resources with kubectl apply -k $dir
.
is an open source Rust implementation that event sources the Ethereum blockchain to deterministically update a data store that can be queried via the GraphQL endpoint. Developers use subgraphs to define their schema, and a set of mappings for transforming the data sourced from the blockchain and the Graph Node handles syncing the entire chain, monitoring for new blocks, and serving it via a GraphQL endpoint.
-
Rust
-
PostgreSQL
-
IPFS
-
Ubuntu ユーザーのための追加要件 - グラフノードを Ubuntu 上で動作させるためには、いくつかの追加パッケージが必要になります。
sudo apt-get install -y clang libpg-dev libssl-dev pkg-config
- PostgreSQL データベースサーバを起動します。
initdb -D .postgrespg_ctl -D .postgres -l logfile startcreatedb graph-node
cargo run -p graph-node --release -- \--postgres-url postgresql://[USERNAME]:[PASSWORD]@localhost:5432/graph-node \--ethereum-rpc [NETWORK_NAME]:[URL] \--ipfs https://ipfs.network.thegraph.com
- イーサリアムノード - デフォルトでは、docker compose setup は mainnet: を使ってホストマシン上のイーサリアムノードに接続します。 このネットワーク名と URL は、
docker-compose.yaml
を更新することで置き換えることができます。
- Graph Node をクローンし、Docker ディレクトリに移動します。
git clone https://github.com/graphprotocol/graph-nodecd graph-node/docker
- Linux ユーザーのみ - 付属のスクリプトを使って、
docker-compose.yaml
の中でhost.docker.internal
の代わりにホストの IP アドレスを使用します:
./setup.sh
- Ethereum のエンドポイントに接続し、ローカルの Graph Node を起動します:
docker-compose up
ネットワークへの参加を成功させるためには、ほぼ常に監視と対話を行う必要があるため、Indexers のネットワークへの参加を促進するための一連の Typescript アプリケーションを構築しました。 インデクサーには 3 つのコンポーネントがあります:
-
Indexer agent - ネットワークとインデクサー自身のインフラを監視し、どのサブグラフ・デプロイメントがインデキシングされ、チェーンに割り当てられるか、またそれぞれにどれだけの量が割り当てられるかを管理します。
-
Indexer service - 外部に公開する必要のある唯一のコンポーネントで、サブグラフのクエリをグラフノードに渡し、クエリの支払いのための状態チャンネルを管理し、重要な意思決定情報をゲートウェイなどのクライアントに共有します。
-
Indexer CLI - インデクサーエージェントを管理するためのコマンドラインインターフェイスです。これによって、インデクサーはコストモデル、手動割り当て、アクションキュー、 インデックスルールを管理することができます。
インデクサー エージェントとインデクサー サービスは、グラフ ノード インフラストラクチャと同じ場所に配置する必要があります。 インデクサー コンポーネントの仮想実行環境をセットアップするには、さまざまな方法があります。 ここでは、NPM パッケージまたはソースを使用するか、Google Cloud Kubernetes Engine 上の kubernetes と Docker を介してベアメタル上でそれらを実行する方法を説明します。 これらの設定例がご使用のインフラストラクチャにうまく反映されない場合は、参考となるコミュニティ ガイドがある可能性があります。 にお越しください。 インデクサー コンポーネントを起動する前に、忘れずに してください。
npm install -g @graphprotocol/indexer-servicenpm install -g @graphprotocol/indexer-agent# Indexer CLI is a plugin for Graph CLI, so both need to be installed:npm install -g @graphprotocol/graph-clinpm install -g @graphprotocol/indexer-cli# Indexer servicegraph-indexer-service start ...# Indexer agentgraph-indexer-agent start ...# Indexer CLI#Forward the port of your agent pod if using Kuberneteskubectl port-forward pod/POD_ID 18000:8000graph indexer connect http://localhost:18000/graph indexer ...
# From Repo root directoryyarn# Indexer Servicecd packages/indexer-service./bin/graph-indexer-service start ...# Indexer agentcd packages/indexer-agent./bin/graph-indexer-service start ...# Indexer CLIcd packages/indexer-cli./bin/graph-indexer-cli indexer connect http://localhost:18000/./bin/graph-indexer-cli indexer ...
- レジストリからイメージを引き出す
docker pull ghcr.io/graphprotocol/indexer-service:latestdocker pull ghcr.io/graphprotocol/indexer-agent:latest
または、ソースからローカルにイメージをビルドします
# Indexer servicedocker build \--build-arg NPM_TOKEN=<npm-token> \-f Dockerfile.indexer-service \-t indexer-service:latest \# Indexer agentdocker build \--build-arg NPM_TOKEN=<npm-token> \-f Dockerfile.indexer-agent \-t indexer-agent:latest \
- コンポーネントの実行
docker run -p 7600:7600 -it indexer-service:latest ...docker run -p 18000:8000 -it indexer-agent:latest ...
注: コンテナーを開始すると、 でインデクサー サービスにアクセスできるようになります。 であり、インデクサー エージェントは でインデクサー管理 API を公開する必要があります。
注:全てのランタイム設定変数は、起動時にコマンドのパラメーターとして適用するか、COMPONENT_NAME_VARIABLE_NAME
(例:INDEXER_AGENT_ETHEREUM
)という形式の環境変数を使用することができます。
graph-indexer-agent start \--ethereum <MAINNET_ETH_ENDPOINT> \--ethereum-network mainnet \--mnemonic <MNEMONIC> \--indexer-address <INDEXER_ADDRESS> \--graph-node-query-endpoint http://localhost:8000/ \--graph-node-status-endpoint http://localhost:8030/graphql \--graph-node-admin-endpoint http://localhost:8020/ \--public-indexer-url http://localhost:7600/ \--indexer-geo-coordinates <YOUR_COORDINATES> \--index-node-ids default \--indexer-management-port 18000 \--metrics-port 7040 \--network-subgraph-endpoint http://query-node-0:8000/subgraphs/id/QmUzRg2HHMpbgf6Q4VHKNDbtBEJnyp5JWCh2gUX9AV6jXv \--default-allocation-amount 100 \--register true \--inject-dai true \--postgres-host localhost \--postgres-port 5432 \--postgres-username <DB_USERNAME> \--postgres-password <DB_PASSWORD> \--postgres-database indexer \--allocation-management auto \| pino-pretty
SERVER_HOST=localhost \SERVER_PORT=5432 \SERVER_DB_NAME=is_staging \SERVER_DB_USER=<DB_USERNAME> \SERVER_DB_PASSWORD=<DB_PASSWORD> \graph-indexer-service start \--ethereum <MAINNET_ETH_ENDPOINT> \--ethereum-network mainnet \--mnemonic <MNEMONIC> \--indexer-address <INDEXER_ADDRESS> \--port 7600 \--metrics-port 7300 \--graph-node-query-endpoint http://localhost:8000/ \--graph-node-status-endpoint http://localhost:8030/graphql \--postgres-host localhost \--postgres-port 5432 \--postgres-username <DB_USERNAME> \--postgres-password <DB_PASSWORD> \--postgres-database is_staging \--network-subgraph-endpoint http://query-node-0:8000/subgraphs/id/QmUzRg2HHMpbgf6Q4VHKNDbtBEJnyp5JWCh2gUX9AV6jXv \| pino-pretty
インデクサー CLI は、 アクセス可能なプラグインですターミナルの graph indexer
で。
graph indexer connect http://localhost:18000graph indexer status
Indexer Management API と対話するための推奨ツールは Indexer CLI で、これは Graph CLI を拡張したものです。インデクサーエージェントは、インデクサーに代わって自律的にネットワークと対話するために、 インデクサからの入力を必要とします。インデクサーエージェントの動作を定義する仕組みは、 ** 割り当て管理モードと ** インデックスルール です。auto モードでは、Indexer は indexing rules を使って、インデックスやクエリを提供するサブグラフを選択するための特定の戦略を適用することができます。ルールは、エージェントが提供する GraphQL API を介して管理され、 Indexer Management API として知られています。手動モードでは、Indexer は action queue を使って割り当てアクションを作成し、実行される前に明示的に承認することができます。oversight モードでは、indexing rules を使って action queue を作成し、実行のために明示的な承認が必要です。
Indexer CLIは、通常ポート・フォワーディングを介してインデクサー・エージェントに接続するため、CLI が同じサーバやクラスタ上で動作する必要はありません。 ここでは CLI について簡単に説明します。
-
graph indexer connect <url>
- インデクサー管理 API に接続します。 通常、サーバーへの接続はポートフォワーディングによって開かれ、CLI をリモートで簡単に操作できるようになります。 (例:kubectl port-forward pod/<indexer-agent-pod> 8000:8000
) -
graph インデクサー ルール get [options] <deployment-id> [<キー1> ...]
-all
を<deployment-id>
として使用して 1 つ以上のインデックス作成ルールを取得し、すべてのルールを取得するか、global< /code> グローバルなデフォルトを取得します。追加の引数 <code>--merged
を使用して、展開固有のルールをグローバル ルールとマージすることを指定できます。これは、インデクサー エージェントでそれらがどのように適用されるかです。 -
graph indexer rules set [options] <deployment-id> <key1> <value1> ...
- 1 つまたは複数のインデキシング規則を設定します。 -
graph indexer rules start [options] <deployment-id>
- 利用可能な場合はサブグラフ配置のインデックス作成を開始し、decisionBasis
をalways
に設定するので、インデクサー・エージェントは常にインデキシングを選択します。 グローバル ルールが always に設定されている場合、ネットワーク上のすべての利用可能なサブグラフがインデックス化されます。 -
graph indexer rules stop [options] <deployment-id>
- 配置のインデックス作成を停止し、decisionBasis
を never に設定することで、インデックスを作成する配置を決定する際にこの配置をスキップします。 -
graph indexer rules maybe [options] <deployment-id>
- 配置のthedecisionBasis
をrules
に設定し、インデクサーエージェントがインデキシングルールを使用して、この配置にインデックスを作成するかどうかを決定するようにします。 -
graph indexer actions get [options] <action-id>
- Fetch one or more actions usingall
or leaveaction-id
empty to get all actions. An additional argument--status
can be used to print out all actions of a certain status. -
graph indexer action queue allocate <deployment-id> <allocation-amount>
- キューの割り当てアクション。 -
graph indexer action queue reallocate <deployment-id> <allocation-id> <allocationAmount>
- queue reallocate actionを実行します。 -
graph indexer action queue unallocate <deployment-id> <allocation-id>
- queue unallocate actionを実行します。 -
graph indexer actions cancel [<action-id> ...]
- idが未指定の場合はキュー内の全てのアクションをキャンセル、それ以外はスペースをセパレータとしたidの配列をキャンセルします。 -
graph indexer actions approve [<action-id> ...]
- 複数のアクションの実行を承認します。 -
graph indexer actions execute approve
- 承認されたアクションを直ちに実行するようにワーカーを強制します。
出力にルールを表示するすべてのコマンドは、-output
引数を使用して、サポートされている出力形式(table
, yaml
, and json
) の中から選択できます。
インデキシングルールは、グローバルなデフォルトとして、または ID を使用して特定のサブグラフデプロイメントに適用できます。 deployment
とdecisionBasis
フィールドは必須で、その他のフィールドはすべてオプションです。 インデキシングルールがdecisionBasis
としてrules
を持つ場合、インデクサー・エージェントは、そのルール上の非 NULL の閾値と、対応する配置のためにネットワークから取得した値を比較します。 サブグラフデプロイメントがいずれかのしきい値以上(または以下)の値を持つ場合、それはインデキシングのために選択されます。
例えば、グローバル ルールのminStake
が5(GRT) の場合、5(GRT) 以上のステークが割り当てられているサブグラフデプロイメントは、インデックスが作成されます。 しきい値ルールには、 maxAllocationPercentage
, minSignal
, maxSignal
, minStake
, and minAverageQueryFees
があります。
データモデル
type IndexingRule {identifier: stringidentifierType: IdentifierTypedecisionBasis: IndexingDecisionBasis!allocationAmount: number | nullallocationLifetime: number | nullautoRenewal: booleanparallelAllocations: number | nullmaxAllocationPercentage: number | nullminSignal: string | nullmaxSignal: string | nullminStake: string | nullminAverageQueryFees: string | nullcustom: string | nullrequireSupported: boolean | null}IdentifierType {deploymentsubgraphgroup}IndexingDecisionBasis {rulesneveralwaysoffchain}
インデックスルールの使用例:
graph indexer rules offchain QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEKgraph indexer rules set QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK decisionBasis always allocationAmount 123321 allocationLifetime 14 autoRenewal false requireSupported falsegraph indexer rules stop QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEKgraph indexer rules delete QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK
indexer-cli は、アクションキューを手動で操作するための actions
モジュールを提供します。これは、アクションキューと対話するために、インデクサ管理サーバによってホストされる Graphql API を使用します。
アクション実行ワーカーは、ActionStatus = approved
である場合にのみ、実行するためにキューからアイテムを取得します。推奨されるパスでは、アクションは ActionStatus = queued でキューに追加されるので、オンチェインで実行するためには承認されなければなりません。一般的なフローは次のようになります。
- サードパーティのオプティマイザツールやindexer-cliのユーザーによってキューに追加されたアクション
- インデクサーは
indexer-cli
を使って、キューに入れられたすべてのアクションを見ることができます。 - インデクサー(または他のソフトウェア) は、キュー内のアクションを
indexer-cli
を使って承認または取り消すことができます。approve と cancel コマンドは、入力としてアクション ID の配列を取ります。 - 実行ワーカーは定期的に承認されたアクションのためにキューをポーリングします。キューから
approved
アクションを取得し、実行を試み、実行状況に応じて db の値をsuccess
またはfailed
に更新します。 - アクションが成功した場合、ワーカーは、エージェントが
auto
またはoversight
モードの間に手動アクションを取るときに便利な、今後どのように割り当てを管理するかを示すインデックス付けルールが存在することを確認します。 - インデクサーはアクションキューを監視してアクションの実行履歴を確認し、必要であれば、実行に失敗したアクションアイテムを再承認して更新することができます。アクションキューは、キューに入れられ、実行されたすべてのアクションの履歴を提供します。
データモデル:
Type ActionInput {status: ActionStatustype: ActionTypedeploymentID: string | nullallocationID: string | nullamount: string | nullpoi: string | nullforce: boolean | nullsource: stringreason: string | nullpriority: number | null}ActionStatus {queuedapprovedpendingsuccessfailedcanceled}ActionType {allocateunallocatereallocatecollect}
ソースからの使用例:
graph indexer actions get allgraph indexer actions get --status queuedgraph indexer actions queue allocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 5000graph indexer actions queue reallocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 0x4a58d33e27d3acbaecc92c15101fbc82f47c2ae5 55000graph indexer actions queue unallocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 0x4a58d33e27d3acbaecc92c15101fbc82f47c2aegraph indexer actions cancelgraph indexer actions approve 1 3 5graph indexer actions execute approve
割り当て管理でサポートされるアクションタイプは、入力要件が異なることに注意してください。
-
Allocate
- 特定のサブグラフの配置にステークを割り当てます。- 必要なアクションパラメータを指定します:
- デプロイメントID
- 量
- 必要なアクションパラメータを指定します:
-
Unallocate
- 割り当てを終了し、他の場所に再割り当てするためにステークを解放します。- 必要なアクションパラメータを指定します:
- アロケーションID
- デプロイメントID
- 任意のアクションパラメータ:
- poi
- force (グラフノードが提供するものと一致しなくても、提供されたPOIを使用することを強制する)
- 必要なアクションパラメータを指定します:
-
Reallocate
- アロケーションをアトミックにクローズし、同じサブグラフのために新しいアロケーションをオープンします。- 必要なアクションパラメータを指定します:
- アロケーションID
- デプロイメントID
- 量
- 任意のアクションパラメータ:
- poi
- force (グラフノードが提供するものと一致しなくても、提供されたPOIを使用することを強制する)
- 必要なアクションパラメータを指定します:
コストモデルは、マーケットやクエリ属性に基づいて、クエリの動的な価格設定を行います。 インデクサーサービスは、クエリに応答する予定の各サブグラフのコストモデルをゲートウェイと共有します。 一方、ゲートウェイはコストモデルを使用して、クエリごとにインデクサーの選択を決定し、選択されたインデクサーと支払いの交渉を行います。
Agora 言語は、クエリのコストモデルを宣言するための柔軟なフォーマットを提供します。 Agora のコストモデルは、GraphQL クエリのトップレベルのクエリごとに順番に実行される一連のステートメントです。 各トップレベルのクエリに対して、それにマッチする最初のステートメントがそのクエリの価格を決定します。
ステートメントは、GraphQL クエリのマッチングに使用される述語と、評価されると decimal GRT でコストを出力するコスト式で構成されます。 クエリの名前付き引数の位置にある値は、述語の中に取り込まれ、式の中で使用されます。 また、グローバルを設定し、式のプレースホルダーとして代用することもできます。
コストモデルの例:
# This statement captures the skip value,# uses a boolean expression in the predicate to match specific queries that use `skip`# and a cost expression to calculate the cost based on the `skip` value and the SYSTEM_LOAD globalquery { pairs(skip: $skip) { id } } when $skip > 2000 => 0.0001 * $skip * $SYSTEM_LOAD;# This default will match any GraphQL expression.# It uses a Global substituted into the expression to calculate costdefault => 0.1 * $SYSTEM_LOAD;
上記のモデルを使用したクエリのコスト計算の例:
クエリ | 価格 |
---|---|
{ pairs(skip: 5000) { id } } | 0.5 GRT |
{ トークン { シンボル } } | 0.1 GRT |
{ pairs(skip: 5000) { id } tokens { symbol } } | 0.6 GRT |
コストモデルは Indexer CLI を通じて適用され、それをインデクサー・エージェントの Indexer Management API に渡してデータベースに格納します。 その後、インデクサーサービスがこれを受け取り、ゲートウェイから要求があるたびにコスト・モデルを提供します。
indexer cost set variables '{ "SYSTEM_LOAD": 1.4 }'indexer cost set model my_model.agora
The first steps to participating in the network as an Indexer are to approve the protocol, stake funds, and (optionally) set up an operator address for day-to-day protocol interactions.
Note: For the purposes of these instructions Remix will be used for contract interaction, but feel free to use your tool of choice (, , and are a few other known tools).
インデクサーがプロトコルにGRTをステークすると、を立ち上げ、ネットワークとのやりとりを開始することができます。
With
GraphToken.abi
selected and open in the editor, switch to theDeploy and run transactions
section in the Remix interface.環境から[
Injected Web3
] を選択し、Account
でインデクサーアドレスを選択します。GraphToken のコントラクトアドレスの設定 -
At Address
の横に GraphToken のコントラクトアドレス(0xc944E90C64B2c07662A292be6244BDf05Cda44a7
) を貼り付け、At Address
ボタンをクリックして適用します。approve(spender, amount)
関数を呼び出し、ステーキング契約を承認します。spender
にはステーキングコントラクトアドレス(0xF55041E37E12cD407ad00CE2910B8269B01263b9
)を、amount
にはステークするトークン(単位:wei)を記入します。
File Explorer
でStaking.abiという名前のファイルを作成し、Staking ABI を指定します。With
Staking.abi
selected and open in the editor, switch to theDeploy and run transactions
section in the Remix interface.環境から[
Injected Web3
] を選択し、Account
でインデクサーアドレスを選択します。Staking contract address の設定 -
At Address
の横に Staking contract address (0xF55041E37E12cD407ad00CE2910B8269B01263b9
) を貼り付け、At Address
ボタンをクリックして適用します。stake()
を呼び出して、GRT をプロトコルにステークします。(オプション)インデクサーは、資金を管理する鍵と、サブグラフへの割り当てや(有料の)クエリの提供などの日常的な動作を行う鍵とを分離するために、別のアドレスをインデクサインフラストラクチャのオペレーターとして承認することができます。 オペレーターを設定するには、オペレーターのアドレスを指定して
setOperator()
をコールします。(オプション) 報酬の分配を制御し、デリゲータを戦略的に引き付けるために、 インデクサーは indexingRewardCut (parts per million)、 queryFeeCut (parts per million)、 cooldownBlocks (number of blocks) を更新することで、 デリゲーションパラメータを更新することができます。 これを行うには
setDelegationParameters()
をコールします。 次の例では、クエリフィーカットをクエリリベートの 95%をインデクサーに、5%をデリゲーターに分配するように設定し、インデクサーリワードカットをインデキシング報酬の 60%をインデクサーに、40%をデリゲーターに分配するよう設定し、thecooldownBlocks
期間を 500 ブロックに設定しています。
setDelegationParameters(950000, 600000, 500)
The setDelegationParameters()
function in the is essential for Indexers, allowing them to set parameters that define their interactions with Delegators, influencing their reward sharing and delegation capacity.
To set the delegation parameters using Graph Explorer interface, follow these steps:
- Navigate to .
- Connect your wallet. Choose multisig (such as Gnosis Safe) and then select mainnet. Note: You will need to repeat this process for Arbitrum One.
- Connect the wallet you have as a signer.
- Navigate to the 'Settings' section and select 'Delegation Parameters'. These parameters should be configured to achieve an effective cut within the desired range. Upon entering values in the provided input fields, the interface will automatically calculate the effective cut. Adjust these values as necessary to attain the desired effective cut percentage.
- Submit the transaction to the network.
Note: This transaction will need to be confirmed by the multisig wallet signers.
After being created by an Indexer a healthy allocation goes through two states.
-
Active - Once an allocation is created on-chain () it is considered active. A portion of the Indexer's own and/or delegated stake is allocated towards a subgraph deployment, which allows them to claim indexing rewards and serve queries for that subgraph deployment. The Indexer agent manages creating allocations based on the Indexer rules.
-
Closed - An Indexer is free to close an allocation once 1 epoch has passed () or their Indexer agent will automatically close the allocation after the maxAllocationEpochs (currently 28 days). When an allocation is closed with a valid proof of indexing (POI) their indexing rewards are distributed to the Indexer and its Delegators ().
インデクサーは、チェーン上に配置を作成する前に、チェーンヘッドにサブグラフの配置を同期させるために、オフチェーン同期機能を利用することを推奨します。この機能は、同期に28エポック以上かかる可能性があるサブグラフや、不定期に失敗する可能性があるサブグラフに特に有効です。