Solana 查询账号接口
Solana 的账号查询接口提供了多种功能,包括获取账号信息、查询账号余额以及获取某个合约管理的所有账号等。
这些接口可以帮助开发者更好地了解和管理 Solana 区块链上的账号信息。
1. 获取账号信息
Solana 上存储的内容,都是一个 Account 对象,包含着元数据信息:
pub struct Account {
/// lamports in the account
pub lamports: u64,
/// data held in this account
#[serde(with = "serde_bytes")]
pub data: Vec,
/// the program that owns this account. If executable, the program that loads this account.
pub owner: Pubkey,
/// this account's data contains a loaded program (and is now read-only)
pub executable: bool,
/// the epoch at which this account will next owe rent
pub rent_epoch: Epoch,
}
通过 getAccountInfo 方法可以获取指定账号的详细信息,包括 lamports(余额)、data(数据)、owner(所有者)、executable(是否可执行)、rent_epoch(租金周期)等。
curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getAccountInfo",
"params": [
"5pWae6RxD3zrYzBmPTMYo1LZ5vef3vfWH6iV3s8n6ZRG",
{
"encoding": "base58",
"commitment": "finalized"
}
]
}
'
返回结果:
{
"jsonrpc": "2.0",
"result": {
"context": {
"apiVersion": "1.16.1",
"slot": 206885329
},
"value": {
"data": [
"",
"base58"
],
"executable": false,
"lamports": 59597675320,
"owner": "11111111111111111111111111111111",
"rentEpoch": 349,
"space": 0
}
},
"id": 1
}
在 result 里面可以看到 value 里面的值项目,和 Rust 的结构体是一一对应的,其中:
data 表示数据内容, 这里我们的普通账号不是合约账号,因此其为空,后面的"base58"表示如果这里有值,那么将是二进制内容的 base58 格式编码。
这个编码格式是我们在请求里面的 "encoding" 来指定的。
"executable" 表示是否为可执行合约。
"lamports" 表示余额,这里精度 10^9。
"owner" 是系统根账号: "11111111111111111111111111111111"。
2. 获取账号余额
Solana RPC 提供了getBalance 方法,也可以得到余额信息。
我们在命令行中,通过 curl 命令发送 POST 请求到 Solana 的 RPC 接口。
curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0", "id": 1,
"method": "getBalance",
"params": [
"5pWae6RxD3zrYzBmPTMYo1LZ5vef3vfWH6iV3s8n6ZRG"
]
}
'
返回结果:
{
"jsonrpc": "2.0",
"result": {
"context": {
"apiVersion": "1.16.1",
"slot": 206886725
},
"value": 989995000
},
"id": 1
}
可以看到是 989995000,因为 SOL 的精度是 10^9,所以也就是 0.989995 个 SOL。
3. 查询某合约管理的所有账号
通过 getProgramAccounts 方法可以获取某个合约管理的所有账号信息,这对于查询合约管理的用户账号或特定类型的账号非常有用。
该方法的作用就是罗列出某个合约管理的 Account,比如 SPL Token 合约记录的所有用户的余额信息。
我们在命令行中,通过 curl 命令发送 POST 请求到 Solana 的 RPC 接口。
curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getProgramAccounts",
"params": [
"namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX",
{
"encoding": "jsonParsed",
"filters": [
{
"dataSize": 128
}
]
}
]
}
'
获取所有 NameService 服务管理的名字,而且记录空间大小为 128 字节的记录:
{
"jsonrpc":"2.0",
"result":[
{
"account":
{
"data":["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHgMUi7LJb6+YQzBNlYJYu4QoAPOPzOY6F9NasCG9howAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGVsbG8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","base64"],
"executable":false,
"lamports":1781761,
"owner":"namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX",
"rentEpoch":349,
"space":128
},
"pubkey":"5mBDoMGJvQTQhgAK2LtjKmG3TGV8J1m3LoEHRMXqits9"
},
{
"account":
{
"data":[
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHgMUi7LJb6+YQzBNlYJYu4QoAPOPzOY6F9NasCG9howAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaGVsbG8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","base64"],
"executable":false,
"lamports":1781761,
"owner":"namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX",
"rentEpoch":349,
"space":128
},
"pubkey":"8worhyBqrHu1MYYQdQ3zpg5ByuhUge4rYHHhN8E8Vc3j"
}
],
"id":1
}
这里的 data 还需要用相应的序列化方法进行解析才能知道具体的记录是什么。