如何使用 Solana Javascript API (@solana/web3.js) 获取 Solana 上交易的当前状态?
这是我尝试过的,但它似乎只适用于最近的交易。
const { Connection, clusterApiUrl } = require("@solana/web3.js");
(async () => {
const connection = new Connection(clusterApiUrl('mainnet-beta'));
const status = await connection.getSignatureStatus("4fwgX16WDwYj5hZ2t5xEHz6UUnuaTovJpMeoWWEBvuA7z1baf1qX1BW2EGZVR9ChSyJZ8akeLX6EDTadFcEcSTdy");
console.log(status);
})();
尝试将
searchTransactionHistory: true
添加到 SignatureStatusConfig
const getConfirmation = async (connection: Connection, tx: string) => {
const result = await connection.getSignatureStatus(tx, {
searchTransactionHistory: true,
});
return result.value?.confirmationStatus;
};
https://docs.solana.com/developing/clients/jsonrpc-api#getsignaturestatuses
您还可以使用
confirmTransaction
功能:
const { Connection, clusterApiUrl } = require("@solana/web3.js");
(async () => {
const connection = new Connection(clusterApiUrl('mainnet-beta'));
const result = await connection.confirmTransaction({
signature: "4fwgX16WDwYj5hZ2t5xEHz6UUnuaTovJpMeoWWEBvuA7z1baf1qX1BW2EGZVR9ChSyJZ8akeLX6EDTadFcEcSTdy"
},
'finalized');
console.log(result);
})();
编辑:此函数签名已在 web3.js 中弃用,并已移至此包:https://www.npmjs.com/package/@solana-developers/helpers需要传入连接作为第一个参数:
await confirmTransaction(connection, transaction);
如果您自己进行交易,您应该将相同的区块哈希传递到确认和构造中。
const { blockhash, lastValidBlockheight } = await connection.getLatestBlockhash();
const tx = new Transaction({ blockhash, lastValidBlockheight });
const signature = await connection.sendTransaction(tx);
const confirmationStrategy: BlockheightBasedTransactionConfirmationStrategy = {
blockhash,
lastValidBlockheight,
signature,
};
await connection.confirmTransaction(confirmationStrategy);
详情:https://github.com/solana-labs/solana-web3.js/pull/2733/files#r1611723082
原因:
使用不同于之前的区块哈希来确认交易 交易中实际使用的信息将产生错误的信息, 例如“你的区块哈希现在无效”,当它不是或者是时 已经有一段时间无效了。
https://github.com/solana-labs/solana-web3.js/issues/2067#issuecomment-1947353265
您还可以尝试将连接的承诺级别设置为“已完成”
new Connection(clusterApiUrl('mainnet-beta'), 'finalized');