如何使用web3.py查询区块链最新部署的智能合约?支持跨链与免费API
获取以太坊及跨链最新智能合约地址(含部署时间)的方案
一、免费链上扫描器API方案
这类方案无需自行搭建节点,通过各公链官方扫描器的免费API即可实现,天然支持跨链(切换对应链的扫描器API即可)。
核心逻辑
合约部署交易的特征是:to地址为空,交易执行后会生成新的合约地址。我们可以通过获取最新区块内的交易,筛选出这类合约创建交易,提取合约地址和交易时间(即部署时间)。
示例(以以太坊Etherscan为例)
- 调用
getBlockByNumber接口获取最新区块的交易列表,指定参数返回交易详情 - 遍历交易,筛选出
to字段为null的交易 - 从符合条件的交易中提取
contractAddress(合约地址)和timeStamp(部署时间,需转换为可读格式)
注意:免费API有调用频率限制,比如Etherscan免费版每分钟最多5次请求,需控制请求间隔。其他公链如Polygon、BSC可使用对应链的扫描器API(如PolygonScan、BSCScan),接口逻辑完全一致,只需更换API域名和链ID。
二、web3.py原生查询方案
如果需要更灵活的自定义逻辑,可使用web3.py连接免费节点实现,同样支持跨链。
前置准备
安装web3.py:pip install web3
连接免费节点(如Infura、Alchemy提供的以太坊/跨链节点)
代码示例
from web3 import Web3 from datetime import datetime # 连接以太坊节点(替换为你自己的免费节点URL,跨链则用对应链的节点) w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/你的项目ID')) # 获取最新区块号 latest_block_num = w3.eth.block_number # 获取区块详情(包含所有交易) block = w3.eth.get_block(latest_block_num, full_transactions=True) # 存储合约地址和部署时间的列表 contract_deployments = [] for tx in block.transactions: # 判断是否为合约创建交易(to地址为空,且creates字段存在) if tx['to'] is None and tx.get('creates') is not None: # 转换时间戳为可读格式 deploy_time = datetime.fromtimestamp(block['timestamp']).strftime('%Y-%m-%d %H:%M:%S') contract_deployments.append({ 'contract_address': tx['creates'], 'deploy_time': deploy_time }) # 打印结果 for item in contract_deployments: print(f"合约地址: {item['contract_address']}, 部署时间: {item['deploy_time']}")
跨链兼容说明
只需更换web3.py连接的节点URL为对应公链的免费节点即可,比如:
- Polygon主网:
https://polygon-mainnet.infura.io/v3/你的项目ID - BSC主网:
https://bsc-dataseed.binance.org/
不同公链的交易结构一致,代码逻辑无需修改,仅节点地址变化。
注意事项
- 免费节点和API都有请求限制,若需高频查询,可考虑多个免费资源轮询,或升级付费方案
- 部分链的扫描器API可能需要申请免费API Key,比如Etherscan需注册账号获取Key
内容的提问来源于stack exchange,提问作者Wesley Jones
相关产品推荐
相关产品推荐

