是否需要提取与钱包相关的所有交易?想要查看与糖果机相关的所有铸币交易?或者查看 NFT 的交易历史记录?Solana 的getSignaturesForAddress方法是一种多功能工具,可让您轻而易举地获取交易历史记录。
将要做
在本指南中,您将深入了解 Solana 交易的激动人心的世界!您将构建一个简单的脚本,可以查询地址(钱包、programid、代币铸造等)并找到与其相关的所有交易历史记录。
你需要
Nodejs(16.15 或更高版本)
Yarn安装
Solana web3
熟悉 Solana 上的基本交易。
JavaScript 知识
让我们开始吧!
设置您的环境
在终端中创建一个新的项目目录和文件log.js:
mkdir get_sol_tx
cd get_sol_tx
echo > log.js
安装 Solana web3 依赖项:
yarn init -y
yarn add @solana/web3.js@1
或者
npm init -y
npm install --save @solana/web3.js@1
在所选的代码编辑器中打开log.js ,在第 1 行,需要@solana/web3.js并将其存储在常量中,**solanaWeb3:
**
const solanaWeb3 = require('@solana/web3.js');
声明您想要搜索的地址:
const searchAddress = 'YOUR_ADDRESS_HERE'; //example 'vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg'
注意:这可以是 Solana 上的任何有效地址(例如,钱包地址、铸币地址、程序地址)。如果您还没有,可以使用“vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg”作为示例。
好了,我们准备开始做饭了!
建立与 QuickNode RPC 的
要在 Solana 上构建,您需要一个 API 端点来连接网络。欢迎您使用公共节点或部署和管理自己的基础设施;但是,如果您希望响应时间加快 8 倍,您可以将繁重的工作留给我们。
导航回log.js并创建一个常量端点并为其分配您的 QuickNode url。在下一行中,将此常量作为Connection函数的参数传入,并将其存储在另一个名为solanaConnection的常量中:
const endpoint = 'https://example.solana-devnet.quiknode.pro/000000/';
const solanaConnection = new solanaWeb3.Connection(endpoint);
太棒了!您已准备好构建搜索功能。
创建交易查询
getSignaturesForAddress方法将在此完成大量繁重的工作。其工作原理如下:
它将接受两个参数:
搜索地址(必填):您要查询的公钥
选项(可选):包含 3 个可选条目的对象:
before:在特定交易签名之前开始向后搜索
after:在特定交易签名之后开始向前搜索
限制:返回的最大交易数量(请注意,最大值和默认值为 1,000)
它将返回一个ConfirmedSignatureInfo数组的 Promise ,该数组是包含关键交易信息的类型对象:
签名(交易ID),
slot 和 blockTime(查看交易何时被处理),
err(如果有错误),以及
备忘录(如果与交易相关的任何备忘录)
定义一个新的异步函数getTransactions ,它接受两个参数:address和numTx。
在我们的函数内部,对solanaConnection的新实例调用getSignaturesForAddress方法,并将输出保存到变量transactionList中:
const getTransactions = async(address, numTx) => {
const pubKey = new solanaWeb3.PublicKey(address);
let transactionList = await solanaConnection.getSignaturesForAddress(pubKey, {limit:numTx});
}
这应该会给我们一个符合我们搜索条件的所有交易历史记录的数组。让我们以一种易于阅读的方式记录结果。
在getTransactions中,创建一个forEach循环来记录有关每个交易的信息:
const getTransactions = async(address, numTx) => {
const pubKey = new solanaWeb3.PublicKey(address);
let transactionList = await solanaConnection.getSignaturesForAddress(pubKey, {limit:numTx});
transactionList.forEach((transaction, i) => {
const date = new Date(transaction.blockTime*1000);
console.log(`Transaction No: ${i+1}`);
console.log(`Signature: ${transaction.signature}`);
console.log(`Time: ${date}`);
console.log(`Status: ${transaction.confirmationStatus}`);
console.log(("-").repeat(20));
})
}
运行你的代码!
如果一切设置正确,您应该能够调用您的函数并查看一些结果!将其添加到log.js的底部:
getTransactions(searchAddress,3);
现在在你的终端输入:
node log.js
你应该看到类似这样的内容:
哇!很简单,对吧?请随意尝试几个不同的钱包、一个 NFT 铸币地址和一个 Candy Machine ID。你可以看到该方法应该会产生类似的结果,这使得它对于许多不同的应用程序来说非常方便。
恭喜!您已成功获取交易......您可以在这里停下来,但如果您想了解我们还能用该交易签名做什么,请继续阅读
解析交易
因此,我们获得了一些有关交易历史的有用基本信息,但是每笔交易做了什么?我们可以使用 Solana 的getParsedTransaction方法来为我们提供大量额外的详细信息。
getParsedTransaction方法将接受已确认或最终确定的交易签名并返回ParsedTransactionWithMeta对象:
yarn init -y
yarn add @solana/web3.js@1
0
这里隐藏着大量信息,我们不会在本入门指南中介绍,但我们想举一个例子来说明如何与这些对象进行交互。
在getTransactions函数中,我们声明两个新变量:signatureList和transactionDetails 。我们将通过映射transactionList来生成签名列表,并将调用这些签名进入getParsedTransactions来生成每个交易的详细信息:
yarn init -y
yarn add @solana/web3.js@1
1
当我们的 promise 返回时,transactionDetails将产生一个ParsedTransactionWithMeta对象数组。让我们尝试在其中找到一些有用的信息。
假设我们有兴趣找到与给定交易交互的所有程序或智能合约。在我们原始的forEach循环中,在日期声明之后,让我们创建一个新变量transactionInstructions:
yarn init -y
yarn add @solana/web3.js@1
2
这将使用我们的索引i来查找循环中正在查询的同一交易的详细交易信息。由于每个交易可以有多个指令或程序迭代,因此我们需要另一个循环来获取交易中的每个程序交互。在我们的循环内部,在我们的确认状态日志之后,添加以下内容:
yarn init -y
yarn add @solana/web3.js@1
3
我们在这里所做的是,对于每个交易,查看每个交易指令并记录程序名称(如果存在)和程序 ID。
最终的函数看起来应该是这样的:
yarn init -y
yarn add @solana/web3.js@1
4
现在,再次运行脚本。在终端中输入:
node log.js
你应该看到类似这样的内容:
我们的交易结果现在包括与我们交互的不同程序的详细信息!