40 分钟
索引概述
索引人是The Graph 网络中的节点运营商,他们质押 Graph代币(GRT) 以提供索引和查询处理服务。 索引人通过他们的服务赚取查询费和索引奖励。 他们还根据 Cobbs-Douglas 回扣函数从回扣池中赚取收益,该回扣池与所有网络贡献者按他们的工作成比例共享。
抵押在协议中的 GRT 会受到解冻期的影响,如果索引人是恶意的并向应用程序提供不正确的数据或索引不正确,则可能会被削减。 索引人也可以从委托人那里获得委托,为网络做出贡献。
索引人根据子图的策展信号选择要索引的子图,其中策展人质押 GRT 以指示哪些子图是高质量的并应优先考虑。 消费者(例如应用程序)还可以设置索引人处理其子图查询的参数,并设置查询费用定价的偏好。
常见问题
成为网络索引人所需的最低份额是多少?
索引人的最低抵押数量目前设置为 10万个 GRT。
索引人的收入来源是什么?
查询费返利 - 为网络上的查询服务支付的费用。这些支付通过索引人和网关之间的状态通道进行调解。来自网关的每个查询请求都包含一个支付和相应的响应,一个查询结果有效性的证明。
索引奖励 - 通过 3% 的年度协议范围通货膨胀生成,索引奖励分配给为网络索引子图部署的索引人。
索引奖励如何分配?
索引奖励来自协议通胀,每年发行量设定为 3%。 它们根据每个子图上所有管理信号的比例分布在子图上,然后根据他们在该子图上分配的份额按比例分配给索引人。 一项分配必须以符合仲裁章程规定的标准的有效索引证明(POI)来结束,才有资格获得奖励。
社区创建了许多用于计算奖励的工具,您会在社区指南集合中找到它们的集合。 您还可以在Discord 服务器上的 #Delegators 和 #Indexers 频道中找到最新的工具列表。在这里,我们链接一个推荐的分配优化器 与索引人软件栈集成。
什么是索引证明 (POI)?
网络中使用 POI 来验证索引人是否正在索引它们分配的子图。 在关闭该分配的分配时,必须提交当前时期第一个区块的 POI,才有资格获得索引奖励。 区块的 POI 是特定子图部署的所有实体存储交易的摘要,直到并包括该块。
索引奖励什么时候分配?
当分配活动在28个时期内分配时,分配会不断累积奖励。奖励由索引人收集,并在分配结束时分发。 这可以手动发生,每当索引人想要强制关闭它们时,或者在 28 个时期后,委托人可以关闭索引人的分配,但这会导致没有奖励。28 个时期是最大分配生命周期(现在,一个 时期持续约 24 小时)。
可以监控待处理的索引人奖励吗?
RewardsManager合约有一个只读的 getRewards 函数,可用于检查特定分配的未决奖励。
许多社区制作的控制板包含悬而未决的奖励值,通过以下步骤可以很容易地手动检查这些值:
- 查询主网子图以获取所有活动分配的ID:
1query indexerAllocations {2 indexer(id: "<INDEXER_ADDRESS>") {3 allocations {4 activeForIndexer {5 allocations {6 id7 }8 }9 }10 }11}
使用 Etherscan 调用 getRewards()
:
- 导航到Etherscan界面以获取奖励合约
- 调用
getRewards()
:- 展开 9. getRewards 下拉菜单。
- 在输入中输入分配 Id。
- 点击查询按钮。
争议是什么? 在哪里可以查看?
在争议期间,索引人的查询和分配都可以在The Graph上进行争论。 争议期限因争议类型而异。 查询/证明有 7 个时期的争议窗口,而分配有 56 个时期。 在这些期限过后,不能对分配或查询提出争议。 当争议开始时,Fishermen需要至少 10000 GRT 的押金,押金将被锁定,直到争议结束并给出解决方案。 Fishermen是任何引发争议的网络参与者。
争议有三种可能的结果,Fishermen的存款也是如此。
- 如果争议被驳回,Fishermen存入的 GRT 将被消耗,争议的索引人将不会被削减。
- 如果以平局方式解决争议,Fishermen的押金将被退还,并且争议的索引人不会被削减。
- 如果争议被接受,Fishermen存入的 GRT 将被退回,有争议的索引人将被削减,Fishermen将获得被削减的 GRT的50%。
争议可以在用户界面中的 争议
标签下的索引人档案页中查看。
什么是查询费返利? 何时分配?
查询费用由网关收取,并根据指数回扣函数(请参阅此处的GIP)分配给索引人。指数返佣函数被提出,作为一种通过忠实地服务查询来确保索引人获得最佳结果的方法。它的工作原理是激励索引人相对于他们可能收取的查询费用分配大量股份(在提供查询时可能会因出错而大幅削减)。
一旦分配已结束且争议期已过,索引人就可以要求回扣。 查询费用回扣根据查询费用减免和委托池比例分配给索引人及其委托人。
什么是查询费减免和索引奖励减免?
queryFeeCut
和 indexingRewardCut
值是委托的参数,该索引可以设置连同 cooldownBlocks 控制 GRT 的索引和他们的委托人之间的分配。 有关设置委托参数的说明,请参阅协议中的质押的最后步骤。
-
查询费用削减 - 将分配给索引人的子图上累积的查询费用回扣的百分比。 如果将其设置为 95%,则在申请分配时,索引人将获得查询费用回扣池的 95%,另外 5% 将分配给委托人。
-
索引奖励削减 - 分配给索引人的子图上累积的索引奖励的百分比。 如果将其设置为 95%,则当分配结束时,索引人将获得索引奖励池的 95%,而委托人将分配其他 5%。
索引人如何知道要索引哪些子图?
索引人可以通过应用高级技术来进行子图索引决策,从而使自己与众不同,但为了给出一个大致的概念,我们将讨论几个用于评估网络中子图的关键指标:
-
策展信号 - 应用于特定子图的网络策展信号的比例是对该子图兴趣的一个很好的指标,尤其是在引导阶段,当查询量不断上升时。
-
收取的查询费 - 特定子图收取的查询费的历史数据是未来需求的良好指标。
-
质押量 - 监控其他索引人的行为或查看分配给特定子图的总质押量的比例,可以让索引人监控子图查询的供应方,以确定网络显示出信心的子图或可能显示出需要更多供应的子图。
-
没有索引奖励的子图 - 一些子图不会产生索引奖励,主要是因为它们使用了不受支持的功能,如 IPFS,或者因为它们正在查询主网之外的另一个网络。 如果子图未生成索引奖励,您将在子图上看到一条消息。
对硬件有什么要求?
- 小型 - 足以开始索引几个子图,可能需要扩展。
- 标准 - 默认设置,这是在 k8s/terraform 部署清单示例中使用的。
- 中型 - 生产型索引人支持 100 个子图和每秒 200-500 个请求。
- 大型 -准备对当前使用的所有子图进行索引,并为相关流量的请求提供服务。
设置 | Postgres (CPUs) | Postgres (内存 GBs) | Postgres (硬盘TBs) | VMs (CPUs) | VMs (内存 GBs) |
---|---|---|---|---|---|
小型 | 4 | 8 | 1 | 4 | 16 |
标准 | 8 | 30 | 1 | 12 | 48 |
中型 | 16 | 64 | 2 | 32 | 64 |
大型 | 72 | 468 | 3.5 | 48 | 184 |
索引人应该采取哪些基本的安全防范措施?
-
运营商钱包 - 设置运营商钱包是一项重要的预防措施,因为它允许索引人在控制股权的密钥和控制日常交易的密钥之间保持分离-天操作。有关说明,请参阅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 参数 | 环境 变量 |
---|---|---|---|---|
8000 | GraphQL HTTP server (用于子图查询) | /subgraphs/id/… /subgraphs/name/…/… | —http-port | - |
8001 | GraphQL WS (用于子图订阅) | /subgraphs/id/… /subgraphs/name/…/…… | —ws-port | - |
8020 | JSON-RPC (用于管理部署) | / | —admin-port | - |
8030 | 子图索引状态 API | /graphql | —index-node-port | - |
8040 | Prometheus 指标 | /metrics | —metrics-port | - |
索引人服务
端口 | 用途 | 路径 | CLI 参数 | 环境 变量 |
---|---|---|---|---|
7600 | GraphQL HTTP 服务器 (用于付费子图查询) | /subgraphs/id/… /status /channel-messages-inbox | —port | INDEXER_SERVICE_PORT |
7300 | Prometheus 指标 | /metrics | —metrics-port | - |
索引人代理
端口 | 目的 | 路径 | CLI 参数 | 环境 变量 |
---|---|---|---|---|
8000 | 索引人管理 API | / | —索引人-管理-端口 | INDEXER_AGENT_INDEXER_MANAGEMENT_PORT |
在谷歌云上使用 Terraform 建立服务器基础设施
注意:索引人可以选择使用AWS,Microsoft Azure, or Alibaba。
安装先决条件
- 谷歌云 SDK
- Kubectl 命令行工具
- Terraform
创建一个谷歌云项目
-
克隆或导航到索引人存储库。
-
导航到
./terraform
目录,这是所有命令应该执行的地方。
1cd terraform
- 通过谷歌云认证并创建一个新项目。
1gcloud auth login2project=<PROJECT_NAME>3gcloud projects create --enable-cloud-apis $project
-
使用 Google Cloud Console 的计费页面为新项目启用计费。
-
创建谷歌云配置。
1proj_id=$(gcloud projects list --format='get(project_id)' --filter="name=$project")2gcloud config configurations create $project3gcloud config set project "$proj_id"4gcloud config set compute/region us-central15gcloud config set compute/zone us-central1-a
- 启用所需的 Google Cloud API。
1gcloud services enable compute.googleapis.com2gcloud services enable container.googleapis.com3gcloud services enable servicenetworking.googleapis.com4gcloud services enable sqladmin.googleapis.com
- 创建一个服务账户。
1svc_name=<SERVICE_ACCOUNT_NAME>2gcloud iam service-accounts create $svc_name \3 --description="Service account for Terraform" \4 --display-name="$svc_name"5gcloud iam service-accounts list6# Get the email of the service account from the list7svc=$(gcloud iam service-accounts list --format='get(email)'8--filter="displayName=$svc_name")9gcloud iam service-accounts keys create .gcloud-credentials.json \10 --iam-account="$svc"11gcloud projects add-iam-policy-binding $proj_id \12 --member serviceAccount:$svc \13 --role roles/editor
- 启用将在下一步中创建的数据库和 Kubernetes 集群之间的对等连接。
1gcloud compute addresses create google-managed-services-default \2 --prefix-length=20 \3 --purpose=VPC_PEERING \4 --network default \5 --global \6 --description 'IP Range for peer networks.'7gcloud services vpc-peerings connect \8 --network=default \9 --ranges=google-managed-services-default
- 创建最小的 terraform 配置文件(根据需要更新)。
1indexer=<INDEXER_NAME>2cat > terraform.tfvars <<EOF3project = "$proj_id"4indexer = "$indexer"5database_password = "<database password>"6EOF
使用 Terraform 创建基础设施
在运行任何命令之前,先阅读 variables.tf 并在这个目录下创建一个文件terraform.tfvars
(或者修改我们在上一步创建的文件)。 对于每一个想要覆盖默认值的变量,或者需要设置值的变量,在 terraform.tfvars
中输入一个设置。
- 运行以下命令来创建基础设施。
1# Install required plugins2terraform init34# View plan for resources to be created5terraform plan67# Create the resources (expect it to take up to 30 minutes)8terraform apply
将新集群的凭据下载到~/.kube/config
中,并将其设置为默认背景。
1gcloud container clusters get-credentials $indexer2kubectl config use-context $(kubectl config get-contexts --output='name'3| grep $indexer)
为索引人创建 Kubernetes 组件
-
将目录
k8s/overlays
复制到新的目录$dir,
中,并调整bases
进入中的$dir/kustomization.yaml
条目,使其指向目录k8s/base
。 -
读取
$dir
中的所有文件,并按照注释中的指示调整任何值。
用kubectl apply -k $dir
部署所有资源。
Graph 节点
Graph节点 是一个开源的 Rust 实现,它将以太坊区块链事件源化,以确定地更新一个数据存储,可以通过 GraphQL 端点进行查询。 开发者使用子图来定义他们的模式,以及一组用于转换区块链来源数据的映射,Graph 节点处理同步整个链,监控新的区块,并通过 GraphQL 端点提供服务。
从来源开始
安装先决条件
-
Rust
-
PostgreSQL
-
IPFS
-
Ubuntu 用户的附加要求 - 要在 Ubuntu 上运行 Graph 节点,可能需要一些附加的软件包。
1sudo apt-get install -y clang libpg-dev libssl-dev pkg-config
设置
- 启动 PostgreSQL 数据库服务器
1initdb -D .postgres2pg_ctl -D .postgres -l logfile start3createdb graph-node
-
克隆Graph 节点repo,并通过运行
cargo build
来构建源代码。 -
现在,所有的依赖关系都已设置完毕,启动 Graph节点:
1cargo run -p graph-node --release -- \2 --postgres-url postgresql://[USERNAME]:[PASSWORD]@localhost:5432/graph-node \3 --ethereum-rpc [NETWORK_NAME]:[URL] \4 --ipfs https://ipfs.network.thegraph.com
使用 Docker
先决条件
- Ethereum 节点 - 默认情况下,docker 编译设置将使用 mainnet:http://host.docker.internal:8545 连接到主机上的以太坊节点。 你可以通过更新
docker-compose.yaml
来替换这个网络名和 url。
设置
- 克隆Graph节点并导航到Docker目录:
1git clone https://github.com/graphprotocol/graph-node2cd graph-node/docker
- 仅适用于linux用户 - 在
docker-compose.yaml
中使用主机IP地址代替host.docker.internal
并使用附带的脚本:
1./setup.sh
- 启动一个本地Graph节点,它将连接到你的以太坊端点:
1docker-compose up
索引人组件
要成功地参与网络,需要几乎持续的监控和互动,所以我们建立了一套 Typescript 应用程序,以方便索引人的网络参与。 有三个索引人组件:
-
索引人代理 - 代理监控网络和索引人自身的基础设施,并管理哪些子图部署被索引和分配到链上,以及分配到每个子图的数量。
-
索引人服务 - 唯一需要对外暴露的组件,该服务将子图查询传递给节点,管理查询支付的状态通道,将重要的决策信息分享给网关等客户端。
-
索引人 CLI - 用于管理索引人代理的命令行界面。 它允许索引人管理成本模型、手动分配、操作队列和索引规则。
开始
索引人代理和索引人服务应该与你的 Graph节点基础设施共同定位。 有很多方法可以为你的索引人组件设置虚拟执行环境,这里我们将解释如何使用 NPM 包或源码在裸机上运行它们,或者通过谷歌云 Kubernetes 引擎上的 kubernetes 和 docker 运行。 如果这些设置实例不能很好地转化为你的基础设施,很可能会有一个社区指南供参考,请到 Discord! 在启动您的 Indexer 组件之前,请记住stake in the protocol!
来自 NPM 包
1npm install -g @graphprotocol/indexer-service2npm install -g @graphprotocol/indexer-agent34# Indexer CLI is a plugin for Graph CLI, so both need to be installed:5npm install -g @graphprotocol/graph-cli6npm install -g @graphprotocol/indexer-cli78# Indexer service9graph-indexer-service start ...1011# Indexer agent12graph-indexer-agent start ...1314# Indexer CLI15#Forward the port of your agent pod if using Kubernetes16kubectl port-forward pod/POD_ID 18000:800017graph indexer connect http://localhost:18000/18graph indexer ...
来自数据源
1# From Repo root directory2yarn34# Indexer Service5cd packages/indexer-service6./bin/graph-indexer-service start ...78# Indexer agent9cd packages/indexer-agent10./bin/graph-indexer-service start ...1112# Indexer CLI13cd packages/indexer-cli14./bin/graph-indexer-cli indexer connect http://localhost:18000/15./bin/graph-indexer-cli indexer ...
使用 docker
- 从注册表中提取图像
1docker pull ghcr.io/graphprotocol/indexer-service:latest2docker pull ghcr.io/graphprotocol/indexer-agent:latest
或从数据源本地生成图像
1# Indexer service2docker build \3 --build-arg NPM_TOKEN=<npm-token> \4 -f Dockerfile.indexer-service \5 -t indexer-service:latest \6# Indexer agent7docker build \8 --build-arg NPM_TOKEN=<npm-token> \9 -f Dockerfile.indexer-agent \10 -t indexer-agent:latest \
- 运行组件
1docker run -p 7600:7600 -it indexer-service:latest ...2docker 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
) 的环境变量。
索引人代理
1graph-indexer-agent start \2 --ethereum <MAINNET_ETH_ENDPOINT> \3 --ethereum-network mainnet \4 --mnemonic <MNEMONIC> \5 --indexer-address <INDEXER_ADDRESS> \6 --graph-node-query-endpoint http://localhost:8000/ \7 --graph-node-status-endpoint http://localhost:8030/graphql \8 --graph-node-admin-endpoint http://localhost:8020/ \9 --public-indexer-url http://localhost:7600/ \10 --indexer-geo-coordinates <YOUR_COORDINATES> \11 --index-node-ids default \12 --indexer-management-port 18000 \13 --metrics-port 7040 \14 --network-subgraph-endpoint http://query-node-0:8000/subgraphs/id/QmUzRg2HHMpbgf6Q4VHKNDbtBEJnyp5JWCh2gUX9AV6jXv \15 --default-allocation-amount 100 \16 --register true \17 --inject-dai true \18 --postgres-host localhost \19 --postgres-port 5432 \20 --postgres-username <DB_USERNAME> \21 --postgres-password <DB_PASSWORD> \22 --postgres-database indexer \23 --allocation-management auto \24 | pino-pretty
索引人服务
1SERVER_HOST=localhost \2SERVER_PORT=5432 \3SERVER_DB_NAME=is_staging \4SERVER_DB_USER=<DB_USERNAME> \5SERVER_DB_PASSWORD=<DB_PASSWORD> \6graph-indexer-service start \7 --ethereum <MAINNET_ETH_ENDPOINT> \8 --ethereum-network mainnet \9 --mnemonic <MNEMONIC> \10 --indexer-address <INDEXER_ADDRESS> \11 --port 7600 \12 --metrics-port 7300 \13 --graph-node-query-endpoint http://localhost:8000/ \14 --graph-node-status-endpoint http://localhost:8030/graphql \15 --postgres-host localhost \16 --postgres-port 5432 \17 --postgres-username <DB_USERNAME> \18 --postgres-password <DB_PASSWORD> \19 --postgres-database is_staging \20 --network-subgraph-endpoint http://query-node-0:8000/subgraphs/id/QmUzRg2HHMpbgf6Q4VHKNDbtBEJnyp5JWCh2gUX9AV6jXv \21 | pino-pretty
索引人 CLI
Indexer CLI 是一个可以在终端访问graph indexer
的插件,地址是@graphprotocol/graph-cli
。
1graph indexer connect http://localhost:180002graph indexer status
使用Indexer CLI 管理索引人
与Indexer Management API交互的建议工具是 IndexerCLI,它是 GraphCLI 的扩展。Indexer 代理需要来自 Indexer 的输入,以便代表 Indexer 与网络进行自主交互。定义 Indexer 代理行为的机制是分配管理模式和索引规则。在自动模式下,Indexer 可以使用索引规则应用它们的特定策略来选择子图以索引并查询。规则通过代理提供的 GraphQLAPI 进行管理,称为 Indexer Management API。在手动模式下,索引人可以使用操作队列创建分配操作,并在操作队列执行之前显式批准它们。在监督模式下,索引规则用于填充操作队列,并且还需要执行的显式批准。
使用方法
Indexer CLI连接到索引人代理,通常是通过端口转发,因此 CLI 不需要运行在同一服务器或集群上。 为了帮助你入门,并提供一些背景,这里将简要介绍 CLI。
-
graph索引人连接<url>
- 连接到索引人管理 API。 通常情况下,与服务器的连接是通过端口转发打开的,所以 CLI 可以很容易地进行远程操作。 (例如:kubectl port-forward pod/<indexer-agent-pod> 8000:8000
) -
graph索引人规则获取[选项] <deployment-id> [<key1> ...]
-获取一个或多个索引规则,使用all
作为<deployment-id>
来获取所有规则,或使用global
来获取全局默认规则。 可以使用额外的参数--merged
来指定将特定部署规则与全局规则合并。 这就是它们在索引人代理中的应用方式。 -
graph索引人规则设置[选项]<deployment-id> <key1> <value1> ...
-设置一个或多个索引规则。 -
graph索引人规则开始[选项] <deployment-id>
- 开始索引子图部署(如果可用),并将其decisionBasis
设置为always
, 这样索引人代理将始终选择对其进行索引。 如果全局规则被设置为总是,那么网络上所有可用的子图都将被索引。 -
graph索引人规则停止[选项] <deployment-id>
-停止对某个部署进行索引,并将其decisionBasis
设置为 never, 这样它在决定要索引的部署时就会跳过这个部署。 -
graph indexer rules maybe [options] <deployment-id>
—将部署的thedecisionBasis
设置为规则
, 这样索引人代理将使用索引规则来决定是否对这个部署进行索引。 -
graph indexer actions get [options] <action-id>
-使用all
获取一个或多个操作,或者将action-id
保持为空以获取所有操作。一个附加的参数——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
。
数据模型:
1type IndexingRule {2 identifier: string3 identifierType: IdentifierType4 decisionBasis: IndexingDecisionBasis!5 allocationAmount: number | null6 allocationLifetime: number | null7 autoRenewal: boolean8 parallelAllocations: number | null9 maxAllocationPercentage: number | null10 minSignal: string | null11 maxSignal: string | null12 minStake: string | null13 minAverageQueryFees: string | null14 custom: string | null15 requireSupported: boolean | null16 }1718IdentifierType {19 deployment20 subgraph21 group22}2324IndexingDecisionBasis {25 rules26 never27 always28 offchain29}
索引规则用法示例:
1graph indexer rules offchain QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK23graph indexer rules set QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK decisionBasis always allocationAmount 123321 allocationLifetime 14 autoRenewal false requireSupported false45graph indexer rules stop QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK67graph indexer rules delete QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK
操作队列CLI
Indexer-cli 提供了一个 actions
模块,用于手动处理操作队列。它使用由索引人管理服务器托管的 Graphql API 与操作队列进行交互。
如果ActionStatus=已批准
,则操作执行工作人员将仅从队列中获取要执行的项目。在推荐的路径中,操作被添加到ActionStatus=queued的队列中,因此必须经过批准才能在链上执行。一般流程如下:
- 第三方优化器工具或indexer-cli用户添加到队列的操作。
- 索引人可以使用
indexer-cli
查看所有排队的操作。 - 索引人(或其他软件)可以使用
indexer-cli
批准或取消队列中的操作。批准和取消命令将一组操作ID作为输入。 - 执行工作人员定期轮询队列以获得批准的操作。它将从队列中获取
已批准
的操作,尝试执行它们,并根据执行状态将数据库中的值更新为成功
或失败
。 - 如果操作成功,工作人员将确保存在索引规则,告诉代理如何管理向前的分配,这在代理处于
自动
或监督
模式时进行手动操作非常有用。 - 索引人可以监视操作队列以查看操作执行的历史记录,如果需要,可以在操作项执行失败时重新批准和更新操作项。操作队列提供排队和执行的所有操作的历史记录。
数据模型:
1Type ActionInput {2 status: ActionStatus3 type: ActionType4 deploymentID: string | null5 allocationID: string | null6 amount: string | null7 poi: string | null8 force: boolean | null9 source: string10 reason: string | null11 priority: number | null12}1314ActionStatus {15 queued16 approved17 pending18 success19 failed20 canceled21}2223ActionType {24 allocate25 unallocate26 reallocate27 collect28}
数据源用法示例:
1graph indexer actions get all23graph indexer actions get --status queued45graph indexer actions queue allocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 500067graph indexer actions queue reallocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 0x4a58d33e27d3acbaecc92c15101fbc82f47c2ae5 5500089graph indexer actions queue unallocate QmeqJ6hsdyk9dVbo1tvRgAxWrVS3rkERiEMsxzPShKLco6 0x4a58d33e27d3acbaecc92c15101fbc82f47c2ae1011graph indexer actions cancel1213graph indexer actions approve 1 3 51415graph indexer actions execute approve
请注意,分配管理支持的操作类型有不同的输入要求:
-
Allocate
- 将份额分配给特定的子图部署- 所需的操作参数:
- 部署ID
- 数量
- 所需的操作参数:
-
Unallocate
- 结束分配,腾出份额重新分配到其他地方- 所需的操作参数:
- 分配ID
- 部署ID
- 可选操作参数:
- poi
- force(使用提供的POI的力量,即使它与图形节点提供的不匹配)
- 所需的操作参数:
-
Reallocate
- 自动关闭分配并为相同的子图部署打开新的分配- 所需的操作参数:
- 分配ID
- 部署ID
- 数量
- 可选操作参数:
- poi
- force(使用提供的POI的力量,即使它与图形节点提供的不匹配)
- 所需的操作参数:
成本模式
成本模型根据市场和查询属性为查询提供动态定价。索引人服务与网关共享一个成本模型,用于它们打算响应查询的每个子图。反过来,网关使用成本模型对每个查询进行索引人选择决策,并与选定的索引人协商付款。
Agora
Agora 语言提供了一种灵活的格式来声明查询的成本模型。 Agora 价格模型是一系列的语句,它们按照 GraphQL 查询中每个顶层查询的顺序执行。 对于每个顶层查询,第一个与其匹配的语句决定了该查询的价格。
语句由一个用于匹配 GraphQL 查询的谓词和一个成本表达式组成,该表达式在评估时输出一个以十进制 GRT 表示的成本。 查询的命名参数位置中的值可以在谓词中捕获并在表达式中使用。 也可以在表达式中设置全局,并代替占位符。
成本模型示例:
1# This statement captures the skip value,2# uses a boolean expression in the predicate to match specific queries that use `skip`3# and a cost expression to calculate the cost based on the `skip` value and the SYSTEM_LOAD global4query { pairs(skip: $skip) { id } } when $skip > 2000 => 0.0001 * $skip * $SYSTEM_LOAD;56# This default will match any GraphQL expression.7# It uses a Global substituted into the expression to calculate cost8default => 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,以便存储在数据库中。 然后,索引人服务将接收这些模型,并在网关要求时将成本模型提供给它们。
1indexer cost set variables '{ "SYSTEM_LOAD": 1.4 }'2indexer cost set model my_model.agora
与网络的交互
在协议中进行质押
作为索引人参与网络的第一步是批准协议、质押资金,以及(可选)设置一个操作员地址以进行日常协议交互。
注意: 在这些说明中,Remix 将用于合约交互,但请随意使用您选择的工具(OneClickDapp, ABItopic, 和 MyCrypto 是其他一些已知的工具)。
一旦索引人将GRT置于协议中,索引人组件就可以启动并开始与网络交互。
批准代币
-
在浏览器中打开Remix app 。
-
使用token ABI.在
File Explorer
文件夹中创建一个名为GraphToken.abi的文件。 -
在编辑器中选择
GraphToken.abi
并打开,切换到Remix 界面中部署和Run Transactions
选项中。 -
在环境选择
Injected Web3
和Account
下面选择你的索引人地址。 -
设置 GraphToken 合约地址 - 将 GraphToken 合约地址(
0xc944E90C64B2c07662A292be6244BDf05Cda44a7
) 粘贴到At Address
旁边 ,单击并应用At address
按钮。 -
调用
approve(spender, amount)
函数以批准 Staking 合约。 用质押合约地址(0xF55041E37E12cD407ad00CE2910B8269B01263b9
) 填写spender
和amount
要质押的代币数量 (in wei)。
质押代币
-
在浏览器中打开Remix应用程序。
-
在
File Explorer
创建一个名为Staking.abi 的文件中,使用 staking ABI。 -
在编辑器中选择并打开
Staking.abi
后,切换到 Remix 界面中的Deploy 和 run Transactions
部分。 -
在环境选择
Injected Web3
和Account
下面选择你的索引人地址。 -
设置 GraphToken 合约地址 - 将 GraphToken 地址(
0xc944E90C64B2c07662A292be6244BDf05Cda44a7
) 粘贴到At Address
旁边 ,单击At address
按钮以应用。 -
调用
stake()
质押协议中的 GRT。 -
(可选)索引人可以批准另一个地址作为其索引人基础设施的操作员,以便将控制资金的密钥与执行日常操作,例如在子图上分配和服务(付费)查询的密钥分开。 用操作员地址调用
setOperator()
设置操作员。 -
(可选)为了控制奖励的分配和战略性地吸引委托人,索引人可以通过更新他们的
索引人奖励削减
(百万分之一)、查询费用削减
(百万分之一)和冷却周期区块
(区块数)来更新他们的委托参数。 要实现这一目的需要调用setDelegationParameters()
。 以下示例设置查询费用削减
将 95% 的查询返利分配给索引人,5% 给委托人,设置索引人奖励削减
将 60% 的索引奖励分配给索引人,将 40% 分配给委托人,并将冷却周期区块
设置为 500 个。
1setDelegationParameters(950000, 600000, 500)
设置委托参数
质押合约 中的setDelegationParameters()
函数对索引人至关重要,允许他们设置参数来定义他们与委托人的交互,从而影响他们的奖励共享和委托能力。
如何设置委托参数
要使用Graph Explorer界面设置委派参数,请执行以下步骤:
- 导航到 Graph Explorer。
- 连接你的钱包。选择multisig(如Gnosis Safe),然后选择主网。注意:您需要对Arbitrum One重复此过程。
- 连接您作为签名者的钱包。
- ‘设置’部分,然后选择’委托参数’。这些参数应配置为在所需范围内实现有效切割。在提供的输入字段中输入值后,界面将自动计算有效切割。根据需要调整这些值,以达到所需的有效切割百分比。
- 将交易提交到网络。
注意:此交易需要由多重签名钱包签名者确认。
分配的生命周期
在被索引人创建之后,健康的分配会经历两个状态。
-
Active - 一旦在链上创建了分配 (allocateFrom()) ,它就被认为是active的。索引人自己和/或委托的一部分份额分配给子图部署,这允许他们申请索引奖励并为该子图部署提供查询。索引人代理根据索引人规则管理创建分配。
-
Closed-一旦经过1个时期,索引人就可以自由关闭分配(closeGallocation())或者他们的索引人代理将在maxAllocationPochs(目前为28天)后自动关闭分配。当分配以有效的索引证明(POI)结束时,其索引奖励将分配给索引人及其委托人(了解更多)。
建议索引人在链上创建分配之前,利用链外同步功能将子图部署同步到链头。对于可能需要超过28个时期才能同步或有一些无法确定失败的机会的子图,此功能特别有用。