本文详细介绍了如何使用QuickNode的Streams和Key-Value Store构建一个索引器和API,以存储和检索智能合约部署的详细信息。通过实时监控区块更新,利用过滤器筛选合约部署事件,并使用REST API接口获取数据,提供了一种有效管理区块链数据的解决方案。
检索智能合约部署的详细信息可能会耗费时间。在本指南中,我们将向你展示如何构建自己的索引器和 API,以使用 QuickNode 的 Streams 和 Key-Value Store 存储和检索智能合约部署的详细信息。
具体来说,我们将教你如何使用 Streams 和 Filters 来监控新块的合约部署。你将学习如何将这些部署详细信息存储在 Key-Value Store 中,然后通过 REST API 调用进行检索。
让我们开始吧!
Streams 是一个强大的工具,允许你将实时和历史区块链数据检索到你选择的应用程序。Streams 提供了一种灵活的方式,从各种区块链网络中检索信息并将其传递到你指定的目的地,例如 Webhook、Postgres 数据库、S3 存储桶等。有关 Streams 的更多信息,请查看这里。另外,请确保查看我们长长的 Streams 教程。
Streams 包含一个强大的特性,称为 Filters,允许你细化从 Stream 发送的区块链数据。使用 Filters,你可以精确指定希望获取的区块链数据,确保你仅处理和支付对你相关的数据。要了解如何有效地在你的 Streams 中使用 Filters,请查看我们全面的 Filters 文档。
QuickNode 的 Key-Value Store 是一个快速、可扩展的数据库解决方案,特别适合存储与区块链相关的数据。在本指南中,我们将用它来存储合约部署的详细信息,然后稍后通过 REST API 调用从 Key-Value Store 检索这些数据。请在我们的 文档 中了解有关 Key-Value Store 的更多信息。
现在,我们将引导你创建 Stream,以监控和检索以太坊区块链上的智能合约部署详细信息。具体而言,我们将向你展示如何:
导航到你的 QuickNode 控制面板,然后点击左侧边栏中的 Streams。接下来,点击 Create Stream 并使用以下配置:
Ethereum Mainnet
Receipts
Latest Block
(如果需要,你也可以配置一个较早的开始块)Doesn't end
(如果需要,你也可以配置一个结束块)然后,在 Stream payload
部分,选择 Modify payload before streaming
选项,并包含以下代码。
function hexToDecimal(hex) {
return parseInt(hex, 16);
}
function main(stream) {
if (!stream || !stream.data[0]) {
return {
newContracts: [],
kvApiResults: []
};
}
const receipts = stream.data[0]
var newContracts = receipts.filter(function(receipt) {
return receipt.to === null;
}).map(function(receipt) {
return {
txHash: receipt.transactionHash,
from: receipt.from,
contractAddress: receipt.contractAddress,
blockNumber: hexToDecimal(receipt.blockNumber),
network: stream.metadata.network
};
});
const results = {
newContracts: newContracts,
kvApiResults: [],
};
const networkName = stream.metadata.network;
for (const contract of newContracts) {
const key = `${contract.contractAddress}:${networkName}`;
const item = `deploymentHash:${contract.txHash}`;
try {
const upsertResult = qnUpsertList(key, {
add_items: [item]
});
results.kvApiResults.push(upsertResult);
} catch (error) {
results.kvApiResults.push({ error: error.message });
}
}
return results;
}
让我们回顾一下代码:
hexToDecimal
是一个辅助函数,用于将十六进制解码为十进制值,我们将用它来将块号从十六进制转换为十进制。main
函数包含合约部署跟踪器的逻辑。对于从我们的 Stream 发送的每个新块,我们将检查收据,检查 to
字段是否为 null(这表示一个合约部署交易)。
txHash
、from
、contractAddress
、blockNumber
、network
)到 newContracts
映射中。qnUpsertList
将它们添加到我们的 Key-Value Store 中。一个键和项的示例如下:0x891a369c87ea9804792494b39879372e8ec87bb59401ec721d3ee4b650a1b2aa:ethereum-mainnet
(例如,contractAddress:networkName)。提示
在使用 Streams Filters 中的 Key-Value Store 时,你需要使用辅助函数(例如 qnUpsertList()
、qnGetList()
、qnGetAllLists() 等
),而不是进行 REST API 调用。有关更多信息,请查看这里。
我们可以通过指定 Test block
数字来测试 Filter 代码,然后点击 Run test
。如果你在块 20921736
上测试,你应该会看到类似下面的结果。
{
"kvApiResults": [\
"OK",\
"OK"\
],
"newContracts": [\
{\
"blockNumber": 20921736,\
"contractAddress": "0xf26ac92ff8617622bcf77c04317c009a8134dce2",\
"from": "0xf400de71bf20c529565f27aefdd80c00e579e696",\
"network": "ethereum-mainnet",\
"txHash": "0x891a369c87ea9804792494b39879372e8ec87bb59401ec721d3ee4b650a1b2aa"\
},\
{\
"blockNumber": 20921736,\
"contractAddress": "0x6c55f346c20ca2b0c62e30790907f0a41c978ccc",\
"from": "0xf400de71bf20c529565f27aefdd80c00e579e696",\
"network": "ethereum-mainnet",\
"txHash": "0x43973028c8d95a3a35edb2c685786c43ab56d8dd372b5fd4add690ec7a18a74f"\
}\
]
}
在代码编辑器下方,你会看到 Reorg handling
部分。保持此设置不变,然后在右下角点击 Next 继续配置 Stream。
在下一部分中,我们将设置目的地。
由于我们需要的数据已经被过滤,因此我们不需要进行其他处理。因此,我们将简单地将更新发送到我们的 Webhook 目的地,如果你希望添加额外的功能,可以稍后进行修改。
点击 Webhook 作为目标,然后填写以下详细信息:
stream_id
、batch_start_range
、batch_end_range
、network
等信息。 重要:目前,没有简单的方法在 Filters UI 中测试元数据(上面的示例是在更新前获取的)。因此,你在 Filters UI 测试时不会看到 Stream 元数据。我们正在努力更新此内容以改善元数据测试体验。填写完数据后,点击 Run Test 按钮,Stream 将会向该 URL 发送你 Stream 数据的示例。如果 you didn't change the previous Test block number, you will see the same test result sent to your Webhook; otherwise, if you're testing on a block with no new contract deployments, you will see an empty payload such as:
{
"kvApiResults": [],
"newContracts": []
}
这是正常的,因为并不是每个块都会有新的合约部署。最后,点击 Create a Stream 按钮以创建 Stream。在你的 Webhook 上保持关注;当检测到合约部署时,你将看到类似于此的结果:
在下一部分中,我们将向你展示如何通过 REST 调用 Key-Value Store 来检索这些智能合约的部署详细信息。
确保你想要的合约地址是在你的 Stream 被启动后已部署的(否则 Key-Value Store 将是空的/未定义的)。
然后,要通过 REST 调用 Key-Value Store,我们可以调用 /kv/rest/v1/lists/{key}
REST 方法并执行以下操作:
curl -X GET \
"https://api.quicknode.com/kv/rest/v1/lists/{contractAddress:network}" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY"
将 key
占位符替换为正确的键(即 contractAddress:network
)。此外,在 YOUR_API_KEY
字段中包含你的 API 密钥。你可以通过点击你的个人资料图标,然后点击 API Keys 在 QuickNode 控制面板上检索此内容。
响应看起来如下:
{
"code": 200,
"msg": "",
"data": {
"items": [\
"deploymentHash:0x3c63a1e63ad93b564db9740278bc0fb084505747c78f5981076001bdd5467b6f"\
]
}
}
注意:获取未添加到 Key-Value Store 的合约地址将导致未定义的响应。
你现在可以轻松地使用该交易哈希查找有关该交易的更多信息,可以在如 Etherscan 的区块浏览器上查找,或者调用 eth_getTransactionReceipt RPC 方法以获取交易的回执(其中将包括 logs
等字段)。
干得好!你刚刚创建了一个 Stream,为智能合约部署构建自己的索引器和 API。如果你想继续在此逻辑基础上构建,请尝试以下想法:
key
以与不同网络一起使用,正是尝试利用它的好时机做得好!本指南展示了如何建立一个监控新智能合约部署的索引器和 API,使用 QuickNode 的 Streams。
无论你正在构建什么,我们都想听到你的消息。在 Discord 或 Twitter 上留言,告诉我们你正在做什么!
告诉我们 如果你有任何反馈或新主题的请求。我们期待你的来信。
- 原文链接: quicknode.com/guides/qui...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!