本文章可以做到
我现在的需求是,我要获取 0xa8218CBDb4Accce36EE92874Fe34a999abC30A7a
代币,向 0x000000000000000000000000ba97a5f7b8b662dc5b34a283fad741ddc615e690
地址转账的所有记录。
这里用的是 get_logs
方法,参考
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| from web3 import Web3
web3 = Web3(Web3.HTTPProvider('https://eth-mainnet.nodereal.io/v1/****'))
token_contract_address = '0xa8218CBDb4Accce36EE92874Fe34a999abC30A7a' # 你要查询的代币合约地址 token_abi = [ { "constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function" }, # 添加其他你需要的代币合约方法的ABI ]
token_contract = web3.eth.contract(address=token_contract_address, abi=token_abi)
topics = [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", None, "0x000000000000000000000000ba97a5f7b8b662dc5b34a283fad741ddc615e690" ]
transactions = web3.eth.get_logs({ 'fromBlock': 19275036, 'toBlock': 'latest', 'address': token_contract_address, 'topics': topics })
for tx in transactions: print(tx)
|
这里有几个亮点
topics
get_logs
最多能回溯 50000
个区块。即 toBlock - fromBlock <= 50000
这里说一下 topics
他的过滤条件是 Transfer
事件,并且,接收地址是 0x000000000000000000000000ba97a5f7b8b662dc5b34a283fad741ddc615e690
关于为什么,是因为 Topics
参照
ps: 2024-8-14
通过多个 topic
过滤。
传入的 topics
如下
1 2 3 4 5 6
| topics = [ [ "0x229502205572c54515552d0224e7e4603c6944ff00e6c37c3650a84632a1ce26", "0xdc631407cb2a954e6c75e8d536461cb4c093b5440af92b7c158c5078ebfc974b" ] ]
|
上面的两个 topic
分别对应不同的方法。
我对上述的使用感到疑惑,不过,由于没时间去深究了,就先记录一下。