以太坊第 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交易历史 — 汇智网