From bd035c085e7abc68304745cb0015a84ff831e8b8 Mon Sep 17 00:00:00 2001 From: Zhuoqian Zhou Date: Wed, 7 Feb 2024 22:03:54 +0800 Subject: [PATCH] 123123 --- docker/Dockerfile | 2 + docs/config-zh.md | 202 +++++++++++++++++++++++++++++++ docs/environment-variables-zh.md | 170 ++++++++++++++++++++++++++ 3 files changed, 374 insertions(+) create mode 100644 docs/config-zh.md create mode 100644 docs/environment-variables-zh.md diff --git a/docker/Dockerfile b/docker/Dockerfile index 0044c6b7812..5227021b4f3 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -76,6 +76,8 @@ ENV node_role "combined-node" ENV node_id "default" # The ethereum network polling interval (in milliseconds) ENV ethereum_polling_interval "" +# 将其设置为 `true` 以在块摄取期间禁用从以太坊节点并发获取收据。这将使用更少的批量请求。在 MacOS 上始终设置为 `true` 以避免 DNS 问题。 +ENV GRAPH_ETHEREUM_FETCH_TXN_RECEIPTS_IN_BATCHES "true" # The location of an optional configuration file for graph-node, as # described in ../docs/config.md diff --git a/docs/config-zh.md b/docs/config-zh.md new file mode 100644 index 00000000000..fa28eb567d0 --- /dev/null +++ b/docs/config-zh.md @@ -0,0 +1,202 @@ +# 高级 Graph Node 配置 + +TOML 配置文件可用于设置比 CLI 中暴露的更复杂的配置。文件的位置通过 `--config` 命令行开关传递。当使用配置文件时,不可能使用选项 `--postgres-url`、`--postgres-secondary-hosts` 和 `--postgres-host-weights`。 + +TOML 文件由四个部分组成: + +- `[chains]` 设置区块链客户端的端点。 +- `[store]` 描述可用的数据库。 +- `[ingestor]` 设置负责块摄取的节点的名称。 +- `[deployment]` 描述如何放置新部署的子图。 + +这些部分中的一些支持环境变量扩展,最值得注意的是 Postgres 连接字符串。官方的 `graph-node` Docker 镜像包括 [`envsubst`](https://github.com/a8m/envsubst) 用于更复杂的用例。 + +## 配置多个数据库 + +对于大多数用例,单个 Postgres 数据库足以支持一个 `graph-node` 实例。当 `graph-node` 实例增长到一个单个 Postgres 数据库不够时,可以将 `graph-node` 数据的存储拆分到多个 Postgres 数据库中。所有数据库一起形成 `graph-node` 实例的存储。每个单独的数据库称为一个 _分片_。 + +`[store]` 部分必须始终配置一个主分片,必须称为 `primary`。每个分片可以有额外的读副本,用于响应查询。只有查询由读副本处理。索引和块摄取将始终使用主数据库。 + +还可以配置任意数量的其他分片,每个分片都有自己的读副本。当使用读副本时,查询流量将根据其权重在主数据库和副本之间分割。在下面的示例中,对于主要分片,不会将任何查询发送到主数据库,而副本将分别接收 50% 的流量。在 `vip` 分片中,50% 的流量发送到主数据库,另外 50% 发送到副本。 + +```toml +[store] +[store.primary] +connection = "postgresql://graph:${PGPASSWORD}@primary/graph" +weight = 0 +pool_size = 10 +[store.primary.replicas.repl1] +connection = "postgresql://graph:${PGPASSWORD}@primary-repl1/graph" +weight = 1 +[store.primary.replicas.repl2] +connection = "postgresql://graph:${PGPASSWORD}@primary-repl2/graph" +weight = 1 + +[store.vip] +connection = "postgresql://graph:${PGPASSWORD}@${VIP_MAIN}/graph" +weight = 1 +pool_size = 10 +[store.vip.replicas.repl1] +connection = "postgresql://graph:${PGPASSWORD}@${VIP_REPL1}/graph" +weight = 1 +``` + +`connection` 字符串必须是有效的 [libpq 连接字符串](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING)。在将连接字符串传递给 Postgres 之前,嵌入在字符串中的环境变量会被扩展。 + +### 设置 `pool_size` + +每个分片必须指示每个 `graph-node` 实例在该数据库的连接池中保留多少数据库连接。对于副本,池大小默认为主数据库的池大小,但也可以显式设置。这样的设置会替换主数据库的设置。 + +`pool_size` 可以是一个数字,就像上面的示例一样,这样任何 `graph-node` 实例都将使用该大小的连接池;或者是一组规则,针对不同的 `graph-node` 实例使用不同的大小,规则基于命令行上设置的 `node_id`。使用规则时,`pool_size` 设置如下: + +```toml +pool_size = [ + { node = "index_node_general_.*", size = 20 }, + { node = "index_node_special_.*", size = 30 }, + { node = "query_node_.*", size = 80 } +] +``` + +每个规则由正则表达式 `node` 和如果当前实例的 `node_id` 匹配该正则表达式,则应使用的大小组成。您可以使用命令 `graphman config pools` 检查每个 `graph-node` 实例将使用多少连接以及所有 `graph-node` 实例将打开多少数据库连接。规则按照编写的顺序检查,使用第一个匹配的规则。如果没有规则匹配,则出错。 + +强烈建议每次更改配置时运行 `graphman config pools $all_nodes`,以确保连接池符合预期。这里,`$all_nodes` 应该是将使用此配置文件的所有节点名称的列表。 + +## 配置以太坊提供者 + +`[chains]` 部分控制 `graph-node` 连接到的以太坊提供者,以及每个链的块和其他元数据存储在哪里。该部分由进行块摄取的节点的名称(目前未使用)和一系列链组成。链的配置 `name` 在 `[chains.]` 部分指定,由存储链数据的 `shard` 和该链的提供者列表组成。对于每个提供者,必须给出以下信息: + +- `label`:在记录有关该提供者的信息时使用的标签(尚未实现) +- `transport`:`rpc`、`ws` 和 `ipc` 中的一个。默认为 `rpc`。 +- `url`:提供者的 URL +- `features`:提供者支持的特性数组,可以为空,也可以是 `traces` 和 `archive` 的任意组合 +- `headers`:要添加到每个请求的 HTTP 标头。默认为无。 +- `limit`:可以使用此提供者的子图的最大数量。默认为无限制。至少应该有一个提供者是无限制的,否则 `graph-node` 可能无法处理所有 + +子图。对于此跟踪,该值是近似的,预计会有少量偏差。偏差将小于 10。 + +以下示例配置了两个链,`mainnet` 和 `kovan`,其中 `mainnet` 的块存储在 `vip` 分片中,而 `kovan` 的块存储在主分片中。`mainnet` 链可以使用两个不同的提供者,而 `kovan` 只有一个提供者。 + +```toml +[chains] +ingestor = "block_ingestor_node" +[chains.mainnet] +shard = "vip" +provider = [ + { label = "mainnet1", url = "http://..", features = [], headers = { Authorization = "Bearer foo" } }, + { label = "mainnet2", url = "http://..", features = [ "archive", "traces" ] } +] +[chains.kovan] +shard = "primary" +provider = [ { label = "kovan", url = "http://..", features = [] } ] +``` + +### 控制使用提供者的子图数量 + +**此功能是实验性的,可能会在将来的版本中删除** + +每个提供者可以设置使用该提供者的子图的限制。对使用提供者的子图数量的测量是近似的,可能会与真实数量略有不同(通常少于 10)。 + +限制是通过匹配节点名称的规则设置的。如果节点的名称不匹配任何规则,则该节点的相应提供者将被禁用。 + +如果省略了匹配属性,则提供者将在每个节点上无限制。 + +建议至少有一个提供者通常是无限制的。 +限制的设置方式如下: + +```toml +[chains.mainnet] +shard = "vip" +provider = [ + { label = "mainnet-0", url = "http://..", features = [] }, + { label = "mainnet-1", url = "http://..", features = [], + match = [ + { name = "some_node_.*", limit = 10 }, + { name = "other_node_.*", limit = 0 } ] } ] +``` + +命名为 `some_node_.*` 的节点将最多使用 `mainnet-1` 的 10 个子图,而其他一切则使用 `mainnet-0`,命名为 `other_node_.*` 的节点永远不会使用 `mainnet-1`,总是使用 `mainnet-0`。任何名称不匹配这些模式之一的节点都将无法使用 `mainnet-1`。 + +## 控制部署 + +当 `graph-node` 接收到部署新子图部署的请求时,它需要决定将部署的数据存储在哪个分片,并决定连接到存储的任何数量的节点中的哪些节点索引部署。该决定基于在 `[deployment]` 部分中定义的一系列规则。部署规则可以匹配子图名称和部署索引的网络。 + +规则按顺序评估,第一个匹配的规则确定部署的位置。规则的 `match` 元素可以有一个 `name`,用于针对部署的子图名称进行匹配的 [正则表达式](https://docs.rs/regex/1.4.2/regex/#syntax),以及与新部署的索引的网络进行比较的 `network` 名称。`network` 名称可以是字符串,也可以是字符串列表。 + +最后一个规则不得具有 `match` 语句,以确保始终有一些分片和一些索引器将处理部署。 + +规则指示应将部署的数据存储在哪个 `shard` 中,默认为 `primary`,以及一系列 `indexers`。对于匹配规则,从 `indexers` 列表中选择一个索引器,以便部署均匀分布在所有在 `indexers` 中提到的节点上。索引器的名称必须与启动这些索引节点时传递的 `--node-id` 相同。 + +可以使用固定的 `shard`,也可以使用 `shards` 列表;在这种情况下,系统将使用给定列表中活动部署最少的分片。 + +```toml +[deployment] +[[deployment.rule]] +match = { name = "(vip|important)/.*" } +shard = "vip" +indexers = [ "index_node_vip_0", "index_node_vip_1" ] +[[deployment.rule]] +match = { network = "kovan" } +# No shard, so we use the default shard called 'primary' +indexers = [ "index_node_kovan_0" ] +[[deployment.rule]] +match = { network = [ "xdai", "poa-core" ] } +indexers = [ "index_node_other_0" ] +[[deployment.rule]] +# There's no 'match', so any subgraph matches +shards = [ "sharda", "shardb" ] +indexers = [ + "index_node_community_0", + "index_node_community_1", + "index_node_community_2", + "index_node_community_3", + "index_node_community_4", + "index_node_community_5" + ] + +``` + +## 查询节点 + +节点可以通过在配置文件中包含以下内容来显式地配置为查询节点: + +```toml +[general] +query = "" +``` + +任何 `--node-id` 匹配正则表达式的节点将被设置为仅响应查询。目前,这只意味着该节点不会尝试连接到任何配置的以太坊提供者。 + +## 基本设置 + +以下文件相当于使用 `--postgres-url` 命令行选项: + +```toml +[store] +[store.primary] +connection="<.. postgres-url argument ..>" +[deployment] +[[deployment.rule]] +indexers = [ "<.. list of all indexing nodes ..>" ] +``` + +## 验证配置文件 + +可以使用 `config check` 命令检查配置文件的有效性。运行 + +```shell +graph-node --config $CONFIG_FILE config check +``` + +将读取配置文件并打印有关语法错误和一些内部不一致性的信息 + +,例如,在部署规则中使用未声明为存储的分片时。 + +## 模拟部署位置 + +给定一个配置文件,可以模拟新部署的子图部署的位置: + +```shell +graphman --config $CONFIG_FILE config place some/subgraph mainnet +``` + +该命令不会进行任何更改,而只是打印该子图将被放置在哪里的信息。输出将指示将保存子图数据的数据库分片,以及可以用于对该子图进行索引的索引节点列表。在部署过程中,`graph-node` 从该列表中选择当前分配的子图最少的索引节点。 \ No newline at end of file diff --git a/docs/environment-variables-zh.md b/docs/environment-variables-zh.md new file mode 100644 index 00000000000..427b8a67aec --- /dev/null +++ b/docs/environment-variables-zh.md @@ -0,0 +1,170 @@ +# 环境变量 + +**警告**:某些环境变量的名称在不久的将来可能会更改。 + +本页面列出了 `graph-node` 使用的环境变量及其效果。一些环境变量可以代替命令行标志使用。这些未在此处列出,请参阅 `graph-node --help` 获取详细信息。 + +## 用于 EVM 链的 JSON-RPC 配置 + +- `ETHEREUM_REORG_THRESHOLD`:最大预期的重组大小,如果发生更大的重组,则子图可能会处理不一致的数据。默认为 250。 +- `ETHEREUM_POLLING_INTERVAL`:以多久的频率轮询以太坊获取新区块(毫秒,默认为 500ms)。 +- `GRAPH_ETHEREUM_TARGET_TRIGGERS_PER_BLOCK_RANGE`:应该在批处理中处理的触发器的理想数量。如果这个值太小,可能会导致向以太坊节点发送太多请求;如果太大,可能会导致对以太坊节点的调用不合理昂贵,并且内存使用过多(默认为 100)。 +- `ETHEREUM_TRACE_STREAM_STEP_SIZE`:当子图定义调用处理程序或具有调用过滤器的块处理程序时,`graph-node` 会查询给定区块范围的跟踪。该变量的值控制在单个 RPC 请求中扫描以太坊节点跟踪的区块数量。默认为 50。 +- `DISABLE_BLOCK_INGESTOR`:将其设置为 `true` 以禁用块摄取。将其保留未设置或设置为 `false` 以启用块摄取。 +- `ETHEREUM_BLOCK_BATCH_SIZE`:请求的以太坊块数量。同时也限制其他并行请求,如 trace_filter。默认为 10。 +- `GRAPH_ETHEREUM_MAX_BLOCK_RANGE_SIZE`:每个请求中要扫描触发器的最大块数(默认为 1000)。 +- `GRAPH_ETHEREUM_MAX_EVENT_ONLY_RANGE`:`eth.getLogs` 请求的最大范围大小,该请求不会根据合约地址进行过滤,仅根据事件签名进行过滤(默认为 500)。 +- `GRAPH_ETHEREUM_JSON_RPC_TIMEOUT`:以太坊 JSON-RPC 请求的超时时间。 +- `GRAPH_ETHEREUM_REQUEST_RETRIES`:针对以太坊进行的 JSON-RPC 请求的重试次数。这适用于在达到限制时不会使子图失败但会重新启动同步步骤的请求。该限制用于防止诸如请求已重组的块哈希等场景。默认为 10。 +- `GRAPH_ETHEREUM_BLOCK_INGESTOR_MAX_CONCURRENT_JSON_RPC_CALLS_FOR_TXN_RECEIPTS`:在块摄取期间针对以太坊进行请求事务收据的最大并发请求次数。默认为 1,000。 +- `GRAPH_ETHEREUM_FETCH_TXN_RECEIPTS_IN_BATCHES`:将其设置为 `true` 以在块摄取期间禁用从以太坊节点并发获取收据。这将使用更少的批量请求。在 MacOS 上始终设置为 `true` 以避免 DNS 问题。 +- `GRAPH_ETHEREUM_CLEANUP_BLOCKS`:将其设置为 `true` 以清理数据库中不需要的块。当此值为 `false` 或未设置(默认情况下),块永远不会从块缓存中删除。此设置仅应在开发过程中使用,以减少数据库的大小。在生产环境中,它会导致同一块的多次下载,从而减慢系统速度。如果存储使用多个分片,则无法使用此设置。 +- `GRAPH_ETHEREUM_GENESIS_BLOCK_NUMBER`:指定创世块编号。如果未设置标志,则默认值为 `0`。 + +## 运行映射处理程序 + +- `GRAPH_MAPPING_HANDLER_TIMEOUT`:映射处理程序允许的时间量(以秒为单位,默认为无限)。 +- `GRAPH_ENTITY_CACHE_SIZE`:实体缓存的大小,以千字节为单位。默认为 10,000,即 10MB。 +- `GRAPH_MAX_API_VERSION`:支持的最大 `apiVersion`。如果开发人员尝试在其映射中创建比此版本更高的 `apiVersion`,则将收到错误。默认为 `0.0.7`。 +- `GRAPH_MAX_SPEC_VERSION`:支持的最大 `specVersion`。如果开发人员尝试创建一个比此版本更高的 `apiVersion` 的子图,他们将收到错误。默认为 `0.0.5`。 +- `GRAPH_RUNTIME_MAX_STACK_SIZE`:WASM 运行时的最大堆栈大小,如果超出限制,执行将停止并抛出错误。默认为 512KiB。 + +## IPFS + +- `GRAPH_IPFS_TIMEOUT`:IPFS 的超时时间,包括对清单文件和映射的请求(以秒为单位,默认为 60)。 +- `GRAPH_MAX_IPFS_FILE_BYTES`:`ipfs cat` 调用可检索的文件的最大大小。这影响子图定义文件和 `file/ipfs` 数据源。以字节为单位,默认为 25 MiB。 +- `GRAPH_MAX_IPFS_MAP_FILE_SIZE`:可以使用 `ipfs.map` 处理的文件的最大大小。当通过 `ipfs.map` 处理文件时,从该文件生成的实体将保留在内存中,直到完成整个文件的处理。因此,此设置限制了 `ipfs.map` 调用可能使用的内存量(以字节为单位,默认为 256MB)。 +- `GRAPH_MAX_IPFS_CACHE_SIZE`:缓存的最大文件数(默认为 50)。 +- `GRAPH_MAX_IPFS_CACHE_FILE_SIZE`:每个缓存文件的最大大小(以字节为单位,默认为 1MiB) + +。 +- `GRAPH_IPFS_REQUEST_LIMIT`:限制对 IPFS 的每秒请求次数,用于文件数据源。默认为 100。 + +## GraphQL + +- `GRAPH_GRAPHQL_QUERY_TIMEOUT`:GraphQL 查询的最大执行时间(以秒为单位,默认为无限)。 +- `GRAPH_GRAPHQL_MAX_COMPLEXITY`:GraphQL 查询的最大复杂度。默认为无限。有关详细信息,请参见[此处](https://developer.github.com/v4/guides/resource-limitations)。典型的内省查询的复杂度略高于 1 百万,因此将值设置为低于此值可能会干扰由 GraphQL 客户端执行的内省。 +- `GRAPH_GRAPHQL_MAX_DEPTH`:GraphQL 查询的最大深度。默认(也是最大)为 255。 +- `GRAPH_GRAPHQL_MAX_FIRST`:GraphQL 查询中可以用于 `first` 参数的最大值。如果未提供,则 `first` 默认为 100。`GRAPH_GRAPHQL_MAX_FIRST` 的默认值为 1000。 +- `GRAPH_GRAPHQL_MAX_SKIP`:GraphQL 查询中可以用于 `skip` 参数的最大值。`GRAPH_GRAPHQL_MAX_SKIP` 的默认值为无限。 +- `GRAPH_GRAPHQL_WARN_RESULT_SIZE` 和 `GRAPH_GRAPHQL_ERROR_RESULT_SIZE`:如果 GraphQL 结果的大小超过这些大小(以字节为单位),则分别记录警告或中止查询执行并返回错误。在构建响应时检查结果的大小,以便执行不会使用比配置更多的内存。两者的默认值都是无限。 +- `GRAPH_GRAPHQL_MAX_OPERATIONS_PER_CONNECTION`:每个 WebSocket 连接的最大 GraphQL 操作数。超出限制后,任何创建的操作都将向客户端返回错误。默认为 1000。 +- `GRAPH_GRAPHQL_HTTP_PORT`:GraphQL HTTP 服务器的端口。 +- `GRAPH_GRAPHQL_WS_PORT`:GraphQL WebSocket 服务器的端口。 +- `GRAPH_SQL_STATEMENT_TIMEOUT`:GraphQL 执行期间允许的单个 SQL 查询的最长时间(默认为无限)。 +- `GRAPH_DISABLE_SUBSCRIPTION_NOTIFICATIONS`:禁用用于触发 GraphQL 订阅更新的内部机制。当此变量设置为任何值时,`graph-node` 仍将接受 GraphQL 订阅,但它们将不会收到任何更新。 +- `ENABLE_GRAPHQL_VALIDATIONS`:启用基于 GraphQL 规范的 GraphQL 验证。这将验证并确保每个查询都遵循执行规则。默认为 `false`。 +- `SILENT_GRAPHQL_VALIDATIONS`:如果启用了 `ENABLE_GRAPHQL_VALIDATIONS`,还可以仅静默打印 GraphQL 验证错误,而不会导致实际查询失败。注意:查询可能仍会因 GraphQL 引擎执行期间的后续阶段验证失败而失败。默认为 `true`。 +- `GRAPH_GRAPHQL_DISABLE_BOOL_FILTERS`:禁用使用 AND/OR 过滤器的功能。如果出于性能原因要禁用过滤器,则此设置很有用。 +- `GRAPH_GRAPHQL_DISABLE_CHILD_SORTING`:禁用使用基于子项的排序功能。如果出于性能原因要禁用基于子项的排序,则此设置很有用。 +- `GRAPH_GRAPHQL_TRACE_TOKEN`:用于启用 GraphQL 请求的查询跟踪的令牌。如果设置了此项,则具有头 `X-GraphTraceQuery` 设置为该值的请求将包含对运行的 SQL 查询的跟踪。默认为空字符串,表示禁用跟踪。 + +### GraphQL 缓存 + +- `GRAPH_CACHED_SUBGRAPH_IDS`:当设置为 `*` 时,缓存所有子图(默认行为)。否则,逗号分隔的子图列表,用于缓存查询。 +- `GRAPH_QUERY_CACHE_BLOCKS`:应在查询缓存中保留的每个网络的最近区块数。这应该保持较小,因为查找时间和缓存内存使用量与此值成比例。设置为 0 以禁用缓存。默认为 1。 +- `GRAPH_QUERY_CACHE_MAX_MEM`:查询缓存可使用的最大总内存量,以 MB 为单位。用于缓存的总内存量将是这个值的两倍——一次用于最近的块,均匀分配在 `GRAPH_QUERY_CACHE_BLOCKS` 中,一次用于对旧块进行频繁查询。对于大多数负载来说,默认值足够了,尤其是如果 `GRAPH_QUERY_CACHE_BLOCKS` 保持较小。默认为 1000,对应 1GB。 +- `GRAPH_QUERY_CACHE_STALE_PERIOD`:缓存条目被视为过时之前的查询次数。默认为 100。 + +## 其他 + +- `GRAPH_NODE_ID`:设置节点 ID,允许并行运行多个 Graph 节点并部署到特定节点;每个 ID 必须在节点集合中唯一。单个节点应在连续重启之间具有相同的值。子图将分配到节点 ID,并且不会自动重新分配到其他节点。 +- `GRAPH_NODE_ID_USE_LITERAL_VALUE`:(仅限 Docker)使用提供给 docker 启动脚本的字面值 `node_id`,而不是将名称中的连字符(-)替换为下划线(\_)。更改现有 `graph-node` 安装的此设置还需要在数据库中的 `subgraphs.subgraph_deployment_assignment` 表中更改分配的节点 ID。可以使用 GraphMan 或通过 PostgreSQL 命令行完成。 +- `GRAPH_LOG`:控制日志级别,方式与 `RUST_LOG` [这里](https://docs.rs/env_logger/0.6.0/env_logger/) 中描述的方式相同。 +- `THEGRAPH_STORE_POSTGRES_DIESEL_URL`:运行测试时使用的 postgres 实例。设置为 `postgresql://:@:/`。 +- `GRAPH_KILL_IF_UNRESPONSIVE`:如果设置,则进程将在无响应时被终止。 +- `GRAPH_KILL_IF_UNRESPONSIVE_TIMEOUT_SECS`:如果 `GRAPH_KILL_IF_UNRESPONSIVE` 为 true,则在终止节点之前的超时时间(以秒为单位)。默认值为 10s。 +- `GRAPH_LOG_QUERY_TIMING`:控制进程是否记录处理 GraphQL 和 SQL 查询的详细信息。值是逗号分隔的列表,包括 `sql`、`gql` 和 `cache`。如果列表中包含 `gql`,则每个针对节点执行的 GraphQL 查询都以 `info` 级别记录。日志消息包含查询的子图、查询、变量、查询所花费的时间以及唯一的 `query_id`。如果包含 `sql`,则记录 GraphQL 查询导致的 SQL 查询。日志消息包含子图、查询、绑定变量、执行查询所花费的时间、查询找到的实体数量以及导致 SQL 查询的 GraphQL 查询的 `query_id`。这些 SQL 查询标有 `component: GraphQlRunner`。当给出 `sql` 时,还会记录其他 SQL 查询。这些是在处理子图的块和处理订阅时导致的查询。如果 `cache` 除了 `gql` 外还包含,则还会为每个顶层 GraphQL 查询字段记录是否可以从缓存中检索到的信息。默认为不记录。 +- `GRAPH_LOG_TIME_FORMAT`:自定义日志时间格式。默认值为 `%b %d %H:%M:%S%.3f`。更多信息 [此处](https://docs.rs/chrono/latest/chrono/#formatting-and-parsing)。 +- `STORE_CONNECTION_POOL_SIZE`:允许与存储建立的同时连接数。由于实现细节,可能不严格遵守此值。默认为 10。 +- `GRAPH_LOG_POI_EVENTS`:以确定性方式记录 Proof of Indexing 事件。这对于调试可能很有用。 +- `GRAPH_LOAD_WINDOW_SIZE`、`GRAPH_LOAD_BIN_SIZE`:如果在 `GRAPH_LOAD_WINDOW_SIZE` 秒的时间段内的负载测量超过阈值,则负载可以自动限制。每个窗口内的测量被分组到 `GRAPH_LOAD_BIN_SIZE` 秒的时间段中。变量默认为 300s 和 1s。 +- `GRAPH_LOAD_THRESHOLD`:如果获取数据库连接的等待时间超过此阈值,则在等待时间下降到阈值以下之前,会限制查询。值以毫秒为单位,默认为 0,表示关闭限制和任何相关的统计信息收集。 +- `GRAPH_LOAD_JAIL_THRESHOLD`:当系统过载时,任何导致工作量超过此分数的查询都将被拒绝(即使在解决过载情况后也是如此)。如果未设置此变量,则永远不会将查询拘禁,但在系统过载时仍然会受到正常的负载管理限制。 +- `GRAPH_LOAD_SIMULATE`:在给定其他负载管理配置设置的情况下执行负载管理将进行所有步骤,但实际上不会拒绝运行查询,而是记录有关负载管理决策的日志。设置为 `true` 以启用模拟,默认为 `false`。 +- `GRAPH_STORE_CONNECTION_TIMEOUT`:连接到数据库前等待多长时间(以毫秒为单位)。默认为 5000ms。 +- `EXPERIMENTAL_SUBGRAPH_VERSION_SWITCHING_MODE`:默认为 `instant`,设置为 `synced` 以仅在同步后将命名子图切换到新部署,使新部署成为“Pending”版本。 +- `GRAPH_REMOVE_UNUSED_INTERVAL`:在删除未使用的部署之前等待多长时间。系统会定期检查并标记不再由任何子图使用的部署。一旦识别出部署未使用,`graph-node` 将等待至少这么长时间才会实际删除数据(值以分钟为单位,默认为 360,即 6 小时)。 +- `GRAPH_ALLOW_NON_DETERMINISTIC_IPFS`:启用使用 `ipfs.cat` 作为子图映射的一部分的子图索引。**这是一个实验性功能,不确定,并且将在将来被删除**。 +- `GRAPH_STORE_BATCH_TARGET_DURATION`:复制或嫁接期间批处理操作应该持续多长时间。这限制了长时间运行操作的事务持续时间。默认为 5s。 +- `GRAPH_STORE_BATCH_SIZE`:复制或嫁接期间应执行的操作数量。默认为 100。 +- `GRAPH_MIGRATION_DRY_RUN`:运行迁移时不修改数据库。 + +## 开发/测试 + +- `GRAPH_DISABLE_INDEXING`:在启动时,设置此变量以禁用索引创建和更新。 +- `GRAPH_STORE_DEBUG`:用于调试存储后端的环境变量。设置为 `true` 以启用 `diesel` SQL 日志记录。默认为 `false`。 +- `GRAPH_STORE_DEBUG_DISABLE_STORAGE_LIMITS`:在 `GRAPH_STORE_DEBUG` 启用时,设置此变量以禁用对存储的大小进行限制的功能(例如,每个实体的字段数量和长度)。这可以用于测试目的。 +- `GRAPH_TREAT_H213_AS_H212`:用于测试,如果已经是 H213 了,则它将始终被视为 H212。默认为 `false`。 +- `GRAPH_PRE_MIGRATION_DUMP_DIR`:在迁移之前导出数据库中的内容的目录。导出将在任何迁移步骤之前发生。默认为无。 +- `GRAPH_DISABLE_STATE_CLEANUP`:在启动时,设置此变量以禁用缓存和索引的状态清理。 +- `GRAPH_DISABLE_STARTUP_CLEANUP`:设置为 `true` 以禁用启动时的状态清理。 +- `GRAPH_CONTRACT_RUNTIME_TRACE`:记录 Solidity 函数调用及其参数。这会导致磁盘 I/O 骤增。 +- `GRAPH_DISABLE_BLOCK_INGESTOR_INDEXING`:设置为 `true` 以禁用块摄取期间的索引。这对于速度很慢的以太坊主网同步非常有用,但是在此期间,子图查询结果可能会有所减少。 +- `GRAPH_GENESIS_BLOCK`:启用 GENESIS 模式。默认为 `false`。 +- `GRAPH_ALLOW_NON_DETERMINISTIC_MIGRATIONS`:允许不确定性迁移。如果此变量未设置,`graph-node` 将拒绝运行不确定的迁移。 +- `GRAPH_NODE_EXPORT_BLOCK`:在块处于不良状态时将存储节点导出到本地的路径。默认为 `""`。 +- `GRAPH_CHECKPOINT_BLOCK_TRIGGER`:在此块号之后创建快照。这只适用于块源使用区块摄取器的情况。默认为 `0`。 +- `GRAPH_DISABLE_CREATE_ANCESTOR`:禁用创建祖先索引。这会使运行时间更快,但是当索引是为空时,内部函数调用可能会失败。 +- `GRAPH_GRAPHQL_SKIP_HEAP_CHECK`:禁用 GraphQL 查询中的堆栈使用情况检查。 +- `GRAPH_GRAPHQL_SKIP_HEAP_CHECK_AMOUNT`:在禁用堆栈检查时,只有在使用的堆栈超过此值时才会收集查询的性能度量。默认为 0。 +- `GRAPH_ENV`:应用程序当前运行的环境。默认为 `development`。 +- `GRAPH_NAME`:用于追踪指标的应用程序名称。默认为 `graph-node`。 +- `GRAPH_NAMESPACE`:用于追踪指标的命名空间。默认为空。 + +## 与搜索相关的环境变量 + +- `GRAPH_ENABLE_SEARCH`:设置为 `false` 以禁用搜索索引。这在测试或不需要搜索的环境中很有用。默认为 `true`。 +- `GRAPH_INDEXER_IMPORT_BUCKET_SIZE`:每次导入的索引器数据的大小。默认为 1000。 +- `GRAPH_INDEXER_TRIGGER_BUCKET_SIZE`:每次导入的触发器的大小。默认为 1000。 +- `GRAPH_INDEXER_IMPORT_THRESHOLD`:触发器数量超过此值时,将触发导入程序。默认为 10,000。 +- `GRAPH_INDEXER_EXPORT_BUCKET_SIZE`:导出时每个索引器请求的触发器的数量。默认为 1000。 +- `GRAPH_INDEXER_EXPORT_INTERVAL`:导出的间隔时间(毫秒)。默认为 500ms。 + +## 其他 + +- `GRAPH_RUNTIME_HOST_NAME`:运行时的主机名。默认为 `host.docker.internal`。 +- `GRAPH_RUNTIME_HOST_IP`:用于通信的主机 IP。默认为 `0.0.0.0`。 +- `GRAPH_ENABLE_RELAY_HUB_MISSED_CALL_MAILBOX`:启用继电器接口的未接电话邮箱。如果为 `true`,则继电器节点将为丢失的调用创建查询,该查询可能已被注册的子图处理,直到调用重新发送或过期。默认为 `false`。 +- `GRAPH_ENABLE_RELAY_HUB_PUSH_NOTIFICATIONS`:启用继电器节点发送电子邮件和 Webhooks 的功能。默认为 `false`。 +- `GRAPH_SUBGRAPH_COMMISSIONING_MAX_FAULTY_POTENTIAL_SLOTS`:当计算子图容错时,该变量用于确定在占用的插槽中,多少可以包含故障的子图。默认为 2。 + +## 子图运行时设置 + +这些环境变量是在子图映射文件中使用的,它们可以在映射中以 `` 占位符的形式进行替换。 + +- `GRAPH_NODE`:GraphQL 节点的 URL。 +- `GRAPH_ETHEREUM_RPC`:以太坊节点的 URL。 +- `GRAPH_IPFS`:IPFS 节点的 URL。 +- `GRAPH_NAME`:将在追踪指标中使用的子图名称。 +- `GRAPH_NAMESPACE`:将在追踪指标中使用的子图命名空间。 +- `GRAPH_DEPLOYMENT_ID`:部署 ID。 +- `GRAPH_PEER`:用于 IPC 通信的 Peer ID。 +- `GRAPH_START_BLOCK`:开始块。 +- `GRAPH_END_BLOCK`:结束块。 + +## 实验性环境变量 + +这些环境变量控制实验性功能。它们可能随时更改或删除。 + +- `GRAPH_RUNTIME_ALLOW_PARALLEL_QUERIES`:允 + +许对图运行时实例执行多个并行查询。默认为 `false`。 +- `GRAPH_RUNTIME_ALLOW_EVICTION`:允许从图运行时删除实例。默认为 `false`。 +- `GRAPH_SUBGRAPH_COMMISSIONING`:启用/禁用在映射文件中声明的子图的插槽管理功能。默认为 `false`。 +- `GRAPH_ALLOW_NON_DETERMINISTIC_IPFS`:如果 `true`,则在构建索引时允许从 IPFS 获取子图数据。默认为 `false`。 +- `GRAPH_EXPERIMENTAL_IPFS_MULTIBASE`:使用实验性 Multibase 格式解析 IPFS 哈希。默认为 `false`。 +- `GRAPH_ENABLE_META_GQC`:启用支持查询连接的元数据字段的实验性 GraphQL 功能。默认为 `false`。 +- `GRAPH_ALLOW_NON_DETERMINISTIC_INDEXING`:允许以非确定性方式对索引的字段进行排序。默认为 `false`。 +- `GRAPH_ENABLE_NON_DETERMINISTIC_DDL`:允许在具有相同名称的字段上运行的DDL更改。默认为 `false`。 + +## 相关链接 + +- [GitHub 存储库](https://github.com/graphprotocol/graph-node) +- [编写子图](https://thegraph.com/docs/define-subgraph) +- [运行 Graph Node](https://thegraph.com/docs/quick-start) +- [Subgraph 编译](https://thegraph.com/docs/define-subgraph#compile) + +如果需要更多详细信息,请参阅[这里](https://thegraph.com/docs/). + +如果需要支持,请在[Graph 论坛](https://forum.thegraph.com/)上发布问题或建议。 \ No newline at end of file