指南
节点近况与已索引历史:什么时候用 eth_getLogs,什么时候用转账接口
对比 JSON-RPC 的 eth_getLogs 与 Data API 的转账接口:区块跨度、分页、覆盖范围与最终性限制,以及典型任务该选哪一个。
两种读取日志与转账的方式
eth_getLogs 是 JSON-RPC 方法,通过 JSON-RPC 端点返回区块日志。Data API 则通过两个按链划分的端点提供代币转账历史:
GET /{chain}/addresses/{address}/transfers——与某个地址相关的转账。GET /{chain}/tokens/{token}/transfers——某个代币合约的转账。
两者使用同一个 API key,并按方法权重以 CU 计量(见下方权重表)。选哪一种,取决于数据有多新、是否需要指定区块窗口,以及如何翻页。
eth_getLogs 受到的限制
eth_getLogs 受公开的 GET /v1/chains 响应中逐链公布的各项限制约束:
- 区块跨度:
max_logs_block_range是单次eth_getLogs请求允许跨越的最大区块数。该值因链而异——请从GET /v1/chains读取(链列表见支持的链),不要写死在代码里。超过该链上限时返回 JSON-RPC 错误-32602 eth_getLogs block range too large(不计费)。 - 节点同步:当某条链的节点未同步时,
eth_getLogs(与除eth_chainId外的所有方法一样)返回-32010;该调用不会被转发,也不计费。 - 状态窗口:
GET /v1/chains中的state_window_blocks所描述的状态窗口只作用于状态类方法(如eth_call、eth_getBalance),不作用于eth_getLogs。 - 节点历史裁剪:区块与日志查询不受状态窗口限制,但受节点保留历史的限制;已被裁剪的数据返回
4444 pruned history unavailable(不计费)。
过滤字段 fromBlock、toBlock 缺省或为 null 时按 latest 处理。
本服务暂不支持 WebSocket 订阅:eth_subscribe 返回 -32601 method not available。如需跟进新事件,请轮询 eth_getLogs 查询最新区块。
Data API 转账接口提供什么
两个端点的必填参数不同:
| 端点 | standard | 区块窗口 |
|---|---|---|
GET /{chain}/addresses/{address}/transfers | 必填:erc20 或 erc721。erc1155 返回 422 no_coverage | from_block 与 to_block 均必填。结果按 (block_number, log_index) 降序排列。direction(in、out 或 any,默认 any)按方向过滤,token 可选,用于限定单个合约。 |
GET /{chain}/tokens/{token}/transfers | 必填:erc20、erc721 或 erc1155 | from_block 与 to_block 可选。缺省 to_block 时默认取 finalized_block;显式传入高于它的值会直接返回 409,没有 clamp 回退。 |
分页
两个端点都使用游标分页(keyset pagination):
limit默认 50;超过 500 会被收敛为 500,0或非整数返回400 bad_request。- 仅当还有下一页时才返回
next_cursor;最后一页该字段整个不存在,绝不会是null。 - 把返回的
next_cursor原样作为cursor传回即可取下一页。游标只对签发它的链、端点和查询参数有效。
覆盖范围与最终性
- 两个端点都属于
transfers能力。未提供该能力的链返回422 no_coverage。提供该数据集的链以支持的链页面为准。 GET /v1/data/chains返回每条链的coverage(history_mode、from_block,窗口链还有retention_days)。完全早于该链首个已索引区块的窗口返回422 no_coverage;起点早于它、但终点在其后的窗口会尽量返回,并带有meta.coverage = "partial"。窗口链的coverage.from_block会向前移动——请在运行时读取。- 按区块查询的响应只提供不高于
meta.finalized_block的数据。它是重组安全水位线(不是共识最终性信号),按链以固定余量落后于as_of_block。 - 对按地址查询的端点,
to_block高于finalized_block时返回409 finality_exceeded,除非clamp=true将其截断到finalized_block;窗口过大时返回409 window_too_large,除非clamp=true。按代币查询的端点没有clamp回退。
每条转账数据包含 token、standard、from、to、block_number、block_timestamp、tx_hash、tx_index、log_index。ERC-20 额外有 amount;ERC-721 额外有 token_id;ERC-1155 额外有 operator、token_id、value、batch_index。
该选哪一个
| 典型任务 | 更适合 | 理由 |
|---|---|---|
| 最近几百个区块的事件 | eth_getLogs | 只要区间不超过该链的 max_logs_block_range,一次请求即可覆盖最近一段区块。与转账接口不同,它不限于 finalized_block 及以下的区块。 |
| 某地址的历史转账 | GET /{chain}/addresses/{address}/transfers | 按地址维度查询,支持 from_block/to_block 窗口、direction 与 token 过滤,并用游标翻页;结果截止到 finalized_block。 |
| 某代币的全部转账 | GET /{chain}/tokens/{token}/transfers | 按代币合约维度查询,standard 覆盖 erc20、erc721、erc1155,窗口可选,用游标分页遍历全部结果。 |
| 实时监听新事件 | eth_getLogs(轮询) | 本服务暂不支持 WebSocket 订阅(eth_subscribe 返回 -32601),且转账接口只提供不高于 finalized_block 的数据。请轮询 eth_getLogs 查询最新区块。 |
用 eth_getLogs 查询日志
export BLOCKVECTRA_API_KEY=rgw_your_api_key
# fromBlock / toBlock 缺省时为 latest。跟进新事件时可显式指定最近区间,
# 并让跨度不超过该链的 max_logs_block_range。
curl -s "https://dev-api.blockvectra.network/v1/robinhood_mainnet" \
-H 'Content-Type: application/json' \
-H "x-api-key: $BLOCKVECTRA_API_KEY" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_getLogs",
"params": [{
"address": "0x1111111111111111111111111111111111111111",
"fromBlock": "latest",
"toBlock": "latest"
}]
}'用 Data API 查询转账
export BLOCKVECTRA_API_KEY=rgw_your_api_key
# 这里 from_block / to_block 可选;缺省 to_block 时默认取 finalized_block。
curl -s "https://dev-api.blockvectra.network/v1/data/robinhood_mainnet/tokens/0x1111111111111111111111111111111111111111/transfers?standard=erc20" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"若要按地址查询,from_block 与 to_block 均为必填:
# clamp=true 会把过宽的窗口、或高于 finalized_block 的 to_block 截断,
# 而不是返回 409。
curl -s "https://dev-api.blockvectra.network/v1/data/robinhood_mainnet/addresses/0x1111111111111111111111111111111111111111/transfers?standard=erc20&from_block=0&to_block=73000000&direction=any&clamp=true" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"单次调用的 CU
每个方法都按其 CU 权重计费。下方权重在构建时从平台计划接口读取:
单次调用的 CU 权重
| 方法 | 单次调用 CU |
|---|---|
eth_getLogs | 30 |
data.address_transfers | 25 |
data.token_transfers | 25 |
以上权重在构建时从平台计划接口读取。
当前价格与充值方式见定价页。