Solana 技术训练营 2026

2026年01月09日更新 195 人订阅
课程介绍
C4: Solana 程序开发入门: 简单链上数据存储程序扩展为可交易的代币程序
C6:Anchor 入门: SPL 与 Token 2022

Solana RPC 方法的常见 JSON 数据结构

各种 Solana RPC 方法将以结构化的 JSON 对象形式返回更复杂的响应,其中包含特定的键值。

这些常见的 JSON 数据结构包括:

  • 交易
  • 内部指令
  • 代币余额

交易

交易与其他区块链上的交易有很大不同。请务必查看交易结构解析以了解 Solana 上的交易。

JSON

交易的 JSON 结构定义如下:

<Accordions> <Accordion title="参考">

"transaction": {
  "message": {
    "accountKeys": [
      "EF3cbGuhJus5mCdGZkVz7GQce7QHbswBhZu6fmK9zkCR",
      "4LAyP5B5jNyNm7Ar2dG8sNipEiwTMEyCHd1iCHhhXYkY",
      "11111111111111111111111111111111"
    ],
    "header": {
      "numReadonlySignedAccounts": 0,
      "numReadonlyUnsignedAccounts": 1,
      "numRequiredSignatures": 1
    },
    "instructions": [
      {
        "accounts": [
          0,
          1
        ],
        "data": "3Bxs411Dtc7pkFQj",
        "programIdIndex": 2,
        "stackHeight": null
      }
    ],
    "recentBlockhash": "6pw7JBwq9tb5GHiBQgVY6RAp5otbouwYvEc1kbbxKFec"
  },
  "signatures": [
    "2M8mvwhtxyz3vAokXESVeR9FQ4t9QQxF5ek6ENNBBHVkW5XyZvJVK5MQej5ccwTZH6iWBJJoZ2CcizBs89pvpPBh"
  ]
}

</Accordion> </Accordions>

  • message: &lt;object> - 定义交易的内容。
    • accountKeys: &lt;array[string]> - 交易中使用的 base-58 编码公钥列表,包括指令和签名所需的公钥。第一个 message.header.numRequiredSignatures 公钥必须对交易进行签名。
    • header: &lt;object> - 详细说明交易所需的账户类型和签名。
    • numRequiredSignatures: &lt;number> - 使交易有效所需的签名总数。这些签名必须与 numRequiredSignatures 的第一个 message.accountKeys 匹配。
    • numReadonlySignedAccounts: &lt;number> - 签名密钥的最后numReadonlySignedAccounts是只读账户。程序可以在单个 PoH 条目中处理加载只读账户的多个交易,但不允许对 lamports 进行借记或贷记,也不能修改账户数据。目标为相同读写账户的交易将按顺序评估。
    • numReadonlyUnsignedAccounts: &lt;number> - 未签名密钥的最后numReadonlyUnsignedAccounts 是只读账户。
    • recentBlockhash: &lt;string> - 最近区块的 base-58 编码哈希,用于防止交易重复并为交易提供生命周期。
    • instructions: &lt;array[object]> - 按顺序执行并在全部成功时以原子交易提交的程序指令列表。
    • programIdIndex: &lt;number> - 指向 message.accountKeys 数组中执行此指令的程序账户的索引。
    • accounts: &lt;array[number]> - 指向 message.accountKeys数组中传递给程序的账户的有序索引列表。
    • data: &lt;string> - 以 base-58 字符串编码的程序输入数据。
    • addressTableLookups: &lt;array[object]|undefined> - 交易使用的地址表查找列表,用于从链上地址查找表动态加载地址。如果 maxSupportedTransactionVersion 未设置,则未定义。
    • accountKey: &lt;string> - 地址查找表账户的 base-58 编码公钥。
    • writableIndexes: &lt;array[number]> - 用于从查找表加载可写账户地址的索引列表。
    • readonlyIndexes: &lt;array[number]> - 用于从查找表加载只读账户地址的索引列表。
  • signatures: &lt;array[string]> - 应用于交易的 base-58 编码签名列表。列表的长度始终为message.header.numRequiredSignatures 且不为空。索引 i 处的签名对应于message.accountKeys 中索引 i 处的公钥。第一个签名用作交易 ID。

JSON 解析

交易的 JSON 解析结构与常规 JSON 格式类似,但增加了账户和指令信息的解析:

<Accordions> <Accordion title="参考">

