各种 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
索引处的公钥。第一个用作 交易 ID。i``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
版权属于:区块链中文技术社区 / 转载原创者
本文链接:https://bcskill.com/index.php/archives/2366.html
相关技术文章仅限于相关区块链底层技术研究,禁止用于非法用途,后果自负!本站严格遵守一切相关法律政策!