0%

evm | 获取历史区块数据

本文章可以做到

  • 通过回溯区块来获取信息
  • 根据条件来过滤杂讯

我现在的需求是,我要获取 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

# 连接到以太坊节点(可以使用Infura提供的节点)
web3 = Web3(Web3.HTTPProvider('https://eth-mainnet.nodereal.io/v1/****'))

# 代币合约地址和ABI
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
    • 貌似限制条件只是 ETH

这里说一下 topics

他的过滤条件是 Transfer 事件,并且,接收地址是 0x000000000000000000000000ba97a5f7b8b662dc5b34a283fad741ddc615e690

关于为什么,是因为 Topics 参照

ps: 2024-8-14

通过多个 topic 过滤。

传入的 topics 如下

1
2
3
4
5
6
topics = [
[
"0x229502205572c54515552d0224e7e4603c6944ff00e6c37c3650a84632a1ce26",
"0xdc631407cb2a954e6c75e8d536461cb4c093b5440af92b7c158c5078ebfc974b"
]
]

上面的两个 topic 分别对应不同的方法。

我对上述的使用感到疑惑,不过,由于没时间去深究了,就先记录一下。

请我喝杯咖啡吧~