0
点赞
收藏
分享

微信扫一扫

Polygon历史交易查询方法

八怪不姓丑 2022-03-12 阅读 66
虚幻uiue4

以太坊第 2 层扩展解决方案如 Polygon,允许开发人员利用低交易成本和更快的确认时间。然而,
这给开发者带来了新的挑战 —— 如何处理和存储大量区块链数据。在本教程中,我们学习如何通过
几行代码就在 Polygon dApp 集成历史交易查询功能。

传统上,开发人员必须在他们自己的节点上启动、管理和索引来构建数据库。这使得开发人员受到昂贵且缓慢的解决方案的限制,最终限制了他们的应用程序的功能集,无论它们是部署在第 1 层还是第 2 层解决方案上。

虽然在 dApps 中构建历史查询传统上是复杂且耗时的,但 Polygon 上的 Alchemy Transfers API 允许开发人员在单个请求中获取 Polygon 交易详细信息并追溯到开始。

1、Polygon区块链转账类型

在深入研究 Polygon 上的 Alchemy Transfers API 之前,让我们澄清一下在Polygon链上看到的 3 种类型的转账

  • 外部 MATIC 转账

这些是顶级 Polygon 交易,发件人地址是外部(用户创建的)地址。外部地址有私钥,可供用户访问。

Polygon 上的 Alchemy Transfers API 目前不支持外部转账交易。

  • 通证转账

ERC20(可替代通证)、ERC721(NFT)和 ERC1155(混合可替代通证和不可替代通证)转移的事件日志。

  • 内部 Eth 转账

这些是在fromAddress是内部(智能合约)地址的情况下发生的转移。例如:智能合约调用另一个智能合约或智能合约调用另一个外部地址。

Polygon 上的 Alchemy Transfers API 目前不支持内部转账交易。

有关 API 参数和 JSON 响应的更多信息,请阅读Alchemy转账 API。

2、Alchemy Transfers API For Polygon

在这个例子中,我们试图查询并找到这笔交易的转账。我们可以从 Polyscan 中看到,大约 12,000 USDT 从0x5350e1068f0e138ff306990b16fa4910d970c692转移到0x9d2b758e3ffd2569c6956676fae7f8b71a53ffb5。
在这里插入图片描述

要使用 Transfers API 跟踪 USDT 转账,我们需要一些有助于缩小搜索范围的关键信息。我们将此请求信息格式化为 JSON 对象,如下所示:

{
   "jsonrpc":"2.0",
   "id":0,
   "method":"alchemy_getAssetTransfers",
   "params":[
      {
         "fromBlock":"from_Block",
         "toBlock":"to_Block",
         "fromAddress":"FROM_ADDRESS",
         "toAddress":"TO_ADDRESS",
         "contractAddresses":[
            "USDT_ADDRESS"
         ],
         "category":[
            "erc20"
         ]
      }
   ]
})
  • 起止区块

我们可以通过限制尝试搜索的开始和结束块编号来减少 API 返回 JSON 响应所需的时间。

交易发生在区块23876472中,因此我们将搜索调整为围绕该区块号的一个小缓冲区。

JSON 对象允许我们使用十六进制字符串或块号输入。在这种情况下,我们使用十六进制,因此我们将23876470 高度的fromBlock编码为 0x16C5376,将23876474高度的toBlock编码为 0x16C537A。

  • 往来地址

To和From分别代表交易的发送目标和来源地址。

在我们的示例中,To Address 是0x9d2b758e3ffd2569c6956676fae7f8b71a53ffb5并且From Address 是0x5350e1068f0e138ff306990b16fa4910d970c692。

  • 合约地址

合约地址是表示我们要查找的特定 ERC20、ERC721 或 ERC1155 合约的地址。在我们的示例中,Polygon USDT 的 ERC20 合约是0xc2132d05d31c914a87c6611c10748aeb04b58e8f。

将这些信息放在一起,我们现在可以使用 Alchemy 的 Composer 工具返回包含我们的目标事务的结果。

在这里插入图片描述

可以点击这里访问上述Alchemy Composer 示例!

3、使用Alchemy Transfer API

现在,我们使用代码查询上述转账交易。

  • 导入声明

为了试用 Alchemy Transfers API,我们首先使用一些导入语句来导入稍后将使用的模块。

import json
from web3 import Web3
import requests

如果你的 python 环境中没有安装任何这些模块,请确保在python 环境中运行以下 pip 命令。

pip install web3
pip install requests
  • 设置Alchemy API Key

将字符串“ALCHEMY KEY”替换为您自己的私有 API 密钥。

ALCHEMY_KEY = “ALCHEMY KEY”
w3 = Web3(Web3.HTTPProvider('https://polygon-mainnet.alchemyapi.io/v2/'+ALCHEMY_KEY))

在这里插入图片描述

如果还没有Alchemy API Key,首先需要在 Alchemy 上创建一个帐户。免费版本可以很好地开始使用!

  • 配置Web3.py处理ERC20合约

