首页 > 编程问答 >当 API 返回无交易时,如何检索特定 Cosmos 地址的交易数据?

当 API 返回无交易时,如何检索特定 Cosmos 地址的交易数据?

时间:2024-07-29 06:45:46浏览次数:5  
标签:python api blockchain aiohttp cosmos-sdk

我正在尝试使用 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

相关文章

  • 如何用Python制作Android服务?
    我想构建一个简单的Android应用程序,例如PushOver应用程序,它具有TCP服务器并接收其记录的文本消息,然后将其作为推送通知发送。这部分已经完成并且工作正常。但即使GUI应用程序关闭,我也想接收消息。我知道这是可能的,因为PushOver应用程序做到了!我想,我可能需要一......
  • 如何在 FastAPI 中手动创建 UploadFile?
    背景我正在尝试为我的FastAPI应用程序编写测试。我有一个对象ImageRecord,它将图像上传到S3。方法签名如下:asyncdefupload_image(file:UploadFile,s3_client=None)->'ImageRecord':API逻辑(即实际的@app.post函数)调用此方法来上传对象。我想......
  • Python Discord Bot 的应用程序命令的区域设置名称(多语言别名)
    如何根据用户的语言设置,使应用程序命令的名称具有不同的名称例如,如果一个用户将其discord的语言设置为英语,则用户可以看到英语的应用程序命令名称。另一方面,如果另一个用户将其不和谐语言设置为法语,则用户可以看到法语中的相同应用程序命令的名称。为此,我尝试使用ap......
  • 如何在Python中添加热键?
    我正在为游戏制作一个机器人,我想在按下热键时调用该函数。我已经尝试了一些解决方案,但效果不佳。这是我的代码:defstart():whileTrue:ifkeyboard.is_pressed('alt+s'):break...defmain():whileTrue:ifkeyboard.is_pr......
  • 在Python中解压文件
    我通读了zipfile文档,但不明白如何解压缩文件,只了解如何压缩文件。如何将zip文件的所有内容解压缩到同一目录中?importzipfilewithzipfile.ZipFile('your_zip_file.zip','r')aszip_ref:zip_ref.extractall('target_directory')将......
  • 如何在Python中从RSA公钥中提取N和E?
    我有一个RSA公钥,看起来像-----BEGINPUBLICKEY-----MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAvm0WYXg6mJc5GOWJ+5jkhtbBOe0gyTlujRER++cvKOxbIdg8So3mV1eASEHxqSnp5lGa8R9Pyxz3iaZpBCBBvDB7Fbbe5koVTmt+K06o96ki1/4NbHGyRVL/x5fFiVuTVfmk+GZNakH5dXDq0fwvJyVmUtGYA......
  • Swagger、Docker、Python-Flask: : https://editor.swagger.io/ 生成服务器 python-fl
    在https://editor.swagger.io/上您可以粘贴一些json/yaml。我正在将此作为JSON进行测试(不要转换为YAML):{"swagger":"2.0","info":{"version":"1.0","title":"OurfirstgeneratedRES......
  • 使用 Matplotlib 的 Python 代码中出现意外的控制流
    Ubuntu22.04上的此Python3.12代码的行为符合预期,除非我按q或ESC键退出。代码如下:importnumpyasnp,matplotlib.pyplotaspltfrompathlibimportPathfromcollectionsimportnamedtuplefromskimage.ioimportimreadfrommatplotlib.widgets......
  • 参考 - Python 类型提示
    这是什么?这是与在Python中使用类型提示主题相关的问题和答案的集合。这个问题本身就是一个社区维基;欢迎大家参与维护。这是为什么?Python类型提示是一个不断增长的话题,因此许多(可能的)新问题已经被提出,其中许多甚至已经有了答案。该集合有助于查找现有内容。范......
  • 我的 Python 程序中解决 UVa 860 的运行时错误 - 熵文本分析器
    我正在尝试为UVa860编写一个解决方案,但是当我通过vJudge发送它时,它一直显示“运行时错误”。fromsysimportstdinimportmathdefmain():end_of_input=Falselambda_words=0dictionary={}text_entropy=0relative_entropy=0whilenotend_of_in......