了解 getProgramAccounts 的使用案例、代码示例、请求参数、响应结构和提示。
getProgramAccounts
RPC 方法是查询 Solana 区块链的强大工具。它允许您检索由特定链上程序拥有的所有账户。这对于广泛的应用程序至关重要,从查找与特定代币铸造相关的用户的所有代币账户,到发现去中心化应用程序的所有用户特定数据账户。
由于程序可能拥有的账户数量可能很大,getProgramAccounts
提供了强大的过滤功能,帮助您缩小搜索范围并高效地检索所需数据。
对于需要查询非常大规模程序账户的应用程序,考虑使用 getProgramAccountsV2
,它提供基于游标的分页支持,配置的页面大小每次请求最多可达 10,000 个账户。
getProgramAccounts
可以找到该结构的所有实例。programId
(string
,必需):
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
(用于 SPL 代币程序)。options
(object
, 可选): 一个配置对象,包含以下字段:
commitment
(string
): 指定承诺级别(例如,"finalized"
, "confirmed"
)。encoding
(string
): 每个返回账户中data
字段的编码。默认为"base64"
。
"base58"
: 二进制数据的较慢替代方案。"base64"
: 二进制数据的标准base64编码。"base64+zstd"
: base64编码的zstd压缩二进制数据。"jsonParsed"
: 如果RPC节点有程序账户类型的解析器(例如,SPL Token, Stake),则data
字段将是一个结构化的JSON对象。强烈推荐用于可读性和易用性。filters
(array
): 一个应用于账户的过滤对象数组。这对于性能和相关性至关重要。您可以使用最多4个过滤器。常见的过滤器包括:
dataSize
(object
):
dataSize
(u64
): 按数据长度(字节)过滤账户。例如:{ "dataSize": 165 }
(用于SPL Token账户)。memcmp
(object
): 内存比较。将账户数据的一个切片与提供的字节进行比较。
offset
(usize
): 开始比较的账户数据字节偏移量。bytes
(string
): 要匹配的字节的base-58编码字符串。字节串必须小于129字节。memcmp
,其中offset: 0
(铸币地址存储在代币账户中)和bytes
设置为铸币的公钥。dataSlice
(object
): 仅返回每个账户数据的特定切片。对于只需要部分数据的大账户非常有用。
offset
(usize
): 开始切片的字节偏移量。length
(usize
): 要返回的字节数。dataSlice
主要用于二进制编码,而不是jsonParsed
。withContext
(boolean
): 如果true
,响应将是一个RpcResponse
对象,包含一个context
(带有slot
)和value
(账户数组)。如果false
或省略,通常只返回账户数组。行为可能因RPC提供商而略有不同。minContextSlot
(u64
): 请求可以评估的最小槽位。pubkey
(string
):账户的 base-58 编码公钥。account
(object
):
lamports
(u64
):账户的 lamports 余额。owner
(string
):拥有此账户的程序的 base-58 编码公钥(这将是您查询的 programId
)。data
(string
, array
, 或 object
):账户的数据,根据 encoding
参数格式化。
jsonParsed
:表示反序列化账户状态的 JSON 对象。base64
:一个数组 ["encoded_string", "base64"]
。executable
(boolean
):账户是否可执行(即自身是一个程序)。rentEpoch
(u64
):此账户下次需要支付租金的纪元。space
(u64
, 可选):账户的数据长度,以字节为单位。有时称为 data.length
,如果数据是一个缓冲区,或是解析结构的一部分。withContext: true
,此数组将嵌套在 value
字段下的一个 RpcResponse
对象中。
dataSize
过滤代币账户(165 字节),并使用 memcmp
匹配偏移量 0 处的 USDC 铸币地址。
dataSize
(165 字节)和 memcmp
在偏移量 32(代币账户中存储所有者公钥的位置)。
memcmp
: 过滤在给定偏移量处匹配特定模式的账户dataSize
: 按账户的确切数据大小过滤getProgramAccounts
在 RPC 节点上可能资源密集,尤其是在没有过滤器或程序有许多账户时。始终使用过滤器(dataSize
, memcmp
)和 dataSlice
尽可能减少查询范围和响应大小。getProgramAccountsV2
以支持分页。getProgramAccounts
调用可能会触及这些限制。memcmp
需要了解您查询的账户数据的字节布局。jsonParsed
可用性: jsonParsed
编码取决于 RPC 节点是否有特定程序账户类型的解析器。对于常见程序如 SPL Token 广泛支持。getProgramAccounts
是开发人员需要查询和与程序拥有的账户集交互的不可或缺的方法。掌握其过滤选项是构建高效且稳健的 Solana 应用程序的关键。
getProgramAccountsV2
提供:
limit
(1-10,000)并使用paginationKey
来浏览结果changedSinceSlot
仅获取自特定槽位以来修改的账户paginationKey
为null