bsc 通过钱包地址获取交易 Web3.py

Posted

技术标签:

【中文标题】bsc 通过钱包地址获取交易 Web3.py【英文标题】:bsc get transactions by wallet address Web3.py 【发布时间】:2021-10-07 23:14:05 【问题描述】:

如何跟踪 bsc 网络中钱包列表的代币交易?

我考虑使用 websocket 和过滤功能。我认为可以将topics 用作过滤器参数的一部分,并仅将Transfer 事件反映到/来自监视地址,这样我的应用程序就不必处理不必要的数据。

但是我做错了,不知道如何正确地将钱包列表(或至少只有一个钱包)作为我的过滤函数的参数。该怎么做?

我在从Transfer 事件中获取数据时遇到问题,因为我不知道如何解码HexBytes 类型。我看到了它的 web3.js 函数,但 web3.py 没有。

address_list = ['0x67fdE6D04a82689a59E5188f9B572CBeF53D4763', '...', '...']

web3 = Web3(Web3.WebsocketProvider('wss://bsc.getblock.io/mainnet/?api_key=your_api_key'))
web3_filter = web3.eth.filter('topics': address_list) 
while True:
    for event in web3_filter.get_new_entries():
        print(web3.toJSON(web3.eth.wait_for_transaction_receipt(event).logs))

【问题讨论】:

【参考方案1】:

我终于找到了解决方案。起初我使用 node.js 编写了相同的代码,因为 web3.js 让我更容易理解它的实际工作原理。它有更好的方法命名、更好的文档等

回到 web.py:

为了获取Transfer 事件签名,我使用了此代码transferEventSignature = web3.toHex(Web3.sha3(text='Transfer(address,address,uint256)'))

对于编码/解码,您可以使用eth_abi library

from web3 import Web3
from eth_abi import encode_abi, decode_abi
from hexbytes import HexBytes

encoded_wallet = (web3.toHex(encode_abi(['address'], [wallet])) # encoding

web3 = Web3(Web3.WebsocketProvider('wss://speedy-nodes-nyc.moralis.io/api-key/bsc/mainnet/ws'))
event_filter = web3.eth.filter('topics': [transferEventSignature, None, encoded_wallet]) # setting up a filter with correct parametrs
        while True:
            for event in event_filter.get_new_entries():
                decoded_address = decode_abi(['address'], HexBytes(event.topics[2])) # decoding wallet 
                value = decode_abi(['uint256'], HexBytes(event.data)) # decoding event.data

                tokenContractAddress = event.address

                contractInstance = web3.eth.contract(address=tokenContractAddress, abi=jsonAbi) # jsonAbi is standart erc-20 token abi 
                # I used simplified JSON abi that is only able to read decimals, name and symbol

                name = contractInstance.functions.name().call() 
                decimals = contractInstance.functions.decimals().call()
                symbol = contractInstance.functions.symbol().call()
                # getting any token information

                # doing some useful stuff

GetBlock.io 为我工作,但有时会与网络不同步。 我在这项服务上取得了更大的成功:https://moralis.io/

我希望有人会觉得这很有用。

【讨论】:

嗨!谢谢你 sn-p 但我搜索在 web3js 中做同样的事情。你能解释一下你是怎么做到的吗?我没有找到引擎盖背后的“逻辑”...... thx【参考方案2】:

这是我跟踪 BEP20 代币交易的代码:

def log_new(event_filter):
    for event in event_filter.get_new_entries():
        handle_event(event)

def handle_event(event):
    receipt =  web3.eth.waitForTransactionReceipt(event['transactionHash'])
    logs = contract.events.Transfer().processReceipt(receipt)

    args = logs[0]['args']

    print ("EVENT", event)
    hashstr = binascii.b2a_hex(event['transactionHash'])
    name = contract.functions.name().call() 
    decimals = contract.functions.decimals().call()
    symbol = contract.functions.symbol().call()

    item = 
        "from": args["from"],
        "to": args.to,
        "value": args.value,
        "blockNumber":event['blockNumber'],
        "transhash":  "0x" + hashstr.decode("ascii"),
        "timeStamp" : get_block_timestamp(event['blockNumber']),
        "tokenSymbol" : symbol, #"KAMPAY"
        "decimals" : decimals,
        "name" : name
    
    print(item)


block_filter = web3.eth.filter('fromBlock':'latest','address':MYTOKENADDRESS)
while 1:
    log_new(block_filter)
    time.sleep(1)

【讨论】:

【参考方案3】:

bscscan api 不可靠。问题是 API 支持 cloudfare DDoS 保护,有时会询问验证码。不幸的是,使用 Python 代码无法绕过此验证码检查。

【讨论】:

【参考方案4】:

Bscscan 提供基本免费使用的 API(5 个请求/秒)

因此,对于拥有交易列表(有不同类型的交易,包括 normalinternalbep-20 等),您可以使用this。

示例用法为this。

【讨论】:

以上是关于bsc 通过钱包地址获取交易 Web3.py的主要内容,如果未能解决你的问题,请参考以下文章

BSC/币安链批量转账,批量发送,币安链增加地址合约代码

连接到trustwallet并获取bsc、eth、btc地址和余额

BSC 测试链配置

以太坊钱包地址在哪里 如何买卖以太坊

数字货币钱包地址生成器 API 使用文档(支持BTC/ETH/TRX/BCH/ETC/BSC/LTC/DOGE等17种币-持续更新中)

如何获取有关随机智能合约地址的数据。如创建日期、链表、持有者(持有多少个钱包)