各种 Solana RPC 方法将返回更复杂的响应作为结构化 JSON 对象,并填充特定的键值。
这些 JSON 数据结构中最常见的包括:

交易

交易与其他区块链上的交易截然不同。请务必查看交易剖析以了解 Solana 上的交易。

JSON

交易的JSON结构定义如下:

"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"
  ]
}
  • message: <object> - 定义交易的内容。

  • accountKeys: <array[string]>- 交易使用的 base-58 编码公钥列表,包括指令和签名。第一个 message.header.numRequiredSignatures公钥必须签署交易。

  • header: <object>- 详细说明交易所需的账户类型和签名。

  • numRequiredSignatures: <number>- 使交易有效所需的签名总数。签名必须与第一个numRequiredSignatures签名相匹配message.accountKeys

  • numReadonlySignedAccounts: <number>- 最后 numReadonlySignedAccounts一个签名密钥是只读帐户。程序可以处理在单个 PoH 条目中加载只读帐户的多个交易,但不允许贷记或借记 lamport 或修改帐户数据。针对同一读写帐户的交易将按顺序进行评估。

  • numReadonlyUnsignedAccounts: <number>- 最后一个 numReadonlyUnsignedAccounts未签名的密钥是只读账户。

  • recentBlockhash: <string>- 账本中最近一个区块的 Base58 编码哈希值,用于防止交易重复并提供交易生命周期。

  • instructions: <array[object]> - 将按顺序执行并在一个原子事务中提交的程序指令列表(如果全部成功)。

  • programIdIndex: <number>- 数组索引,message.accountKeys指示执行该指令的程序账户。

  • accounts: <array[number]>- 数组中有序索引的列表, message.accountKeys指示要传递给程序的帐户。

  • data: <string>- 程序输入以 base-58 字符串编码的数据。

  • addressTableLookups: <array[object]|undefined> - 交易使用的地址表查找列表,用于从链上地址查找表中动态加载地址。如果maxSupportedTransactionVersion 未设置,则为未定义。

  • accountKey: <string>- 用于地址查找表帐户的 base-58 编码公钥。

  • writableIndexes: <array[number]>- 用于从查找表加载可写帐户地址的索引列表。

  • readonlyIndexes: <array[number]>- 用于从查找表加载只读帐户地址的索引列表。

  • signatures: <array[string]>- 应用于交易的 base-58 编码签名列表。列表的长度始终为 message.header.numRequiredSignatures且不为空。索引处的签名 对应于中i索引处的公钥。第一个用作 交易 IDi``message.accountKeys

JSON 解析

交易的 JSON 解析结构遵循与常规 JSON 格式类似的结构,并附加了帐户和指令信息的解析:

"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"
  ]
}
  • message: <object> - 定义交易的内容。

    • accountKeys: <array[object]> - 交易使用的账户信息列表。

    • pubkey: <string>- 账户的 Base58 编码公钥。

    • signer: <boolean>- 表明该账户是否是必需的交易签名者。

    • writable: <boolean>- 指示该帐户是否可写。

    • source: <string>- 账户来源(交易或查找表)。

    • recentBlockhash: <string>- 账本中最近一个区块的 Base58 编码哈希值,用于防止交易重复并提供交易生命周期。

    • instructions: <array[object]> - 已解析的程序指令列表。

    • program: <string>- 被调用的程序的名称。

    • programId: <string>- 该程序的 Base58 编码公钥。

    • stackHeight: <number|null>- 指令的堆栈高度。

    • parsed: <object> - 特定程序的解析数据。

    • type: <string>- 指令的类型(例如“转移”)。

    • info: <object>- 解析特定于程序和指令类型的指令信息。

  • signatures: <array[string]>- 应用于交易的 Base-58 编码签名列表。

交易状态元数据