"transaction": {
  "message": {
    "accountKeys": [
      {
        "pubkey": "EF3cbGuhJus5mCdGZkVz7GQce7QHbswBhZu6fmK9zkCR",
        "signer": true,
        "source": "transaction",
        "writable": true
      },
      {
        "pubkey": "4LAyP5B5jNyNm7Ar2dG8sNipEiwTMEyCHd1iCHhhXYkY",
        "signer": false,
        "source": "transaction",
        "writable": true
      },
      {
        "pubkey": "11111111111111111111111111111111",
        "signer": false,
        "source": "transaction",
        "writable": false
      }
    ],
    "instructions": [
      {
        "parsed": {
          "info": {
            "destination": "4LAyP5B5jNyNm7Ar2dG8sNipEiwTMEyCHd1iCHhhXYkY",
            "lamports": 100000000,
            "source": "EF3cbGuhJus5mCdGZkVz7GQce7QHbswBhZu6fmK9zkCR"
          },
          "type": "transfer"
        },
        "program": "system",
        "programId": "11111111111111111111111111111111",
        "stackHeight": null
      }
    ],
    "recentBlockhash": "6pw7JBwq9tb5GHiBQgVY6RAp5otbouwYvEc1kbbxKFec"
  },
  "signatures": [
    "2M8mvwhtxyz3vAokXESVeR9FQ4t9QQxF5ek6ENNBBHVkW5XyZvJVK5MQej5ccwTZH6iWBJJoZ2CcizBs89pvpPBh"
  ]
}

</Accordion> </Accordions>

  • message: &lt;object> - 定义交易的内容。
    • accountKeys: &lt;array[object]> - 交易使用的账户信息列表。
    • pubkey: &lt;string> - 账户的 base-58 编码公钥。
    • signer: &lt;boolean> - 指示账户是否为必需的交易签名者。
    • writable: &lt;boolean> - 指示账户是否可写。
    • source: &lt;string> - 账户的来源(交易或查找表)。
    • recentBlockhash: &lt;string> - 用于防止交易重复并为交易设定生命周期的账本中最近区块的 base-58 编码哈希。
    • instructions: &lt;array[object]> - 已解析的程序指令列表。
    • program: &lt;string> - 被调用程序的名称。
    • programId: &lt;string> - 程序的 base-58 编码公钥。
    • stackHeight: &lt;number|null> - 指令的堆栈高度。
    • parsed: &lt;object> - 程序特定的已解析数据。
      • type: &lt;string> - 指令的类型(例如,“转账”)。
      • info: &lt;object> - 特定于程序和指令类型的已解析指令信息。
  • signatures: &lt;array[string]> - 应用于交易的 base-58 编码签名列表。

交易状态元数据

<Accordions> <Accordion title="参考">

{
  "meta": {
    "err": null,
    "fee": 5000,
    "innerInstructions": [],
    "logMessages": [],
    "postBalances": [499998932500, 26858640, 1, 1, 1],
    "postTokenBalances": [],
    "preBalances": [499998937500, 26858640, 1, 1, 1],
    "preTokenBalances": [],
    "rewards": null,
    "status": {
      "Ok": null
    }
  }
}

</Accordion> </Accordions>

  • err: &lt;object|null> - 如果交易失败则显示错误信息,如果交易成功则为 null。TransactionError 定义
  • fee: &lt;u64> - 此交易收取的费用,以 u64 整数表示
  • preBalances: &lt;array> - 交易处理前的 u64 账户余额数组
  • postBalances: &lt;array> - 交易处理后的 u64 账户余额数组
  • innerInstructions: &lt;array|null> - 内部指令列表,或 null如果在此交易期间未启用内部指令记录
  • preTokenBalances: &lt;array|undefined> - 代币余额列表,显示交易处理前的代币余额,或如果在此交易期间尚未启用代币余额记录则省略
  • postTokenBalances: &lt;array|undefined> - 代币余额列表,显示交易处理后的代币余额,或如果在此交易期间尚未启用代币余额记录则省略
  • logMessages: &lt;array|null> - 字符串日志消息数组,或 null如果在此交易期间未启用日志消息记录
  • rewards: &lt;array|null> - 交易级别的奖励;包含以下字段的 JSON 对象数组:
    • pubkey: &lt;string> - 接收奖励的账户的 base-58 编码公钥字符串
    • lamports: &lt;i64> - 账户获得或扣除的奖励 lamports 数量,以 i64 表示
    • postBalance: &lt;u64> - 应用奖励后账户的 lamports 余额
    • rewardType: &lt;string|undefined> - 奖励类型:“fee”、“rent”、“voting”、“staking”
    • commission: &lt;u8|undefined> - 奖励记入时的投票账户佣金,仅适用于投票和质押奖励
  • 已弃用:status: &lt;object> - 交易状态
    • "Ok": &lt;null> - 交易成功
    • "Err": &lt;ERR> - 交易因 TransactionError 失败
  • loadedAddresses: &lt;object|undefined> - 从地址查找表加载的交易地址。如果 maxSupportedTransactionVersion 未在请求参数中设置,或 jsonParsed编码在请求参数中设置,则未定义。
    • writable: &lt;array[string]> - 可写加载账户的 base-58 编码地址的有序列表
    • readonly: &lt;array[string]> - 只读加载账户的 base-58 编码地址的有序列表
  • returnData: &lt;object|undefined> - 交易中指令生成的最新返回数据,包含以下字段:
    • programId: &lt;string> - 生成返回数据的程序,作为 base-58 编码的 Pubkey
    • data: &lt;[string, encoding]> - 返回数据本身,作为 base-64 编码的二进制数据
  • computeUnitsConsumed: &lt;u64|undefined> - 交易消耗的计算单元数量
  • version: &lt;"legacy"|number|undefined> - 交易版本。如果maxSupportedTransactionVersion 未在请求参数中设置,则未定义。
  • signatures: &lt;array> - 如果请求了交易详细信息的“签名”,则显示;一个签名字符串数组,对应区块中的交易顺序

