如何使用Python的web3 API查询智能合约的所有权归属地址
实现方案
完全不需要用到Selenium,有两种更稳定高效的实现方式,核心逻辑都是调用合约公开的读方法,不需要爬取页面。
前置准备
先安装Python的web3依赖:
pip install web3
方案1:直接通过Web3调用合约owner()方法
绝大多数符合OpenZeppelin Ownable标准的合约都会内置一个公开的owner()无参方法,直接返回合约所有者地址,你只需要对应链的RPC节点地址即可调用,不需要全量合约ABI,只需要用到这个方法的ABI片段即可。
示例代码(以BSC链为例)
from web3 import Web3 # 连接BSC公开RPC节点,也可替换为自有节点或其他链的RPC地址 w3 = Web3(Web3.HTTPProvider('https://bsc-dataseed1.binance.org/')) # 待查询的合约地址 contract_address = '0x2A9718defF471f3Bb91FA0ECEAB14154F150a385' # owner()方法的最小ABI片段,无需获取全合约ABI abi = [ { "inputs": [], "name": "owner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function" } ] # 实例化合约对象 contract = w3.eth.contract(address=w3.to_checksum_address(contract_address), abi=abi) # 调用读方法获取所有者地址 owner_address = contract.functions.owner().call() print(f"合约所有者地址:{owner_address}")
运行上述代码会直接输出你示例中的结果 0x42997cf4fc165ebb8269cffc54a3198984367f02。
方案2:通过区块浏览器API实现(无需自行维护RPC节点)
如果你需要适配更多非标准命名的权限方法,或者不想依赖RPC节点,可以用对应链的区块浏览器公开API,先拉取合约的完整ABI,再遍历匹配所有者相关的方法(比如getOwner、admin、governor等)后调用即可,只需要申请对应浏览器的免费API密钥即可使用。
注意事项
- 如果目标合约没有采用标准的Ownable模式,而是自定义权限逻辑,你需要先确认合约中对应查询所有者的方法名和参数,调整ABI片段即可。
- 两种方案的性能和稳定性都远高于Selenium爬取页面,不会被反爬策略限制,响应速度也快几个数量级。
内容的提问来源于stack exchange,提问作者giacomomaraglino
相关产品推荐
相关产品推荐