{
  "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
    }
  }
}
  • err: <object|null>- 如果交易失败则返回错误,如果交易成功则返回 null。TransactionError 定义

  • fee: <u64>- 本次交易收取的费用,以 u64 整数形式

  • preBalances: <array>- 交易处理前的 u64 账户余额数组

  • postBalances: <array>- 交易处理后的 u64 账户余额数组

  • innerInstructions: <array|null>-内部指令列表 或null 此交易期间是否未启用内部指令记录

  • preTokenBalances: <array|undefined>- 交易处理之前的代币余额列表 ,如果在此交易期间尚未启用代币余额记录,则省略

  • postTokenBalances: <array|undefined>- 交易处理后的代币余额列表 ,如果在此交易期间尚未启用代币余额记录,则省略

  • logMessages: <array|null>- 字符串日志消息数组或null如果在此事务期间未启用日志消息记录

  • rewards: <array|null> - 交易级奖励;包含以下内容的 JSON 对象数组:

    • pubkey: <string>- 收到奖励的账户的公钥,以 base58 编码的字符串形式
    • lamports: <i64>- 账户记入或扣除的奖励灯数量,以 i64 表示
    • postBalance: <u64>- 奖励使用后 lampors 账户余额
    • rewardType: <string|undefined>- 奖励类型:“费用”、“租金”、“投票”、“质押”
    • commission: <u8|undefined>- 奖励到账时投票账户佣金,仅适用于投票和质押奖励
  • 已弃用:

    • status: <object> - 交易状态
      • "Ok": <null>- 交易成功
      • "Err": <ERR>- 交易失败,出现 TransactionError
  • loadedAddresses: <object|undefined> - 从地址查找表加载交易地址。如果 axSupportedTransactionVersion 请求参数中未设置,或者 jsonParsed 请求参数中设置了编码,则未定义。

    • writable: <array[string]>- 可写加载账户的 Base58 编码地址的有序列表
    • readonly: <array[string]>- 只读加载帐户的 Base58 编码地址的有序列表
  • returnData: <object|undefined> - 交易中指令生成的最新返回数据,包含以下字段:

    • programId: <string>- 生成返回数据的程序,以 base-58 编码的公钥形式
    • data: <[string, encoding]>- 返回数据本身,以 base64 编码的二进制数据
  • computeUnitsConsumed: <u64|undefined>-交易消耗的计算单元数量

  • version: <"legacy"|number|undefined>- 交易版本。如果 maxSupportedTransactionVersion请求参数中未设置,则为未定义。

  • signatures: <array>- 如果请求“签名”以获取交易详细信息,则存在;签名字符串数组,对应于块中的交易顺序

内部指示

Solana 运行时记录在交易处理期间调用的跨程序指令,并使这些指令可用,从而提高每个交易指令在链上执行内容的透明度。调用的指令按原始交易指令分组,并按处理顺序列出。

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

"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"
  ]
}
  • index: number- 内部指令来源的交易指令索引

  • instructions: <array[object]>- 在单个事务指令期间调用的内部程序指令的有序列表。

    • programIdIndex: <number>- 数组索引,message.accountKeys指示执行该指令的程序账户。
    • accounts: <array[number]>- 数组中有序索引的列表, message.accountKeys指示要传递给程序的帐户。
    • data: <string>- 程序输入以 base-58 字符串编码的数据。

代币余额

"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"
  ]
}

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

  • accountIndex: <number>- 提供代币余额的账户索引。

  • mint: <string>- 代币铸币厂的公钥。

  • owner: <string|undefined>- 代币余额所有者的公钥。

  • programId: <string|undefined>- 拥有该账户的Token程序的公钥。

  • uiTokenAmount: <object>

    • amount: <string>- 代币的原始数量为字符串,忽略小数。
    • decimals: <number>- 为代币铸造配置的小数位数。
    • uiAmount: <number|null>- 代币数量为浮点数,包含小数。已弃用
    • uiAmountString: <string>- Token数量为字符串,保留小数位。

原文:https://solana.com/zh/docs/rpc/json-structures