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 还需要用相应的序列化方法进行解析才能知道具体的记录是什么。