由于我们正在使用 ERC20 合约 USDT,因此需要在通常在 Web3 中调用的代码之上添加一段额外的代码来正确地与合约交互。请注意,我们在此代码段中包含 ERC20 ABI,以便正确读取 USDT 合约。

合约应用二进制接口 ( ABI ) 是以太坊生态系统中与合约交互的标准方式,我们使用 ERC20 ABI 与 ERC20合约(例如 USDT 合约)进行交互。

ERC20_ABI = json.loads('[{"constant":true,"inputs":[],"name":"name","outputs"......{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]')  
  • 设置变量

如上所述,我们将变量配置为指向正确的地址和块号。此外,我们使用 w3.eth.contract 方法,以便我们可以通过 USDT 合约读取数据。

USDT_ADDRESS = '0xc2132D05D31c914a87C6611C10748AEb04B58e8F'
FROM_ADDRESS = '0x5350E1068f0E138ff306990B16fA4910d970c692'
TO_ADDRESS = '0x9d2b758E3ffd2569c6956676fAE7f8B71A53Ffb5'

from_Block = '0x16C5376'
to_Block = '0x16C537A'

usdt = w3.eth.contract(address=USDT_ADDRESS, abi=ERC20_ABI)
  • 通过 Alchemy Transfers API 查询

在这里,我们向 Alchemy Transfers API 发送一个请求。嵌入在我们的请求中的是调用的特定alchemy_getAssetTransfers方法和所有之前的参数 [From Block & To Block, To & From Addresses, and Contract Address]

请注意,我们还处理 JSON 结果并对其进行解析,以便为我们提供在查询返回的交易中传输的确切 USDT 值。

transfer_json = requests.post('https://polygon-mainnet.g.alchemy.com/v2/'+ALCHEMY_KEY, json={"jsonrpc": "2.0","id": 0,"method": "alchemy_getAssetTransfers","params": [{"fromBlock": from_Block,"toBlock": to_Block,"fromAddress": FROM_ADDRESS,"toAddress": TO_ADDRESS,"contractAddresses": [USDT_ADDRESS],"category": ["erc20"]}]})

json_response = transfer_json.json()
transfer_val = (json_response['result']['transfers'][0]['rawContract']['value'])
  • 转换单位以提高可读性

从 JSON 响应中接收并解析 USDT 值后,我们将十六进制字符串转换为十进制格式并进行单位转换!

# convert hexadecimal make to decimal format 
val = (int(transfer_val, 16))

print("USDT TRANSFERED:")
print("--> FROM: " + FROM_ADDRESS)
print("--> TO: " + TO_ADDRESS)

# unit conversion!
print(val/1000000)

最终命令行输出:

在这里插入图片描述

恭喜!您现在已成功从 Polygon 上的 Alchemy Transfers API 进行查询!

4、完整的Polygon历史交易查询代码

完整的基于Alchemy API的Poloygon历史交易查询Python代码如下:

import json
from web3 import Web3
import requests

try:
    ALCHEMY_KEY = "Rt4_MeHEE8mQWVi-uSppHNSDmOG"
except:
    print("Please insert your Alchemy API Key!")

w3 = Web3(Web3.HTTPProvider("https://polygon-mainnet.g.alchemy.com/v2/"+ALCHEMY_KEY))

# includes the standard ERC20 ABI info
ERC20_ABI = json.loads('[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],......{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]')  # noqa: 501

# configures web3 to point towards the USDT token address
# make sure that these addresses are Ethereum-checksummed! (use this tool: https://ethsum.netlify.app/ to make sure)
USDT_ADDRESS = '0xc2132D05D31c914a87C6611C10748AEb04B58e8F'
FROM_ADDRESS = '0x5350E1068f0E138ff306990B16fA4910d970c692'
TO_ADDRESS = '0x9d2b758E3ffd2569c6956676fAE7f8B71A53Ffb5'

from_Block = '0x16C5376'
to_Block = '0x16C537A'

usdt = w3.eth.contract(address=USDT_ADDRESS, abi=ERC20_ABI)

transfer_json = requests.post('https://polygon-mainnet.g.alchemy.com/v2/'+ALCHEMY_KEY, json={"jsonrpc": "2.0","id": 0,"method": "alchemy_getAssetTransfers","params": [{"fromBlock": from_Block,"toBlock": to_Block,"fromAddress": FROM_ADDRESS,"toAddress": TO_ADDRESS,"contractAddresses": [USDT_ADDRESS],"category": ["erc20"]}]})
json_response = transfer_json.json()
#print(json_response)

transfer_val = (json_response['result']['transfers'][0]['rawContract']['value'])

# convert hexadecimal make to decimal format 
val = (int(transfer_val, 16))

print("USDT TRANSFERED:")
print("--> FROM: " + FROM_ADDRESS)
print("--> TO: " + TO_ADDRESS)

# unit conversion!
print(val/1000000)

原文链接:查询Polygon交易历史 — 汇智网

举报

相关推荐

0 条评论