POST
/
getProgramAccountsV2
curl --request POST \
  --url https://mainnet.helius-rpc.com/ \
  --header 'Content-Type: application/json' \
  --data '{
  "jsonrpc": "2.0",
  "id": "1",
  "method": "getProgramAccountsV2",
  "params": [
    "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    {
      "encoding": "base64",
      "limit": 1000
    }
  ]
}'
{
  "jsonrpc": "2.0",
  "id": "1",
  "result": {
    "accounts": [
      {
        "pubkey": "CxELquR1gPP8wHe33gZ4QxqGB3sZ9RSwsJ2KshVewkFY",
        "account": {
          "lamports": 15298080,
          "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
          "data": [
            "2R9jLfiAQ9bgdcw6h8s44439",
            "base64"
          ],
          "executable": false,
          "rentEpoch": 28,
          "space": 165
        }
      }
    ],
    "paginationKey": "8WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM",
    "totalResults": 25000
  }
}
测试版发布:请注意,getProgramAccountsV2 可供早期使用。如遇到任何问题,请联系支持。

概述

getProgramAccountsV2 是标准 getProgramAccounts 方法的增强版本,专为需要高效查询由特定 Solana 程序拥有的大量账户的应用程序设计。此方法引入了基于游标的分页和增量更新功能。
V2 中的新功能:
  • 基于游标的分页:每个请求可配置从 1 到 10,000 个账户的限制
  • 增量更新:使用 changedSinceSlot 仅获取最近修改的账户
  • 更好的性能:防止超时并减少大数据集的内存使用
  • 向后兼容:支持所有现有的 getProgramAccounts 参数

主要优势

可扩展查询

通过高效分页处理拥有数百万账户的程序

实时同步

使用 changedSinceSlot 进行增量更新和实时数据同步

防止超时

以前超时的大型查询现在通过分页可靠地工作

内存高效

分块处理数据,而不是一次性加载所有数据到内存中

分页最佳实践

重要的分页行为:分页结束仅在没有返回账户时指示。由于过滤,API 可能返回少于限制的账户 - 始终继续分页,直到 paginationKeynull

基本分页模式

let allAccounts = [];
let paginationKey = null;

do {
  const response = await fetch(`https://mainnet.helius-rpc.com/?api-key=${API_KEY}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: '1',
      method: 'getProgramAccountsV2',
      params: [
        "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
        {
          encoding: 'base64',
          filters: [{ dataSize: 165 }],
          limit: 5000,
          ...(paginationKey && { paginationKey })
        }
      ]
    })
  });
  
  const data = await response.json();
  allAccounts.push(...data.result.accounts);
  paginationKey = data.result.paginationKey;
} while (paginationKey);

增量更新

// Get only accounts modified since slot 150000000
const incrementalUpdate = await fetch(`https://mainnet.helius-rpc.com/?api-key=${API_KEY}`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: '1',
    method: 'getProgramAccountsV2',
    params: [
      programId,
      {
        encoding: 'jsonParsed',
        limit: 1000,
        changedSinceSlot: 150000000
      }
    ]
  })
});

性能提示

最佳限制大小:对于大多数用例,每个请求限制在 1,000-5,000 个账户之间提供了性能和可靠性的最佳平衡。
  • 从较小的限制开始 (1000),并根据您的网络性能增加
  • 使用适当的编码jsonParsed 方便,base64 性能
  • 应用过滤器 以在分页前减少数据集大小
  • 存储 paginationKey 以便在查询中断时恢复
  • 监控响应时间 并相应调整限制

从 getProgramAccounts 迁移

从原始方法迁移很简单 - 只需替换方法名称并添加分页参数:
{
  "jsonrpc": "2.0",
  "id": "1",
- "method": "getProgramAccounts",
+ "method": "getProgramAccountsV2",
  "params": [
    "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    {
      "encoding": "base64",
      "filters": [{ "dataSize": 165 }],
+     "limit": 5000
    }
  ]
}

相关方法

Authorizations

api-key
string
query
required

您的 Helius API 密钥。您可以在仪表板中免费获取一个。

Body

application/json

Response

200
application/json

成功检索到分页的程序账户。

The response is of type object.