---
title: "什么是区块链索引器？"
description: "了解索引器的作用，以及它们如何帮助你查询链上数据。"
---

# 什么是区块链索引器？

<ImageBlock
  src="https://media.alchemy.com/1764645001-what-is-a-blockchain-indexer.png"
  alt="显示放大镜查看区块数据的图形"
  width={5760}
  height={2700}
  priority
/>

区块链存在一个根本性问题：其数据不可搜索。换句话说，链上数据默认无法被查询。

在传统数据库中，数据通过带有索引和关系的表来组织，开发者可以立即查询到所需请求，而无需扫描每一条记录。相比之下，区块链将数据存储为一条线性的区块链，其设计目标是不可篡改性和安全性，而非快速搜索。

这种设计意味着没有 SQL、没有内置索引、没有便捷的 `"SELECT FROM transactions WHERE..."` 函数来方便地查询数据。区块链提供的只是像 `eth\_getBlockByNumber` 这样的底层 RPC 方法，返回原始区块，迫使你逐个获取和扫描区块以找到所需内容。

举例来说，如果有人想找出某个特定钱包的所有交易，他们需要从零号区块开始，遍历数百万个区块，检查每个区块中的每笔交易，并祈祷节点不会在中途触发限流。在拥有超过[两千万个区块](https://etherscan.io/)的 [Ethereum 主网](https://www.alchemy.com/rpc/ethereum)上，这可能需要数小时甚至数天，而且你仍然需要自行组织和存储这些数据才能使其可用。

这正是索引器（indexer）发挥作用的地方，它充当区块链原始的、顺序性数据与应用程序所需的快速查询之间的桥梁。可以把它想象成链上数据的搜索引擎：它持续监控区块链，提取相关信息，将其组织成可查询的数据库，并通过 API 提供服务，响应时间从数小时缩短到几毫秒。

没有索引器，构建响应迅速的应用几乎是不可能的。想象一个加载你的投资组合需要 30 秒的 DeFi 仪表盘，或者一个无法按交易类型筛选交易记录的新型银行应用。索引器通过预先处理区块链数据来解决这个问题，这样你就不必手动扫描每一个区块。

在本指南中，我们将拆解什么是区块链索引器、它们的工作原理，并分享一些索引器在实践中的真实案例。

我们会通过代码示例保持内容的实用性，并附上相关资源链接方便你深入了解，因此无论你是刚开始构建第一个应用的初级开发者，还是只是想温习知识，本指南都能帮助你快速掌握区块链基础设施中最关键的部分之一。

## 什么是区块链索引器？

区块链索引器是一种专门的服务，它持续监视区块链，提取交易数据和智能合约事件，将其转换为结构化格式，并存储在针对快速查询进行了优化的数据库中。

可以把它看作一个三步流程：

1. **提取（Extract）**：索引器实时监控区块链节点，在新的区块、交易和事件被添加到链上时立即捕获它们。
1. **转换（Transform）**：它解码原始区块链数据，解析交易输入，解码智能合约事件，跟踪代币转账，并将状态变更整理成有意义的记录。
1. **加载（Load）**：最后，它可以将处理后的数据存储在可查询的数据库中（例如 PostgreSQL、MongoDB 或专门的图数据库），使这些数据能够通过 API 暴露出来，供应用程序使用。

若想深入了解这一过程的详细原理，可以查看 [Ethereum Foundation 关于索引器的介绍。](https://www.youtube.com/watch?v=WgBab6kamtg)

## 索引器由哪些组件构成？

尽管索引器的实现各不相同，但大多数索引器都共享一套通用架构，由若干核心组件协同工作，共同处理并提供区块链数据。以下是这些组件的组合方式：

### 1. 数据源（区块链连接）

这是索引器与区块链本身的连接，通常是一个节点（例如 Ethereum 的 [Geth](https://geth.ethereum.org/)，或 [Solana RPC](https://www.alchemy.com/dapps/list-of/rpc-node-providers-on-solana) 节点），也可以是像 Alchemy 这样的基础设施提供商的 API。

索引器持续从这个数据源拉取原始数据：新添加的区块、这些区块中的交易、智能合约发出的事件日志，有时还包括状态变更。有些索引器实时处理数据（新区块一出现就立即监听），而另一些则以批处理方式工作，用于处理历史数据或在宕机后追赶进度。

### 2. 索引引擎（处理层）

这是整个运作的核心。索引引擎负责将原始区块链数据转换为有意义且可搜索的内容。

从本质上说，引擎的工作是解码交易和事件。原始区块链数据是经过编码的：交易输入是十六进制字符串，事件日志是加密哈希值。索引引擎使用合约 [ABI](https://docs.soliditylang.org/en/latest/abi-spec.html)（应用二进制接口）来解读每笔交易实际做了什么：是一次代币兑换？一次 NFT 铸造？还是一次治理投票？它解码参数，提取有意义的值，并将一切转化为人类可读的记录。

除了解码单笔交易外，引擎还必须随时间跟踪状态变更。区块链并不会以易于访问的方式存储当前状态，而是存储一系列状态转移的历史记录。因此索引器需要通过追踪事件链来重建当前状态：跟踪每次转账后代币余额如何变化、监控 NFT 在钱包间转移时的所有权情况，以及观察智能合约存储变量在每次交互后的演变。这种状态跟踪对于诸如"这个钱包目前拥有哪些 NFT？"之类的查询至关重要——链上任何地方都不会存储这个答案，它必须从完整的转账历史中计算得出。

引擎还会构建专门的索引，即支持快速查找的高效数据结构。可以把它想象成一本书的索引：与其翻遍每一页去寻找"Ethereum"的提及，不如查阅索引直接跳转到相关页面。索引引擎会为地址（查找钱包 `0x123` 的所有活动）、代币 ID（查找 5000 号 NFT 的所有者及历史记录）、交易类型（查找所有 [Uniswap](https://www.alchemy.com/dapps/uniswap) 兑换）、时间戳（查找过去 24 小时内的所有活动）等创建查找表。正是这些索引，将对数百万个区块的顺序扫描转变为亚秒级的查询。

这个引擎的另一项关键职责是处理链重组。偶尔，区块链共识会导致最近一小段区块被另一组区块所替代。这通常被称为"[区块链重组](https://www.alchemy.com/overviews/what-is-a-reorg)"。发生这种情况时，索引器必须检测到重组，回滚从被孤立的区块中索引的任何数据，并重新索引新的规范区块。如果没有妥善处理重组，索引出的数据将包含从未在规范链上真正发生过的交易。

最后，这个索引引擎还负责管理同步和回填（backfill）。索引器首次启动时，需要处理整个区块链历史，可能是数百万个可追溯多年的区块。这个"回填"过程必须高效，通常需要并行处理区块，并通过检查点记录进度以应对重启。一旦追平进度，索引器会随着新区块的添加保持持续同步，通常只落后于链头几秒钟。如果索引器离线或落后，它必须在不遗漏任何区块的情况下追赶上进度。

这正是繁重计算工作发生的地方：解析数百万笔交易，根据合约地址和主题筛选相关事件，解码复杂的嵌套数据结构，在重组过程中保持状态一致，并将一切结构化以便快速存储和检索。

### 3. 数据库（存储层）

一旦数据被引擎处理并结构化，就需要存放在某个可查询的地方，通常是一个外部数据库。数据库的选择取决于索引器的使用场景和查询模式：

- **关系型数据库（PostgreSQL、MySQL）**：关系型数据库是大多数区块链索引器最常见的选择。它们非常适合具有复杂关系的结构化数据，比如跟踪随每笔交易变化的钱包余额、通过外键将交易历史与区块和地址关联维护、或使用跨多张表的 JOIN 操作查询代币转账。SQL 强大的查询语言使得诸如"显示过去一周内从该合约收到超过 10 ETH 的所有地址"这样的问题变得容易回答。严格的模式确保了数据的一致性，这在跟踪金融信息时至关重要。
- **NoSQL 数据库（MongoDB、Cassandra）**：NoSQL 数据库为模式可能随时间演变的半结构化数据提供了灵活性：在索引具有不同事件结构的多样化智能合约，或存储无法整齐地放入表格的原始交易元数据时非常有用。这些数据库在水平扩展方面表现出色，能够将数据分布到多台服务器上以应对海量写入量（在每秒处理数千个区块时很重要）。当原始索引速度比复杂查询能力更重要时，通常会使用这类数据库。
- **图数据库（Neo4j）**：图数据库专为关系密集型查询而设计。非常适合诸如跟踪代币在多个钱包间的流动（追踪资金）、分析 DeFi 协议之间的交互（哪些协议通过流动性池相连）、或构建社交图谱（哪些钱包之间存在交互）等使用场景。与关系型数据库的 JOIN 不同，图数据库使用原生的图遍历，使得"查找该地址 3 跳以内的所有钱包"这类查询比在关系型数据库中快出几个数量级。
- **数据仓库（BigQuery、Snowflake）**：数据仓库专为跨海量数据集进行分析和聚合而设计。它们不用于实时查询，而是用于回答诸如"本月所有 DEX 的总交易量是多少"或"展示过去一年按链划分的每日活跃地址数"这样的问题。它们能借助列式存储和分布式处理高效处理数十亿条记录，但延迟高于操作型数据库。

许多生产环境中的索引器会同时使用多种数据库类型：将交易数据存储在 PostgreSQL 中，用于支撑应用界面的快速实时查询，同时将相同的数据输入 BigQuery，用于分析仪表盘和历史趋势分析。这种混合方案让每种数据库都能发挥各自的长处。

### 4. API 层（查询接口）

API 层是应用程序访问索引数据的方式。API 暴露出一些端点，让应用可以查询处理过的区块链数据，而无需了解其底层的存储或组织方式，从而将数据库模式、索引逻辑和数据转换的复杂性抽象出来。

常见的方案包括：

- **GraphQL API**：GraphQL API 是最灵活的选择，允许客户端在单次查询中精确请求所需的数据。应用无需发起多次 REST 调用，而是可以在一次请求中获取嵌套的、相关联的数据：比如"获取该地址所有价值 &gt; 1,000 美元的 ERC-20 转账记录，并为每笔转账附上代币的名称、符号、精度和当前价格"。GraphQL 让客户端可以指定需要返回哪些字段，避免过度获取（获取不需要的数据）或获取不足（需要多次往返请求）。这对于跨多个实体的复杂查询尤其有用。例如，[The Graph 协议](https://thegraph.com/)就完全建立在 GraphQL 之上。
- **REST API**：REST API 更简单、更可预测，为常见查询提供预定义的端点。每个端点都有特定用途，比如 `/api/address/\{address\}/transactions` 用于获取交易历史，或 `/api/token/\{contract\}/holders` 用于获取所有当前代币持有人。REST 更易于缓存（因为每个 URL 代表一个特定资源）、更易于编写文档，也更为大多数开发者所熟悉。代价是灵活性较低：如果你需要的数据不在端点提供范围内，就需要发起多次请求，或等待新端点被开发出来。当查询模式已知且一致时，REST 是理想的选择。
- **WebSocket 流**：WebSocket 流非常适合在新区块被索引时进行实时更新。你的应用无需每隔几秒轮询 API 询问"有新内容吗？"，而是打开一个 WebSocket 连接，在相关数据到达的瞬间接收推送通知，比如某个特定地址收到了一笔交易。这对于需要即时更新的应用至关重要，例如实时交易仪表盘和实时通知系统。WebSocket 会保持一个开放的连接，因此比偶尔的 REST 调用更消耗资源，但能消除对时间敏感数据的延迟。

API 层通常还包含一些超出单纯提供数据本身的关键基础设施功能：缓存（将频繁请求的查询结果存储在内存中，避免反复访问数据库，大幅提升热门查询的响应速度）、限流（防止任何单个用户以过多请求压垮系统，确保每个人都能公平地访问）以及身份验证（API 密钥或令牌用于跟踪使用情况、执行访问控制，并可能对高级套餐收费）。这些功能确保 API 保持快速、可靠且经济上可持续，这在同时服务成千上万个应用时尤为重要。

## **索引器的各组件如何协同工作**

下面是一个实际运作流程的示例。索引器的数据源从某个 Ethereum 节点拉取第 18,500,000 号区块。接着，索引引擎解码该区块中的 200 笔交易，提取 500 个事件（包括 Uniswap 兑换和 NFT 转账），并识别出哪些钱包受到了影响。

之后，数据库以针对地址、代币合约和时间戳建立的索引来存储这些记录。此时，你的应用向索引器的 API 发起查询，询问"显示地址 `0x123` 本周的所有 NFT 购买记录"。API 通过查询已建立索引的数据库（而非区块链本身）在 50 毫秒内返回结果。

正是这种架构，使索引器能够将数小时的区块链扫描转变为几毫秒的查询时间。

## 索引在实践中是如何工作的？

现在我们已经了解了各个组件，接下来一起看看索引在实际中是如何运作的，并展示索引器如何将原始区块链数据转变为可即时查询的信息。

### 一个真实的例子：为 DeFi 借贷协议建立索引

让我们看一个具体的例子：一个简化的借贷协议智能合约，其运作方式类似于 [Aave](https://aave.com/) 或 [Compound](https://compound.finance/) 等平台。该合约允许用户存入抵押品并借出资产：

<CodeSnippet language="solidity" code={`// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

\`contract LendingProtocol {

\`struct Position {
address user;
address collateralToken;
uint256 collateralAmount;
address borrowedToken;
uint256 borrowedAmount;
uint256 interestRate;
uint256 timestamp;
}

mapping(uint256 => Position) public positions;
uint256 public nextPositionId;

event PositionOpened(
uint256 indexed positionId,
address indexed user,
address collateralToken,
uint256 collateralAmount,
address borrowedToken,
uint256 borrowedAmount,
uint256 interestRate
);

event PositionClosed(
uint256 indexed positionId,
address indexed user,
uint256 amountRepaid
);

event PositionLiquidated(
uint256 indexed positionId,
address indexed liquidator,
uint256 collateralSeized
);

function openPosition(
address collateralToken,
uint256 collateralAmount,
address borrowedToken,
uint256 borrowedAmount,
uint256 interestRate
) external {
uint256 positionId = nextPositionId++;

    positions[positionId] = Position({
        user: msg.sender,
        collateralToken: collateralToken,
        collateralAmount: collateralAmount,
        borrowedToken: borrowedToken,
        borrowedAmount: borrowedAmount,
        interestRate: interestRate,
        timestamp: block.timestamp
    });

    emit PositionOpened(
        positionId,
        msg.sender,
        collateralToken,
        collateralAmount,
        borrowedToken,
        borrowedAmount,
        interestRate
    );

}

function closePosition(uint256 positionId, uint256 amountRepaid) external {
require(positions[positionId].user == msg.sender, "Not position owner");

    emit PositionClosed(positionId, msg.sender, amountRepaid);

    delete positions[positionId];

}

}`} />

如果没有索引器，回答有关这个协议的问题会非常痛苦：

- "所有仓位的总锁仓价值是多少？"这需要扫描每一个区块，找出每一个 `PositionOpened` 事件，逐一解码，并计算总抵押品价值。
- "显示用户 0x123 的所有仓位"这同样需要一次完整扫描，并按用户地址进行过滤。
- "ETH 抵押贷款的平均利率是多少？"这里还需要另一次完整扫描，按抵押代币过滤，才能汇总利率。
- "本周有多少仓位被清算？"这需要扫描一周内的区块，寻找 `PositionLiquidated` 事件。

上述每一个查询都可能需要数分钟甚至数小时，并要求你处理数千兆字节的区块链数据。

有了索引器之后，情况会是这样：

1. **事件检测**：索引器监控 LendingProtocol 合约地址。当第 18,500,000 号区块中包含一笔发出 `PositionOpened` 事件的交易时，索引器会立即捕获它。
1. **数据提取**：使用该合约的 ABI，索引器解码事件参数：`positionId=42`、`user=0xabc...`、`collateralToken=0xWETH`、`collateralAmount=5000000000000000000`（5 ETH，以 wei 计）、`borrowedToken=0xUSDC`、`borrowedAmount=8000000000`（8,000 USDC）、`interestRate=500`（5%）。
1. **数据丰富**：索引器可以通过获取额外上下文来增强这些数据，比如查询 ETH 和 USDC 当前的美元价格以计算该仓位的美元价值，或存储区块时间戳以支持基于时间的查询。
1. **存储**：将其写入带有多个索引的数据库：

<CodeSnippet language="sql" code={`INSERT INTO lending_positions (
    position_id, user_address, collateral_token, collateral_amount,
    borrowed_token, borrowed_amount, interest_rate, 
    block_number, timestamp, status
) VALUES (42, '0xabc...', '0xWETH', 5000000000000000000, '0xUSDC', 8000000000, 500, 18500000, 1699564800, 'open');

-- Create indexes for fast lookups
CREATE INDEX idx_user ON lending_positions(user_address);
CREATE INDEX idx_collateral_token ON lending_positions(collateral_token);
CREATE INDEX idx_status ON lending_positions(status);`} />

5.** API 服务**：现在，这些复杂的查询变成了简单、快速的数据库查找：

- "总锁仓价值？" → `SELECT SUM\(collateral\_amount \* token\_price\) FROM lending\_positions WHERE status='open'`（10 毫秒内返回）
- "用户 0x123 的仓位？" → `SELECT \* FROM lending\_positions WHERE user\_address='0x123'`（即时返回）
- "ETH 贷款的平均利率？" → `SELECT AVG\(interest\_rate\) FROM lending\_positions WHERE collateral\_token='0xWETH'`（几毫秒内返回）

索引器会对每一个新区块持续重复这一过程，维护该协议完整状态和历史记录的实时、可查询视图。当 `PositionClosed` 事件触发时，它会更新状态字段。当价格变化时，它可以重新计算仓位健康率，用于清算监控。

正是这种从顺序性区块链扫描到索引数据库查询的转变，使现代加密金融科技仪表盘、分析平台和风险监控工具成为可能。没有索引器，我们所期待的区块链应用体验根本不会存在。

## 索引器解决了哪些问题？

现在你已经通过我们的借贷协议示例了解了索引的工作原理，接下来让我们总结一下索引器为开发者解决的根本性问题：

- **数据访问与查询性能**：区块链没有内置的搜索功能，需要按顺序扫描数百万个区块才能查询数据。索引器提取区块链数据并通过战略性索引将其组织成可查询的数据库，将耗时数小时的扫描变成毫秒级查询。
- **数据分析**：要理解大规模的活动情况（交易量、用户模式、协议健康状况）需要对海量数据集进行聚合。索引器维护历史状态并预先计算常见指标。每日 DEX 交易量已经预先汇总；协议变更后的不活跃钱包可以通过已索引的时间戳即时查询，无需自建数据管道。
- **实时应用开发**：现代应用必须即时响应链上事件，才能为用户提供准确且高性能的体验。持续轮询区块链节点既缓慢又低效。索引器使用基于推送的架构（WebSocket），在事件发生的瞬间通知应用程序，使区块链应用的响应速度媲美 Web2 应用。

## 常见的索引使用场景

理解索引器存在的原因，有助于弄清楚你实际能用它们构建什么。以下是一些利用索引化区块链数据的真实应用：

- **DeFi 仪表盘与投资组合管理**：像 [Zapper](https://zapper.xyz/)、[Debank](https://debank.com/) 和 [Zerion](https://zerion.io/) 这样的应用，将用户在数十个协议中的仓位——[Aave](https://aave.com/) 上的借贷仓位、[Uniswap](https://uniswap.org/) 上的流动性池、[Lido](https://lido.fi/) 上的质押资产等等——汇总到一个带有实时美元估值的单一投资组合视图中。如果没有索引器，每次页面加载都需要单独查询数百个智能合约。
- **具备高级搜索功能的市场**：像 [OpenSea](https://opensea.io) 这样的平台，用户可以按特定属性筛选收藏品、按稀有度排名排序、查看完整的所有权历史，并跟踪地板价随时间的变化。索引器使得对数百万个 ERC-721 的这类复杂查询成为可能，而无需为每次搜索扫描整个区块链。
- **链上分析平台**：像 [Dune](https://dune.com/home)、[Nansen](https://www.nansen.ai/) 和 [Flipside Crypto](https://flipsidecrypto.xyz/home/) 这样的工具提供自定义仪表盘，展示协议指标，跟踪 DEX 交易量、借贷协议的利用率、跨链桥流量以及巨鲸钱包动向。分析师可以针对已索引数据编写 SQL 查询，而无需处理原始区块链日志。
- **交易机器人与 MEV 策略**：自动化交易系统监控内存池中的交易以寻找套利机会，跨多个 DEX 跟踪流动性池储备以实现最优路由，并在触发事件所在的区块内执行策略。这些都需要只有索引器才能大规模提供的亚秒级数据访问。
- **钱包**：像 [MetaMask](https://metamask.io/)、[Rainbow](https://rainbow.me) 和 [Phantom](https://phantom.com/) 这样的现代钱包，会显示完整的交易历史、代币余额（包括你不知道自己拥有的代币）、待处理交易以及预估的 gas 费用。这些功能都依赖于索引数据，直接查询区块链节点会使钱包界面慢到无法使用。
- **区块链浏览器**：[Etherscan](https://etherscan.io/)、[Solscan](https://solscan.io/) 及类似的浏览器让用户搜索任意地址、交易哈希、区块号或代币合约，并立即看到完整的详情、相关交易和历史活动。它们本质上是建立在全面的区块链索引器之上的 UI 层。
- **DAO 治理平台**：像 [Snapshot](https://snapshot.org/) 和 [Tally](https://www.tally.xyz/) 这样的工具会跟踪提案的生命周期、基于特定区块时代币持有量计算的投票权、委托关系以及投票历史。这些平台需要已索引的历史状态，才能计算出谁有资格对过去的提案进行投票。
- **风险管理与监控**：协议使用索引器来监控存在被清算风险的大额仓位、跟踪异常的钱包活动模式以发出安全警报、通过分析交易模式识别潜在的智能合约漏洞利用，并在满足特定链上条件时生成告警。
- **跨链桥**：促成跨链资产转移或在多个网络中寻找最优兑换路径的应用，需要来自每条区块链的实时索引数据，以计算费用、比较汇率并跟踪转账状态。

## 2025 年热门索引器

索引领域提供了从去中心化协议到全托管服务等一系列解决方案。以下是主流选项的概览：

### The Graph

[The Graph](https://thegraph.com/) 是应用最广泛的去中心化索引协议。开发者定义"subgraph"（子图），即指定要监控哪些智能合约、以及如何将其数据转换为可查询格式的自定义索引配置。独立的节点运营者运行索引基础设施，并通过提供查询服务赚取 GRT 代币。The Graph 最适合那些优先考虑抗审查性、并希望依赖去中心化基础设施而非中心化服务提供商的项目。

### Goldsky

[Goldsky](https://goldsky.com/) 是一个支持超过 90 条区块链的基础设施平台，专注于自定义数据管道。它擅长处理复杂的数据转换、将区块链数据流式传输到外部数据库，以及为分析工作负载提供数据仓库支持。Goldsky 既提供与 Graph 兼容的子图托管，也提供专有的 Mirror 管道系统用于实时数据流处理。对于需要超出标准 GraphQL 查询能力、具备自定义业务逻辑的多链索引的团队来说，它非常适用。

### Chainstack

[Chainstack](https://chainstack.com/) 是一家企业级区块链基础设施提供商，提供 Subgraph 作为托管服务。它提供具备正常运行时间 SLA 保证的可靠索引服务、用于低延迟查询的全球 CDN 分发，以及专属支持渠道。该平台支持 Ethereum 及兼容 EVM 的链，并与 Chainstack 更广泛的节点基础设施产品相集成。对于需要企业级支持、合规功能和可预测扩展能力的组织而言，Chainstack 尤其适合。

## 如何为你的项目选择索引器

选择合适的索引器取决于你的具体需求。以下是需要考虑的关键因素：

**1. 链兼容性** 不同的索引器支持不同的区块链生态系统，因此要确认所选索引器支持你打算构建的链。有些索引器专注于特定网络，如 Solana，而另一些则专注于兼容 EVM 的链，或提供广泛的多链覆盖。

**2. 查询需求** 索引器根据你的需求提供不同的查询接口：GraphQL 适用于灵活的嵌套查询，REST 适用于简单的预定义端点，SQL 适用于分析工作负载，WebSocket 适用于实时流式传输。请考虑你的应用将如何访问数据，并选择支持这些模式的索引器。

**3. 性能需求** 请仔细考虑你对延迟和吞吐量的要求。有些索引器优先考虑实时应用所需的速度，而另一些则专注于全面的历史数据访问或高交易量的分析查询。

**4. 基础设施理念** 决定你是想要一个完全托管的服务（这会降低运营开销但引入供应商依赖），还是一个去中心化协议（提供抗审查性，但需要更多的搭建和维护工作）。

**5. 成本结构** 大多数索引器提供分层定价：免费层用于开发、按量付费适用于成长中的项目、企业方案适用于生产工作负载。在估算长期成本时，要考虑你预期的查询量以及任何数据出口费用。

**6. 开发者体验** 评估文档质量、对你偏好编程语言的 SDK 支持，以及社区资源的可获得性。良好的开发者支持和清晰的示例能显著缩短你的集成时间。

**7. 数据专业化** 对于像 NFT 市场或 Solana 应用这样的特定使用场景，专门的索引器通常比通用解决方案提供更丰富的开箱即用数据。请考虑针对你所在领域预先丰富好的数据是否能为你节省大量的开发工作。

## 结论

大规模处理链上数据是一个难题。区块链的设计并不是为了满足现代应用所需的那种查询——在没有正确基础设施的情况下，跨数百万笔交易进行搜索、过滤、聚合会使应用陷入停滞。

索引器通过承担这些繁重工作来解决这个问题：持续处理区块链数据，将其组织成可查询的格式，并通过快速的 API 提供服务。这让你可以专注于构建出色的应用程序，而不必与数据管道和区块链节点搏斗。

准备好开始了吗？Alchemy 提供了一整套全面的工具和经过丰富处理的 API，旨在让区块链开发变得简单直接。查看 [Alchemy 文档](https://www.alchemy.com/docs/)开始构建。

## 常见问题

### 什么是区块链索引器？

区块链索引器是一种专门的服务，它持续监控区块链，提取交易数据和智能合约事件，将其转换为结构化格式，并存储在针对快速查询进行了优化的数据库中。

### 区块链索引器是如何工作的？

索引器遵循一个三步流程：提取（实时监控区块链节点）、转换（解码原始区块链数据并整理状态变更）、加载（将处理后的数据存储在可查询的数据库中，并通过 API 供应用程序使用）。

### 区块链索引器的主要组件有哪些？

核心组件包括数据源（区块链连接）、索引引擎（解码交易和事件的处理层）、数据库（如 PostgreSQL 或 MongoDB 等存储层），以及 API 层（使用 GraphQL、REST 或 WebSocket 的查询接口）。

### 为什么我不能直接查询区块链数据？

区块链将数据存储为针对安全性而非快速搜索进行优化的线性区块链。没有内置的 SQL 或索引，因此查找特定数据需要逐一扫描数百万个区块，这可能需要数小时甚至数天。

### 区块链索引器为开发者解决了哪些问题？

索引器将耗时数小时的区块链扫描变成毫秒级查询，支持对海量数据集进行实时分析和聚合，并提供基于推送的架构，使区块链应用的响应速度媲美传统 Web 应用。

### 区块链索引器的常见使用场景有哪些？

常见的应用包括 DeFi 仪表盘和投资组合跟踪器、链上分析平台、交易机器人、现代钱包、区块链浏览器以及跨链桥。

### 我该如何为我的项目选择合适的索引器？

需要考虑链兼容性、查询需求（GraphQL 与 REST 与 SQL 之间的取舍）、性能需求、基础设施理念（托管服务还是去中心化）、成本结构、开发者体验质量，以及是否需要针对你的使用场景提供专门的数据。

### 索引器和运行全节点有什么区别？

全节点存储整个区块链，直接查询需要占用大量资源；而索引器会预先处理并优化数据，以便通过 API 实现亚秒级检索，从而消除了缓慢的人工区块链扫描的需要。
