【发布时间】:2022-07-22 16:33:14
【问题描述】:
我正在使用单个transfer 指令进行一项简单的交易,从一个帐户到另一个帐户的 0,1 SOL。然后我想获取交易数据并使用它来验证 (1) sender 和 receiver 地址和 (2) 它携带的数据 - 在这种情况下,传输已为 0,1 SOL 制作。
我使用带有 tx 签名的getTransaction 并得到如下响应:
{
message: Message {
header: {
numReadonlySignedAccounts: 0,
numReadonlyUnsignedAccounts: 1,
numRequiredSignatures: 1
},
accountKeys: [ [PublicKey], [PublicKey] ],
recentBlockhash: 'GEhNE2GKLRyW9c9E1BJx9b64WKbtGCftLYQcXrFg6UnS',
instructions: [ [Object] ],
indexToProgramIds: Map(1) { 1 => [PublicKey] }
},
signatures: [
'5gH2uo22tapuoDBx9Mz1rMuMWZkKSWqRxvBURvovsiTiAWa3Ufk2GwV7Qcg1vUgd3fPKGuv3Nky7LuVSUbHEWJKu'
]
}
所以我深入研究了TransactionResponse。第一件事是我有兴趣看到accountKeys。好的,我发现其中之一是 sender 的 pub 地址。但我也想验证接收者......而且我看不到在事务对象中的哪个位置获取该信息。第二个PublicKey是11111111111111111111111111111111,如果我没记错的话我就是SystemProgram……
第二件事是交易data。我深入message.instructions 并找到以下对象:
{ accounts: [ 0, 0 ], data: '3Bxs411Dtc7pkFQj', programIdIndex: 1 }
好的,所以data 是base58 编码的字符串'3Bxs411Dtc7pkFQj'。我从 base58 解码(使用bs58),但这只给了我一个 Uint8Array,我不确定如何将其转换为 JS 对象。
我还发现了一件事:decodeTransfer 来自 web3.js 中的 SystemInstruction 类,它似乎完全符合我的需要 - 返回 fromPubkey、toPubkey 和 lamports,但是问题是它接受TransactionInstruction 类型的对象,我不知道如何构造它...
那么,两个问题:
- 如何获取接收者的pub地址?
- 如何将指令数据解码成JS对象?
【问题讨论】:
标签: solana solana-web3js solana-transaction-instruction