内部指令

Solana 运行时会记录在交易处理过程中调用的跨程序指令,并将其提供出来,以便更透明地了解每个交易指令在链上执行的内容。被调用的指令按来源交易指令分组,并按处理顺序列出。

内部指令的 JSON 结构定义为以下结构的对象列表:

<Accordions> <Accordion title="参考">

"innerInstructions": [
  {
    "index": 0,
    "instructions": [
      {
        "accounts": [
          0,
          1,
          2
        ],
        "data": "WPNHsFPyEMr",
        "programIdIndex": 3,
        "stackHeight": 2
      },
      {
        "accounts": [
          0,
          1
        ],
        "data": "11111dBUPbGETd4QtNMQVg8HqgcZtKy6DcJm6R4TZufJkuhkDS47VsauCCGhLf2xrm5BQ",
        "programIdIndex": 2,
        "stackHeight": 3
      }
    ]
  }
]

参考交易:

"transaction": {
  "message": {
    "accountKeys": [
      "4kh6HxYZiAebF8HWLsUWod2EaQQ6iWHpHYCz8UcmFbM1",
      "Bpo7aaM9kqfCjM6JgZCSdev7HsaUFj51mBPPEhQcDpUR",
      "11111111111111111111111111111111",
      "8HupNBr7SBhBLcBsLhbtes3tCarBm6Bvpqp5AfVjHuj8",
      "GENmb1D59wqCKRwujq4PJ8461EccQ5srLHrXyXp4HMTH"
    ],
    "header": {
      "numReadonlySignedAccounts": 0,
      "numReadonlyUnsignedAccounts": 3,
      "numRequiredSignatures": 2
    },
    "instructions": [
      {
        "accounts": [
          0,
          1,
          2,
          3
        ],
        "data": "H2ot5wbZsmL",
        "programIdIndex": 4,
        "stackHeight": null
      }
    ],
    "recentBlockhash": "28CroH2jyCaCFF6ssyUK989zBZY6dBxnUNU9A4oPUbER"
  },
  "signatures": [
    "4i4EuRQ1sNzKWEBYwg28VAMkQbaAeHyRRwu1tQRksowtQhGRJtgaHXpDAhBfpYZnVodGoQYwiUiB5yBRDoWbZ7VH",
    "2dipFcFF4CvwtbCFbRdctQmyzAYcq8RWrLryZErbKPhnriCJ6wDmKfJoSJfDjFNzUEcJDKkfasS2pcjvGEUjdYN6"
  ]
}

</Accordion> </Accordions>

  • index: number - 内部指令来源的交易指令索引
  • instructions: &lt;array[object]> - 在单个交易指令期间调用的内部程序指令的有序列表。
    • programIdIndex: &lt;number> - 指向 message.accountKeys 数组的索引,指示执行此指令的程序账户。
    • accounts: &lt;array[number]> - 指向 message.accountKeys 数组的有序索引列表,指示传递给程序的账户。
    • data: &lt;string> - 以 base-58 字符串编码的程序输入数据。

代币余额

<Accordions> <Accordion title="参考">

