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 请求到 SolanaRPC 接口。

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 请求到 SolanaRPC 接口。

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