indexing > Overview

索引

Reading time: 38 min

索引人是Graph 网络中的节点运营商,他们质押 Graph 通证 (GRT) 以提供索引和查询处理服务。 索引人通过他们的服务赚取查询费和索引奖励。 他们还根据 Cobbs-Douglas 回扣函数从回扣池中赚取收益,该回扣池与所有网络贡献者按他们的工作成比例共享。

抵押在协议中的 GRT 会受到解冻期的影响,如果索引人是恶意的并向应用程序提供不正确的数据或索引不正确,则可能会被削减。 索引人也可以从委托人那里获得委托,为网络做出贡献。

索引人根据子图的策展信号选择要索引的子图,其中策展人质押 GRT 以指示哪些子图是高质量的并应优先考虑。 消费者(例如应用程序)还可以设置索引人处理其子图查询的参数,并设置查询费用定价的偏好。

技术要求

ADVANCED

常见问题

链到本节

成为网络索引人所需的最低份额是多少?

链到本节

索引人的最低抵押数量目前设置为 10万个 GRT。

索引人的收入来源是什么?

链到本节

查询费返利 - 为网络上的查询服务支付的费用。这些支付通过索引人和网关之间的状态通道进行调解。来自网关的每个查询请求都包含一个支付和相应的响应,一个查询结果有效性的证明。

索引奖励 - 通过 3% 的年度协议范围通货膨胀生成,索引奖励分配给为网络索引子图部署的索引器。

索引奖励如何分配?

链到本节

索引奖励来自协议通胀,每年发行量设定为 3%。 它们根据每个子图上所有管理信号的比例分布在子图上,然后根据他们在该子图上分配的份额按比例分配给索引人。 一项分配必须以符合仲裁章程规定的标准的有效索引证明(POI)来结束,才有资格获得奖励。

Numerous tools have been created by the community for calculating rewards; you'll find a collection of them organized in the Community Guides collection. You can also find an up to date list of tools in the #Delegators and #Indexers channels on the Discord server. Here we link a recommended allocation optimiser integrated with the indexer software stack.

什么是索引证明 (POI)?

链到本节

网络中使用 POI 来验证索引人是否正在索引它们分配的子图。 在关闭该分配的分配时,必须提交当前时期第一个区块的 POI,才有资格获得索引奖励。 区块的 POI 是特定子图部署的所有实体存储交易的摘要,直到并包括该块。

索引奖励什么时候分配?

链到本节

当分配活动在28个时期内分配时,分配会不断累积奖励。奖励由索引人收集,并在分配结束时分发。 这可以手动发生,每当索引人想要强制关闭它们时,或者在 28 个时期后,委托人可以关闭索引人的分配,但这会导致没有奖励。28 个时期是最大分配生命周期(现在,一个 时期持续约 24 小时)。

可以监控待处理的索引人奖励吗?

链到本节

The RewardsManager contract has a read-only getRewards function that can be used to check the pending rewards for a specific allocation.

许多社区制作的仪表板包含悬而未决的奖励值,通过以下步骤可以很容易地手动检查这些值:

  1. Query the mainnet subgraph to get the IDs for all active allocations:
query indexerAllocations {
indexer(id: "<INDEXER_ADDRESS>") {
allocations {
activeForIndexer {
allocations {
id
}
}
}
}
}

使用 Etherscan 调用 getRewards():

  • 导航到奖励合约的 Etherscan 界面
  • 调用getRewards():
    • Expand the 9. getRewards dropdown.
    • 在输入中输入分配 ID.
    • 点击查询按钮.

争议是什么? 在哪里可以查看?

链到本节

在争议期间,索引人的查询和分配都可以在Graph上进行争论。 争议期限因争议类型而异。 查询/证明有 7 个时期的争议窗口,而分配有 56 个时期。 在这些期限过后,不能对分配或查询提出争议。 当争议开始时,Fishermen需要至少 10000 GRT 的押金,押金将被锁定,直到争议结束并给出解决方案。 Fishermen是任何引发争议的网络参与者。

