Solana 查询交易接口

交易相关接口在 Solana 上可以实现多种操作,包括获取交易手续费、获取交易详细信息以及发送交易。

1. 获取交易手续费

getFeeForMessage 接口用于预估特定交易的手续费。

您需要提供一个序列化后的交易消息 RawTransaction 作为参数,然后节点会根据当前情况估算出执行这个交易所需的手续费。

我们在命令行中,通过 curl 命令发送 POST 请求到 SolanaRPC 接口。

curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
    {
        "id":1,
        "jsonrpc":"2.0",
        "method":"getFeeForMessage",
        "params":[
            "AQABAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAA",
            {
                "commitment":"processed"
            }
        ]
    }
    '

返回结果:

{
    "jsonrpc": "2.0",
    "result": {
        "context": {
        "apiVersion": "1.16.3",
        "slot": 209111155
        },
        "value": null
    },
    "id": 1
    }

2. 获取交易详细信息

getTransaction 接口允许您获取特定交易的详细信息,包括交易的执行情况、费用、指令信息等。

我们在命令行中,通过 curl 命令发送 POST 请求到 SolanaRPC 接口。

curl  https://api.devnet.solana.com  -X POST -H "Content-Type: application/json" -d '
        {
            "jsonrpc": "2.0",
            "id": 1,
            "method": "getTransaction",
            "params": [
                "2o9qCEhwKi8w7hTFQJTLwMBZPFH8qM3iNd9rprtdY6XShyrpsqkWt4Df3Zgsxv6y4nbRe4SDgU8KMvuMfs7HxVhp",
                "jsonParsed"
            ]
        }
    '

返回结果:

{
  "jsonrpc": "2.0",
  "result": {
    "blockTime": 1674954447,
    "meta": {
      "computeUnitsConsumed": 12481,
      "err": null,
      "fee": 5000,
      "innerInstructions": [],
      "logMessages": [
        "Program gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s invoke [1]",
        "Program gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s consumed 2633 of 600000 compute units",
        "Program gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s success",
        "Program gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s invoke [1]",
        "Program gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s consumed 5562 of 597367 compute units",
        "Program gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s success",
        "Program gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s invoke [1]",
        "Program gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s consumed 4286 of 591805 compute units",
        "Program gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s success"
      ],
      "postBalances": [
        420164575000,
        23942400,
        23942400,
        23942400,
        1169280,
        1141440
      ],
      "postTokenBalances": [],
      "preBalances": [
        420164580000,
        23942400,
        23942400,
        23942400,
        1169280,
        1141440
      ],
      "preTokenBalances": [],
      "rewards": [],
      "status": {
        "Ok": null
      }
    },
    "slot": 192074782,
    "transaction": {
      "message": {
        "accountKeys": [
          {
            "pubkey": "vir55LvSEGcY55ny876GycLmFCxMXTkoRg7RxDvKiw5",
            "signer": true,
            "source": "transaction",
            "writable": true
          },
          {
            "pubkey": "8PugCXTAHLM9kfLSQWe2njE5pzAgUdpPk3Nx5zSm7BD3",
            "signer": false,
            "source": "transaction",
            "writable": true
          },
          {
            "pubkey": "EfnLcrwxCgwALc5vXr4cwPZMVcmotZAuqmHa8afG8zJe",
            "signer": false,
            "source": "transaction",
            "writable": true
          },
          {
            "pubkey": "6Ukmvns6Uyf3nRVj3ErDBgx7BiZRNJrLyXe1nGQ7CUHA",
            "signer": false,
            "source": "transaction",
            "writable": true
          },
          {
            "pubkey": "SysvarC1ock11111111111111111111111111111111",
            "signer": false,
            "source": "transaction",
            "writable": false
          },
          {
            "pubkey": "gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s",
            "signer": false,
            "source": "transaction",
            "writable": false
          }
        ],
        "instructions": [
          {
            "accounts": [
              "vir55LvSEGcY55ny876GycLmFCxMXTkoRg7RxDvKiw5",
              "8PugCXTAHLM9kfLSQWe2njE5pzAgUdpPk3Nx5zSm7BD3",
              "SysvarC1ock11111111111111111111111111111111"
            ],
            "data": "6mJFQCt94hG4CKNYKgVcwiF4v7AWo54Dz3XinKUG6Qm1DDhhmspAST",
            "programId": "gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s",
            "stackHeight": null
          },
          {
            "accounts": [
              "vir55LvSEGcY55ny876GycLmFCxMXTkoRg7RxDvKiw5",
              "EfnLcrwxCgwALc5vXr4cwPZMVcmotZAuqmHa8afG8zJe",
              "SysvarC1ock11111111111111111111111111111111"
            ],
            "data": "6mJFQCt94hG4CKNYKgVcwigC7XswHjekyj7J1dQmjsHsoqHjydqXoV",
            "programId": "gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s",
            "stackHeight": null
          },
          {
            "accounts": [
              "vir55LvSEGcY55ny876GycLmFCxMXTkoRg7RxDvKiw5",
              "6Ukmvns6Uyf3nRVj3ErDBgx7BiZRNJrLyXe1nGQ7CUHA",
              "SysvarC1ock11111111111111111111111111111111"
            ],
            "data": "6mJFQCt94hG4CKNYKgVcwcojsn834cy7vrPD6ksi4ri42uvkGeVMkb",
            "programId": "gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s",
            "stackHeight": null
          }
        ],
        "recentBlockhash": "sS5jHAvxaXfowtGCvg4dWc9QjzeZ1dJS5GonshyDsEq"
      },
      "signatures": [
        "2o9qCEhwKi8w7hTFQJTLwMBZPFH8qM3iNd9rprtdY6XShyrpsqkWt4Df3Zgsxv6y4nbRe4SDgU8KMvuMfs7HxVhp"
      ]
    }
  },
  "id": 1
}

以下是接口返回结果的解释:

  • blockTime: 交易发生的区块时间戳。
  • meta: 交易的元数据信息,包括计算单元消耗、费用、指令信息等。
    • computeUnitsConsumed: 计算单元消耗,表示交易执行时消耗的计算资源。
    • fee: 交易费用,单位为 Sol。
    • innerInstructions: 内部指令信息,如果交易包含了内部指令,则会显示在这里。
    • logMessages: 日志信息,记录了交易执行过程中的日志消息。
    • postBalances: 执行交易后的账户余额信息。
    • preBalances: 执行交易前的账户余额信息。
    • rewards: 奖励信息,记录了交易执行过程中的奖励情况。
    • status: 交易执行状态,通常为 Ok 或其他错误信息。
  • slot: 交易所在的区块槽位信息。
  • transaction: 交易详细信息,包括交易的消息、签名等。
    • message: 交易的消息信息,包括账户关键信息、指令信息等。
    • signatures: 交易的签名信息。

通过这些信息,您可以详细了解特定交易的执行情况、费用情况以及相关指令信息,有助于进行交易记录的审查和分析。

3. 发送交易

发送交易通过 sendTransaction 接口。这个接口里面需要对 Transaction 对象做编码,所以不做演示。

Javascript/rust SDK 中发送交易会比较直观。

除了发送请求外,还可以通过模拟请求来判断是否可能执行成功,接口为 simulateTransaction