"postTokenBalances": [
  {
    "accountIndex": 1,
    "mint": "6HvU8PbqP3nZLkFF59rr2zkTHqetPLgb6NnxKZLHQxNp",
    "owner": "DKypunNAGLPGBj3SocY8fF4ZrnDNVTf6QcUyW4trvkB",
    "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
    "uiTokenAmount": {
      "amount": "0",
      "decimals": 2,
      "uiAmount": null,
      "uiAmountString": "0"
    }
  },
  {
    "accountIndex": 2,
    "mint": "6HvU8PbqP3nZLkFF59rr2zkTHqetPLgb6NnxKZLHQxNp",
    "owner": "8xm9beCpBH7SgqRz1mKua7KJF52whAVCiDEV1qREGHNV",
    "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
    "uiTokenAmount": {
      "amount": "100",
      "decimals": 2,
      "uiAmount": 1.0,
      "uiAmountString": "1"
    }
  }
],

"preTokenBalances": [
  {
    "accountIndex": 1,
    "mint": "6HvU8PbqP3nZLkFF59rr2zkTHqetPLgb6NnxKZLHQxNp",
    "owner": "DKypunNAGLPGBj3SocY8fF4ZrnDNVTf6QcUyW4trvkB",
    "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
    "uiTokenAmount": {
      "amount": "100",
      "decimals": 2,
      "uiAmount": 1.0,
      "uiAmountString": "1"
    }
  },
  {
    "accountIndex": 2,
    "mint": "6HvU8PbqP3nZLkFF59rr2zkTHqetPLgb6NnxKZLHQxNp",
    "owner": "8xm9beCpBH7SgqRz1mKua7KJF52whAVCiDEV1qREGHNV",
    "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
    "uiTokenAmount": {
      "amount": "0",
      "decimals": 2,
      "uiAmount": null,
      "uiAmountString": "0"
    }
  }
]

参考交易:

"transaction": {
  "message": {
    "accountKeys": [
      {
        "pubkey": "DKypunNAGLPGBj3SocY8fF4ZrnDNVTf6QcUyW4trvkB",
        "signer": true,
        "source": "transaction",
        "writable": true
      },
      {
        "pubkey": "39nzuQ2WYHf231DJRPt1TLfaXSWXEKYGcqP3NQf6zK7G",
        "signer": false,
        "source": "transaction",
        "writable": true
      },
      {
        "pubkey": "DtCPWGmvCTov7CNmNTx8AFe3SEFSxgy265kZawv8SVL3",
        "signer": false,
        "source": "transaction",
        "writable": true
      },
      {
        "pubkey": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
        "signer": false,
        "source": "transaction",
        "writable": false
      }
    ],
    "addressTableLookups": [],
    "instructions": [
      {
        "parsed": {
          "info": {
            "amount": "100",
            "authority": "DKypunNAGLPGBj3SocY8fF4ZrnDNVTf6QcUyW4trvkB",
            "destination": "DtCPWGmvCTov7CNmNTx8AFe3SEFSxgy265kZawv8SVL3",
            "source": "39nzuQ2WYHf231DJRPt1TLfaXSWXEKYGcqP3NQf6zK7G"
          },
          "type": "transfer"
        },
        "program": "spl-token",
        "programId": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
        "stackHeight": null
      }
    ],
    "recentBlockhash": "42mjf871LtzDK8NVZUAht1xBoCvNMagQGSM7BnFWZD6M"
  },
  "signatures": [
    "5ZQqsF4tTFJDR5vuNJxejtw2GMc8KEtnPXnQjwhGzAtdbPTKtrLfPkFAbBTyPjZSVB3CbR5BiP5S8zAfZNtuwh88"
  ]
}

</Accordion> </Accordions>

代币余额的 JSON 结构定义为以下结构的对象列表:

  • accountIndex: &lt;number> - 提供代币余额的账户索引。
  • mint: &lt;string> - 代币铸造的公钥。
  • owner: &lt;string|undefined> - 代币余额所有者的公钥。
  • programId: &lt;string|undefined> - 拥有该账户的 Token Program 的公钥。
  • uiTokenAmount: &lt;object> -
    • amount: &lt;string> - 忽略小数点的代币原始数量(字符串形式)。
    • decimals: &lt;number> - 为代币铸造配置的小数位数。
    • uiAmount: &lt;number|null> - 考虑小数位的代币数量(浮点数形式)。已弃用
    • uiAmountString: &lt;string> - 考虑小数位的代币数量(字符串形式)。
  • 学分: 28
  • 分类: Solana
  • 标签:
点赞 2
收藏 0
分享

0 条评论

请先 登录 后评论