争议有三种可能的结果,Fishermen的存款也是如此。

  • 如果争议被驳回,Fishermen存入的 GRT 将被消耗,争议的索引人将不会被削减。
  • 如果以平局方式解决争议,Fishermen的押金将被退还,并且争议的索引人不会被削减。
  • 如果争议被接受,Fishermen存入的 GRT 将被退回,有争议的索引人将被削减,Fishermen将获得被削减的 GRT的50%。

争议可以在用户界面中的 争议标签下的索引人档案页中查看。

什么是查询费返利? 何时分配?

链到本节

Query fees are collected by the gateway and distributed to indexers according to the exponential rebate function (see GIP here). The exponential rebate function is proposed as a way to ensure indexers achieve the best outcome by faithfully serving queries. It works by incentivizing Indexers to allocate a large amount of stake (which can be slashed for erring when serving a query) relative to the amount of query fees they may collect.

一旦分配已结束且争议期已过,索引人就可以要求回扣。 查询费用回扣根据查询费用减免和委托池比例分配给索引人及其委托人。

什么是查询费减免和索引奖励减免?

链到本节

queryFeeCutindexingRewardCut 值是委托的参数,该索引可以设置连同 cooldownBlocks 控制 GRT 的索引和他们的委托人之间的分配。 有关设置委托参数的说明,请参阅协议中的质押的最后步骤。

  • 查询费用削减 - 将分配给索引人的子图上累积的查询费用回扣的百分比。 如果将其设置为 95%,则在申请分配时,索引人将获得查询费用回扣池的 95%,另外 5% 将分配给委托人。

  • 索引奖励削减 - 分配给索引人的子图上累积的索引奖励的百分比。 如果将其设置为 95%,则当分配结束时,索引人将获得索引奖励池的 95%,而委托人将分配其他 5%。

索引人如何知道要索引哪些子图?

链到本节

索引人可以通过应用高级技术来进行子图索引决策,从而使自己与众不同,但为了给出一个大致的概念,我们将讨论几个用于评估网络中子图的关键指标:

  • 策展信号 - 应用于特定子图的网络策展信号的比例是对该子图兴趣的一个很好的指标,尤其是在引导阶段,当查询量不断上升时。

  • 收取的查询费 - 特定子图收取的查询费的历史数据是未来需求的良好指标。

  • 质押量 - 监控其他索引人的行为或查看分配给特定子图的总质押量的比例,可以让索引人监控子图查询的供应方,以确定网络显示出信心的子图或可能显示出需要更多供应的子图。

  • 没有索引奖励的子图 - 一些子图不会产生索引奖励,主要是因为它们使用了不受支持的功能,如 IPFS,或者因为它们正在查询主网之外的另一个网络。 如果子图未生成索引奖励,您将在子图上看到一条消息。

对硬件有什么要求?

链到本节
  • 小型 - 足以开始索引几个子图,可能需要扩展。
  • 标准 - 默认设置,这是在 k8s/terraform 部署清单示例中使用的。
  • 中型 - 生产型索引人支持 100 个子图和每秒 200-500 个请求。
  • 大型 -准备对当前使用的所有子图进行索引,并为相关流量的请求提供服务。
设置(CPU 数量)(内存 GB)(硬盘 TB)(CPU 数量)(内存 GB)
小型481416
标准83011248
中型166423264
大型724683.548184

索引人应该采取哪些基本的安全防范措施?

链到本节
  • 运营商钱包 - 设置运营商钱包是一项重要的预防措施,因为它允许索引器在控制股权的密钥和控制日常交易的密钥之间保持分离-天操作。有关说明,请参阅Stake in Protocol

  • 防火墙 - 只有索引人服务需要公开,尤其要注意锁定管理端口和数据库访问:Graph 节点 JSON-RPC 端点(默认端口:8030)、索引人管理 API 端点(默认端口:18000)和 Postgres 数据库端点(默认端口:5432)不应暴露。

基础设施

链到本节

