跳转到主要内容
POST
getProgramAccountsV2
curl --request POST \
  --url 'https://mainnet.helius-rpc.com/?api-key=' \
  --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 是标准 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
jsonrpc
enum<string>
default:2.0
required

JSON-RPC 协议版本。

可用选项:
2.0
Example:

"2.0"

id
string
default:1
required

请求的唯一标识符。

Example:

"1"

method
enum<string>
default:getProgramAccountsV2
required

要调用的 RPC 方法名称。

可用选项:
getProgramAccountsV2
Example:

"getProgramAccountsV2"

params
(string | object)[]
required

增强分页方法的参数。

要查询账户的 Solana 程序公钥(地址),以 base-58 编码的字符串形式。

Example:

"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"

Response

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

jsonrpc
enum<string>

JSON-RPC 协议版本。

可用选项:
2.0
Example:

"2.0"

id
string

与请求匹配的标识符。

Example:

"1"

result
object

带有导航元数据的分页程序账户。