我正在尝试使用 Python 和 aiohttp 检索 Cosmos 区块链上特定地址的交易数据。该地址在 Mintscan 上显示有 61 笔交易,但在查询区块链的 API 时,它没有返回任何交易。这是我当前的代码:
import aiohttp
import asyncio
async def fetch_transactions_for_address(node_url, address):
async with aiohttp.ClientSession() as session:
url = f"{node_url}/cosmos/tx/v1beta1/txs?events=message.sender='{address}'&events=tx.height=200000"
async with session.get(url) as response:
print(f"Response Status: {response.status}")
if response.status == 200:
data = await response.json()
transactions = data['tx_responses']
return len(transactions)
else:
response_text = await response.text()
print(f"Failed to fetch data: {response_text}")
raise Exception(f"Failed to fetch data: {response.status}")
async def main():
node_url = "https://cosmos-rest.publicnode.com"
address = "cosmos1hcaq68m5krxuppd8xnqnrm4uf2gudkmhns5d6n"
try:
transaction_count = await fetch_transactions_for_address(node_url, address)
print(f"Number of transactions for the address: {transaction_count}")
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
asyncio.run(main())
如何调整我的脚本或方法以正确检索 Mintscan 上显示的该地址的 61 笔交易?
该问题在于你的请求 URL 中的
tx.height=200000
参数。该参数限制了对特定区块高度的搜索,并且因为该地址的交易可能不在区块 200000 中,所以你没有收到任何结果。
要检索一个地址的所有交易,你需要 迭代不同的方法 ,因为 Cosmos REST API 不提供使用单个请求查询所有交易的方法。
以下是你可以尝试的方法:
1. 使用分页检索交易:
-
Cosmos API 支持分页,你可以使用
limit
和offset
参数来检索交易批次。 -
从
limit
设置为一个合理的值(例如 100)和offset
设置为 0 开始。 -
持续获取交易,每次增加
offset
值,直到收到空响应或达到所需的交易数量。
以下是使用分页修改后的代码:
import aiohttp
import asyncio
async def fetch_transactions_for_address(node_url, address):
all_transactions = []
offset = 0
limit = 100
has_more_transactions = True
while has_more_transactions:
async with aiohttp.ClientSession() as session:
url = f"{node_url}/cosmos/tx/v1beta1/txs?events=message.sender='{address}'&limit={limit}&offset={offset}"
async with session.get(url) as response:
if response.status == 200:
data = await response.json()
transactions = data['tx_responses']
all_transactions.extend(transactions)
# 如果响应中的交易少于限制,则表示没有更多交易
if len(transactions) < limit:
has_more_transactions = False
else:
offset += limit
else:
response_text = await response.text()
print(f"Failed to fetch data: {response_text}")
raise Exception(f"Failed to fetch data: {response.status}")
return all_transactions
async def main():
node_url = "https://cosmos-rest.publicnode.com"
address = "cosmos1hcaq68m5krxuppd8xnqnrm4uf2gudkmhns5d6n"
try:
transactions = await fetch_transactions_for_address(node_url, address)
print(f"Number of transactions for the address: {len(transactions)}")
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
asyncio.run(main())
2. 使用第三方 API:
- 服务,例如 Mintscan ,提供 API 端点,可以通过单个请求检索地址的所有交易。
- 你可以使用 Mintscan API 来获取特定地址的交易,而无需分页。
请记住检查所选 API 的文档和速率限制。
这些方法应允许你检索 Cosmos 地址的所有交易,而无需依赖特定区块高度。
标签:python,api,blockchain,aiohttp,cosmos-sdk From: 78804930