索引人基础设施的中心是Graph节点,监控索引网络,根据子图定义提取和加载数据,并将其作为GraphQL API提供。Graph节点需要连接到一个端点,该端点暴露来自每个索引网络的数据;用于源数据的IPFS节点;用于其存储的PostgreSQL数据库;以及促进其与网络交互的索引人组件。

  • PostgreSQL 数据库 - Graph节点的主要存储,这是存储子图数据的地方。 索引人服务和代理也使用数据库来存储状态通道数据、成本模型、索引规则以及分配操作。

  • 数据端点-对于兼容EVM的网络,Graph节点需要连接到一个公开兼容EVM JSON-RPC API的端点。这可以采取单个客户端的形式,也可以是跨多个客户端进行负载平衡的更复杂的设置。需要注意的是,某些子图将需要特定的客户端功能,如存档模式和/或奇偶校验跟踪API。

  • IPFS 节点(版本小于 5) - 子图部署元数据存储在 IPFS 网络上。 Graph节点在子图部署期间主要访问 IPFS 节点,以获取子图清单和所有链接文件。 网络索引人不需要托管自己的 IPFS 节点,网络的 IPFS 节点是托管在https://ipfs.network.thegraph.com。

  • 索引人服务 -处理所有网络必要的外部通信。 共享成本模型和索引状态,将来自网关的查询请求传递给一个Graph节点,并通过状态通道与网关管理查询支付。

  • 索引人代理 - 促进索引人在链上的交互,包括在网络上注册,管理子图部署到其Graph节点,以及管理分配。

  • Prometheus 指标服务器 - Graph节点 和索引人组件将其指标记录到指标服务器。

注意:为了支持敏捷扩展,建议在不同的节点集之间分开查询和索引问题:查询节点和索引节点。

端口概述

链到本节

重要: 公开暴露端口时要小心 - 管理端口 应保持锁定。 这包括下面详述的Graph节点 JSON-RPC 和索引人管理端点。

Graph 节点

链到本节
端口用途路径CLI 参数环境 变量
8000GraphQL HTTP 服务
(用于子图查询)
/subgraphs/id/...

/subgraphs/name/.../...
--http-port-
8001GraphQL WS
(用于子图订阅)
/subgraphs/id/...
/subgraphs/name/.../...
--ws-port-
8020JSON-RPC
(用于管理部署)
/--admin-port-
8030子图索引状态 API/graphql--index-node-port-
8040Prometheus 指标/metrics--metrics-port-

索引人服务

链到本节
端口用途路径CLI 参数环境 变量
7600GraphQL HTTP 服务器
(用于付费子图查询)
/subgraphs/id/...
/status
/channel-messages-inbox
--portINDEXER_SERVICE_PORT
7300Prometheus 指标/metrics--metrics-port-

索引人代理

链到本节
端口用途路径CLI 参数环境 变量
8000索引人管理 API/--indexer-management-portINDEXER_AGENT_INDEXER_MANAGEMENT_PORT

在谷歌云上使用 Terraform 建立服务器基础设施

链到本节

注意:索引人可以选择使用AWS,Microsoft Azure, or Alibaba。

安装先决条件

链到本节
  • 谷歌云 SDK
  • Kubectl 命令行工具
  • Terraform

创建一个谷歌云项目

链到本节
  • Clone or navigate to the Indexer repository.

  • Navigate to the ./terraform directory, this is where all commands should be executed.

cd terraform
  • 通过谷歌云认证并创建一个新项目。
gcloud auth login
project=<PROJECT_NAME>
gcloud projects create --enable-cloud-apis $project
  • 使用 Google Cloud Console 的计费页面为新项目启用计费。

  • 创建谷歌云配置。

proj_id=$(gcloud projects list --format='get(project_id)' --filter="name=$project")
gcloud config configurations create $project
gcloud config set project "$proj_id"
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
  • 启用所需的 Google Cloud API。
gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
gcloud services enable servicenetworking.googleapis.com
gcloud 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 list
svc=$(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 <<EOF
project = "$proj_id"
indexer = "$indexer"
database_password = "<database passowrd>"
EOF

使用 Terraform 创建基础设施

链到本节

在运行任何命令之前,先阅读 variables.tf 并在这个目录下创建一个文件terraform.tfvars(或者修改我们在上一步创建的文件)。 对于每一个想要覆盖默认值的变量,或者需要设置值的变量,在 terraform.tfvars中输入一个设置。

  • 运行以下命令来创建基础设施。
# Install required plugins
terraform init
# View plan for resources to be created
terraform plan
# Create the resources (expect it to take up to 30 minutes)
terraform apply

将新集群的凭据下载到~/.kube/config中,并将其设置为默认背景。

gcloud container clusters get-credentials $indexer
kubectl config use-context $(kubectl config get-contexts --output='name'
| grep $indexer)

为索引人创建 Kubernetes 组件

链到本节
  • 将目录k8s/overlays 复制到新的目录 $dir, 中,并调整bases 进入中的$dir/kustomization.yaml条目,使其指向目录k8s/base

  • 读取$dir中的所有文件,并按照注释中的指示调整任何值。

用以下方法部署所有资源kubectl apply -k $dir.

Graph节点

链到本节

Graph Node 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.

从来源开始

链到本节

安装先决条件

链到本节
  • PostgreSQL

  • IPFS

  • Ubuntu 用户的附加要求 - 要在 Ubuntu 上运行 Graph 节点,可能需要一些附加的软件包。

sudo apt-get install -y clang libpg-dev libssl-dev pkg-config

设置

链到本节
  1. 启动 PostgreSQL 数据库服务器
initdb -D .postgres
pg_ctl -D .postgres -l logfile start
createdb graph-node
  1. 克隆Graph 节点repo,并通过运行 cargo build来构建源代码。

  2. 现在,所有的依赖关系都已设置完毕,启动 Graph节点。

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

链到本节

先决条件

链到本节
  • Ethereum 节点 - 默认情况下,docker 编译设置将使用 mainnet:http://host.docker.internal:8545 连接到主机上的以太坊节点。 你可以通过更新 docker-compose.yaml来替换这个网络名和 url。

设置

链到本节
  1. 克隆Graph节点并导航到Docker目录。
git clone https://github.com/graphprotocol/graph-node
cd graph-node/docker
  1. 仅适用于linux用户 - 在docker-compose.yaml中使用主机IP地址代替 host.docker.internal并使用附带的脚本。
./setup.sh
  1. 启动一个本地Graph节点,它将连接到你的以太坊端点。
docker-compose up

索引人组件

链到本节

要成功地参与网络,需要几乎持续的监控和互动,所以我们建立了一套 Typescript 应用程序,以方便索引人的网络参与。 有三个索引人组件。

  • 索引人代理 - 代理监控网络和索引人自身的基础设施,并管理哪些子图部署被索引和分配到链上,以及分配到每个子图的数量。

  • 索引人服务 - 唯一需要对外暴露的组件,该服务将子图查询传递给节点,管理查询支付的状态通道,将重要的决策信息分享给网关等客户端。

  • 索引人 CLI - 用于管理索引人代理的命令行界面。 它允许索引人管理成本模型、手动分配、操作队列和索引规则。

开始

链到本节

The Indexer agent and Indexer service should be co-located with your Graph Node infrastructure. There are many ways to set up virtual execution environments for your Indexer components; here we'll explain how to run them on baremetal using NPM packages or source, or via kubernetes and docker on the Google Cloud Kubernetes Engine. If these setup examples do not translate well to your infrastructure there will likely be a community guide to reference, come say hi on Discord! Remember to stake in the protocol before starting up your Indexer components!

来自 NPM 包

链到本节
npm install -g @graphprotocol/indexer-service
npm install -g @graphprotocol/indexer-agent
# Indexer CLI is a plugin for Graph CLI, so both need to be installed:
npm install -g @graphprotocol/graph-cli
npm install -g @graphprotocol/indexer-cli
# Indexer service
graph-indexer-service start ...
# Indexer agent
graph-indexer-agent start ...
# Indexer CLI
#Forward the port of your agent pod if using Kubernetes
kubectl port-forward pod/POD_ID 18000:8000
graph indexer connect http://localhost:18000/
graph indexer ...

来自数据源

链到本节
# From Repo root directory
yarn
# Indexer Service
cd packages/indexer-service
./bin/graph-indexer-service start ...
# Indexer agent
cd packages/indexer-agent
./bin/graph-indexer-service start ...
# Indexer CLI
cd packages/indexer-cli
./bin/graph-indexer-cli indexer connect http://localhost:18000/
./bin/graph-indexer-cli indexer ...

使用 docker

链到本节
  • 从注册表中提取图像
docker pull ghcr.io/graphprotocol/indexer-service:latest
docker pull ghcr.io/graphprotocol/indexer-agent:latest

或从数据源本地生成图像

# Indexer service
docker build \
--build-arg NPM_TOKEN=<npm-token> \
-f Dockerfile.indexer-service \
-t indexer-service:latest \
# Indexer agent
docker 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 ...

**注意:**启动容器后,索引人服务应该在http://localhost:7600可用,而且索引人代理应该被暴露在http://localhost:18000/索引人管理API。

使用 K8s 和 Terraform

链到本节

请参阅在Google Cloud上使用Terraform设置服务器基础结构一节。

使用方法

链到本节

注意: 所有的运行时配置变量可以在启动时作为参数应用到命令中,也可以使用格式为 COMPONENT_NAME_VARIABLE_NAME(ex. 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

链到本节

Indexer CLI 是一个可以在终端访问graph indexer的插件,地址是@graphprotocol/graph-cli

graph indexer connect http://localhost:18000
graph indexer status

使用Indexer CLI 管理索引人

链到本节

Indexer Management API交互的建议工具是 IndexerCLI,它是 GraphCLI 的扩展。Indexer 代理需要来自 Indexer 的输入,以便代表 Indexer 与网络进行自主交互。定义 Indexer 代理行为的机制是分配管理模式和索引规则。在自动模式下,Indexer 可以使用索引规则应用它们的特定策略来选择子图以索引并查询。规则通过代理提供的 GraphQLAPI 进行管理,称为 Indexer Management API。在手动模式下,索引人可以使用操作队列创建分配操作,并在操作队列执行之前显式批准它们。在监督模式下,索引规则用于填充操作队列,并且还需要执行的显式批准。

使用方法

链到本节

Indexer CLI连接到索引人代理,通常是通过端口转发,因此 CLI 不需要运行在同一服务器或集群上。 为了帮助你入门,并提供一些背景,这里将简要介绍 CLI。

  • graph indexer connect <url> - 连接到索引人管理 API。 通常情况下,与服务器的连接是通过端口转发打开的,所以 CLI 可以很容易地进行远程操作。 (例如: kubectl port-forward pod/<indexer-agent-pod> 8000:8000)

  • graph indexer rules get [options] <deployment-id> [<key1> ...] -获取一个或多个索引规则,使用 all 作为<deployment-id> 来获取所有规则,或使用 global 来获取全局默认规则。 可以使用额外的参数 --merged 来指定将特定部署规则与全局规则合并。 这就是它们在索引人代理中的应用方式。

  • graph indexer rules set [options] <deployment-id> <key1> <value1> ... -设置一个或多个索引规则。

  • graph indexer rules start [options] <deployment-id> - 开始索引子图部署(如果可用),并将其decisionBasis设置为always, 这样索引人代理将始终选择对其进行索引。 如果全局规则被设置为总是,那么网络上所有可用的子图都将被索引。

  • graph indexer rules stop [options] <deployment-id> -停止对某个部署进行索引,并将其 decisionBasis设置为 never, 这样它在决定要索引的部署时就会跳过这个部署。

  • graph indexer rules maybe [options] <deployment-id> —将部署的 thedecisionBasis设置为规则, 这样索引人代理将使用索引规则来决定是否对这个部署进行索引。

  • graph indexer actions get [options] <action-id> - Fetch one or more actions using all or leave action-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> -队列重新分配操作

  • graph indexer action queue unallocate <deployment-id> <allocation-id> - 队列未分配操作

  • 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 应用于特定的子图部署。部署decisionBase 字段是强制性的,而所有其他字段都是可选的。当索引规则具有规则作为 decisionBase 时,索引人代理将比较该规则上的非空阈值与从网络获取的用于相应部署的值。如果子图部署的值高于(或低于) 任何阈值,则将选择它进行索引。

例如,如果全局规则的minStake 值为5 (GRT), 则分配给它的份额超过 5 (GRT) 的任何子图部署都将被编入索引。 阈值规则包括maxAllocationPercentage, minSignal, maxSignal, minStake, 和 minAverageQueryFees.

数据模型:

type IndexingRule {
identifier: string
identifierType: IdentifierType
decisionBasis: IndexingDecisionBasis!
allocationAmount: number | null
allocationLifetime: number | null
autoRenewal: boolean
parallelAllocations: number | null
maxAllocationPercentage: number | null
minSignal: string | null
maxSignal: string | null
minStake: string | null
minAverageQueryFees: string | null
custom: string | null
requireSupported: boolean | null
}
IdentifierType {
deployment
subgraph
group
}
IndexingDecisionBasis {
rules
never
always
offchain
}

索引规则用法示例:

graph indexer rules offchain QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK
graph indexer rules set QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK decisionBasis always allocationAmount 123321 allocationLifetime 14 autoRenewal false requireSupported false
graph indexer rules stop QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK
graph indexer rules delete QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK

操作队列CLI

链到本节

Indexer-cli 提供了一个 actions 模块,用于手动处理操作队列。它使用由索引器管理服务器托管的 Graphql API 与操作队列进行交互。

如果ActionStatus=已批准,则操作执行工作人员将仅从队列中获取要执行的项目。在推荐的路径中,操作被添加到ActionStatus=queued的队列中,因此必须经过批准才能在链上执行。一般流程如下:

  • 第三方优化器工具或indexer-cli用户添加到队列的操作
  • 索引人可以使用indexer-cli查看所有排队的操作
  • 索引人(或其他软件)可以使用indexer-cli批准或取消队列中的操作。批准和取消命令将一组操作ID作为输入。
  • 执行工作人员定期轮询队列以获得批准的操作。它将从队列中获取已批准的操作,尝试执行它们,并根据执行状态将数据库中的值更新为成功失败
  • 如果操作成功,工作人员将确保存在索引规则,告诉代理如何管理向前的分配,这在代理处于自动监督模式时进行手动操作非常有用。
  • 索引人可以监视操作队列以查看操作执行的历史记录,如果需要,可以在操作项执行失败时重新批准和更新操作项。操作队列提供排队和执行的所有操作的历史记录。

数据模型:

Type ActionInput {
status: ActionStatus
type: ActionType
deploymentID: string | null
allocationID: string | null
amount: string | null
poi: string | null
force: boolean | null
source: string
reason: string | null
priority: number | null
}
ActionStatus {
queued
approved
pending
success
failed
canceled
}
ActionType {
allocate
unallocate
reallocate
collect
}

数据源用法示例

graph indexer actions get all
graph indexer actions get --status queued
graph indexer actions queue allocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 5000
graph indexer actions queue reallocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 0x4a58d33e27d3acbaecc92c15101fbc82f47c2ae5 55000
graph indexer actions queue unallocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 0x4a58d33e27d3acbaecc92c15101fbc82f47c2ae
graph indexer actions cancel
graph indexer actions approve 1 3 5
graph indexer actions execute approve

请注意,分配管理支持的操作类型有不同的输入要求:

  • Allocate - 将份额分配给特定的子图部署

    • 所需的操作参数:
      • 部署ID
      • 数量
  • Unallocate - 结束分配,腾出份额重新分配到其他地方

    • 所需的操作参数:
      • 分配ID
      • 部署ID
    • 可选操作参数:
      • poi
      • force(使用提供的POI的力量,即使它与图形节点提供的不匹配)
  • Reallocate - 自动关闭分配并为相同的子图部署打开新的分配

    • 所需的操作参数:
      • 分配ID
      • 部署ID
      • 数量
    • 可选操作参数:
      • poi
      • force(使用提供的POI的力量,即使它与图形节点提供的不匹配)

成本模式

链到本节

成本模型根据市场和查询属性为查询提供动态定价。索引人服务与网关共享一个成本模型,用于它们打算响应查询的每个子图。反过来,网关使用成本模型对每个查询进行索引人选择决策,并与选定的索引人协商付款。

Agora 语言提供了一种灵活的格式来声明查询的成本模型。 Agora 价格模型是一系列的语句,它们按照 GraphQL 查询中每个顶层查询的顺序执行。 对于每个顶层查询,第一个与其匹配的语句决定了该查询的价格。

语句由一个用于匹配 GraphQL 查询的谓词和一个成本表达式组成,该表达式在评估时输出一个以十进制 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 global
query { 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 cost
default => 0.1 * $SYSTEM_LOAD;

使用上述模型的查询成本计算示例:

询问价格
{ pairs(skip: 5000) { id } }0.5 GRT
{ tokens { symbol } }0.1 GRT
{ pairs(skip: 5000) { id } tokens { symbol } }0.6 GRT

应用成本模式

链到本节

成本模型是通过索引人 CLI 应用的,CLI 将它们传递给索引人代理的索引人管理 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 (OneClickDapp, ABItopic, and MyCrypto are a few other known tools).

一旦索引人将GRT置于协议中,索引人组件就可以启动并开始与网络交互。

批准代币

链到本节
  1. 在浏览器中打开Remix app

  2. 使用token ABI.在File Explorer文件夹中创建一个名为GraphToken.abi的文件。

  3. With GraphToken.abi selected and open in the editor, switch to the Deploy and run transactions section in the Remix interface.

  4. 在环境选择Injected Web3Account 下面选择你的索引人地址。

  5. 设置 GraphToken 合约地址 - 将 GraphToken 合约地址(0xc944E90C64B2c07662A292be6244BDf05Cda44a7) 粘贴到At Address 旁边 ,单击并应用At address 按钮。

  6. 调用approve(spender, amount)函数以批准 Staking 合约。 用质押合约地址(0xF55041E37E12cD407ad00CE2910B8269B01263b9) 填写spenderamount 要质押的代币数量 (in wei).

质押代币

链到本节
  1. 在浏览器中打开Remix app

  2. File Explorer 创建一个名为Staking.abi 的文件中,使用 staking ABI.

  3. With Staking.abi selected and open in the editor, switch to the Deploy and run transactions section in the Remix interface.

  4. 在环境选择Injected Web3Account 下面选择你的索引人地址。

  5. 设置 GraphToken 合约地址 - 将 GraphToken 地址(0xc944E90C64B2c07662A292be6244BDf05Cda44a7) 粘贴到At Address 旁边 ,单击At address 按钮以应用。

  6. 调用 stake() 质押协议中的 GRT。

  7. (可选)索引人可以批准另一个地址作为其索引人基础设施的操作员,以便将控制资金的密钥与执行日常操作,例如在子图上分配和服务(付费)查询的密钥分开。 用操作员地址调用setOperator() 设置操作员。

  8. (可选)为了控制奖励的分配和战略性地吸引委托人,索引人可以通过更新他们的索引人奖励削减(百万分之一)、查询费用削减(百万分之一)和冷却周期区块(区块数)来更新他们的委托参数。 要实现这一目的需要调用 setDelegationParameters()。 以下示例设置查询费用削减将 95% 的查询返利分配给索引人,5% 给委托人,设置索引人奖励削减将 60% 的索引奖励分配给索引人,将 40% 分配给委托人,并将冷却周期区块设置为 500 个。

setDelegationParameters(950000, 600000, 500)

Setting delegation parameters

链到本节

The setDelegationParameters() function in the staking contract is essential for Indexers, allowing them to set parameters that define their interactions with Delegators, influencing their reward sharing and delegation capacity.

How to set delegation parameters

链到本节

To set the delegation parameters using Graph Explorer interface, follow these steps:

  1. Navigate to Graph Explorer.
  2. Connect your wallet. Choose multisig (such as Gnosis Safe) and then select mainnet. Note: You will need to repeat this process for Arbitrum One.
  3. Connect the wallet you have as a signer.
  4. 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.
  5. 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 (allocateFrom()) 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 (closeAllocation()) 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 (learn more).

建议索引人在链上创建分配之前,利用链外同步功能将子图部署同步到链头。对于可能需要超过28个时期才能同步或有一些无法确定失败的机会的子图,此功能特别有用。

编辑

上页
FAQ
下页
运营Graph节点
编辑