如何分析 Solana 区块链上已确认交易中的 tokenBalances?

How to analyse tokenBalances in a confirmed transaction on the Solana blockchain?

我正在做一个专注于 Solana NFT 的个人项目,我正在努力思考我应该如何获取有关 buyer/seller 帐户的特定交易中的数据调用他们的 rpc 以获取交易数据的结果。

我正在使用 nodeJS 和 @solana/web3js 模块来获取特定集合的所有交易的签名,然后使用 getConfirmedParsedTransaction(signature) 方法从这些签名中获取交易,然后尝试获取我需要他们提供的数据。

以 explorer.solana.com 上的 this 签名为例 - 它使用与此类似的 API 调用返回的数据 -

curl 'https://explorer-api.mainnet-beta.solana.com/' \ -H 'Connection: keep-alive' \ -H 'content-type: application/json' \ -H 'Accept: */*' \ -H 'Origin: https://explorer.solana.com' \ -H 'Sec-Fetch-Site: same-site' \ -H 'Sec-Fetch-Mode: cors' \ -H 'Sec-Fetch-Dest: empty' \ -H 'Referer: https://explorer.solana.com/' \ -H 'Accept-Language: en-GB,en-US;q=0.9,en;q=0.8' \ --data-raw '{"method":"getConfirmedTransaction","jsonrpc":"2.0","params":["3sRxEfGD2VmrJmw3YsULDER42HW3W2eiAv74Tn41MoL1YQmtELDcEiRf29cBPfsxRVcqXCEkCmwPJNihxAtfRZ4S",{"encoding":"jsonParsed","commitment":"confirmed"}],"id":"b70247d9-75ef-429a-bf27-ab2519dd75b8"}' \ --compressed

我可以从返回的 JSON 中看到有多个数组有 21 个索引 - 在这些数组中,买家的数据在索引 0 处,卖家的数据在索引 3 处。我知道情况并非总是如此,因为不同的市场可能使用不同的指令,或者不同的代币有不同的版税分配 - 因此我寻找了一种更合乎逻辑的方法。

我目前正在做的第一件事是查看 pre/post 代币余额以获取已转移的实际代币(铸币 属性)。这些对象看起来像这样:

{"postTokenBalances":[{"accountIndex":1,"mint":"7t2PCc8WAE14dE58yYogBXBspoL8o8PXesAag3zMse3h","uiTokenAmount":{"amount":"1","decimals":0,"uiAmount":1.0,"uiAmountString":"1"}}],"preBalances":[413842981566,0,2039280,22184812910,1398960,13264655885039,5616720,0,212257097061,135958021650,135956740765,599225381740,1000,1461600,1,1089991680,1,11352771574,1141440,898174080,1141440],"preTokenBalances":[{"accountIndex":2,"mint":"7t2PCc8WAE14dE58yYogBXBspoL8o8PXesAag3zMse3h","uiTokenAmount":{"amount":"1","decimals":0,"uiAmount":1.0,"uiAmountString":"1"}}]}

我以为我已经想出了一个简单的方法来解决这个问题 - accountIndex 必须是上述数组中的索引,但不幸的是,这似乎不正确。

我查看了关于 accountIndex 实际代表什么的文档 here,它说它代表数组中的索引,就像我想的那样 ('Index of the account in which the token balance is provided for'),但这似乎不是正确:

正如我所说,此交易的买方在索引 0 中,postTokenBalances 中的 accountIndex 为 1,而卖方在索引 3 中,preTokenBalances 中的 accountIndex 为 2 - 所以我的问题是什么这些 accountIndex 属性实际上代表什么?

抱歉,问题相对较长,但我想尝试提供一些细节!

您几乎已正确理解所有内容。最后一点要理解的是,买家/卖家与接收者/发送代币账户不是一回事。代币(包括 NFT)存储在 SPL 代币账户中,该账户是独立于买卖双方的账户,是带有 SOL 的系统账户。

如果您在浏览器中查看交易:https://explorer.solana.com/tx/3sRxEfGD2VmrJmw3YsULDER42HW3W2eiAv74Tn41MoL1YQmtELDcEiRf29cBPfsxRVcqXCEkCmwPJNihxAtfRZ4S,您会看到买家花费 50 SOL 确实是 GWcJPnrAuMqN83D8wDvmtoAdGATJGLsCRvgZ85qxXP3j,但接收者令牌帐户是 7wuC7oveWkSoYoBR1WT5ZwMn62uQddSebWghQrQdFE72. GWcJPnrAuMqN83D8wDvmtoAdGATJGLsCRvgZ85qxXP3j 不能持有代币,但 7wuC7oveWkSoYoBR1WT5ZwMn62uQddSebWghQrQdFE72 可以,并且归 GWcJPnrAuMqN83D8wDvmtoAdGATJGLsCRvgZ85qxXP3j 所有。

您可以在 https://docs.solana.com/developing/programming-model/accounts and more info about the SPL token program at https://spl.solana.com/token

阅读有关 Solana 账户模型的更多信息