各种 Solana RPC 方法将以结构化的 JSON 对象形式返回更复杂的响应,其中包含特定的键值。
这些常见的 JSON 数据结构包括:
交易与其他区块链上的交易有很大不同。请务必查看交易结构解析以了解 Solana 上的交易。
交易的 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: <object> - 定义交易的内容。
accountKeys: <array[string]> - 交易中使用的 base-58 编码公钥列表,包括指令和签名所需的公钥。第一个
message.header.numRequiredSignatures 公钥必须对交易进行签名。header: <object> - 详细说明交易所需的账户类型和签名。numRequiredSignatures: <number> - 使交易有效所需的签名总数。这些签名必须与
numRequiredSignatures 的第一个 message.accountKeys 匹配。numReadonlySignedAccounts: <number> - 签名密钥的最后numReadonlySignedAccounts是只读账户。程序可以在单个 PoH 条目中处理加载只读账户的多个交易,但不允许对 lamports 进行借记或贷记,也不能修改账户数据。目标为相同读写账户的交易将按顺序评估。numReadonlyUnsignedAccounts: <number> - 未签名密钥的最后numReadonlyUnsignedAccounts 是只读账户。recentBlockhash: <string> - 最近区块的 base-58 编码哈希,用于防止交易重复并为交易提供生命周期。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 处的签名对应于message.accountKeys 中索引 i 处的公钥。第一个签名用作交易 ID。交易的 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: <object> - 定义交易的内容。
accountKeys: <array[object]> - 交易使用的账户信息列表。pubkey: <string> - 账户的 base-58 编码公钥。signer: <boolean> - 指示账户是否为必需的交易签名者。writable: <boolean> - 指示账户是否可写。source: <string> - 账户的来源(交易或查找表)。recentBlockhash: <string> - 用于防止交易重复并为交易设定生命周期的账本中最近区块的 base-58 编码哈希。instructions: <array[object]> - 已解析的程序指令列表。program: <string> - 被调用程序的名称。programId: <string> - 程序的 base-58 编码公钥。stackHeight: <number|null> - 指令的堆栈高度。parsed: <object> - 程序特定的已解析数据。
type: <string> - 指令的类型(例如,“转账”)。info: <object> - 特定于程序和指令类型的已解析指令信息。signatures: <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: <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> - 接收奖励的账户的 base-58 编码公钥字符串lamports: <i64> - 账户获得或扣除的奖励 lamports 数量,以 i64 表示postBalance: <u64> - 应用奖励后账户的 lamports 余额rewardType: <string|undefined> - 奖励类型:“fee”、“rent”、“voting”、“staking”commission: <u8|undefined> - 奖励记入时的投票账户佣金,仅适用于投票和质押奖励status: <object> - 交易状态
"Ok": <null> - 交易成功"Err": <ERR> - 交易因 TransactionError 失败loadedAddresses: <object|undefined> - 从地址查找表加载的交易地址。如果
maxSupportedTransactionVersion 未在请求参数中设置,或 jsonParsed编码在请求参数中设置,则未定义。
writable: <array[string]> - 可写加载账户的 base-58 编码地址的有序列表readonly: <array[string]> - 只读加载账户的 base-58 编码地址的有序列表returnData: <object|undefined> - 交易中指令生成的最新返回数据,包含以下字段:
programId: <string> - 生成返回数据的程序,作为 base-58 编码的 Pubkeydata: <[string, encoding]> - 返回数据本身,作为 base-64 编码的二进制数据computeUnitsConsumed: <u64|undefined> - 交易消耗的计算单元数量version: <"legacy"|number|undefined> - 交易版本。如果maxSupportedTransactionVersion 未在请求参数中设置,则未定义。signatures: <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: <array[object]> - 在单个交易指令期间调用的内部程序指令的有序列表。
programIdIndex: <number> - 指向 message.accountKeys 数组的索引,指示执行此指令的程序账户。accounts: <array[number]> - 指向 message.accountKeys 数组的有序索引列表,指示传递给程序的账户。data: <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: <number> - 提供代币余额的账户索引。mint: <string> - 代币铸造的公钥。owner: <string|undefined> - 代币余额所有者的公钥。programId: <string|undefined> - 拥有该账户的 Token Program 的公钥。uiTokenAmount: <object> -
amount: <string> - 忽略小数点的代币原始数量(字符串形式)。decimals: <number> - 为代币铸造配置的小数位数。uiAmount: <number|null> - 考虑小数位的代币数量(浮点数形式)。已弃用uiAmountString: <string> - 考虑小数位的代币数量(字符串形式)。