web3 ABI 无法在以太坊主网上获得合约所有权
Posted
技术标签:
【中文标题】web3 ABI 无法在以太坊主网上获得合约所有权【英文标题】:web3 ABI doesn't work to get contract ownership on Ethereum mainnet 【发布时间】:2021-12-25 09:40:18 【问题描述】:我正在使用 web3 API 开发 python。我正在尝试获得部署在以太坊主网上的合同的所有权。我能写的最好的代码如下:
from web3 import Web3
eth = "https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161"
web3 = Web3(Web3.HTTPProvider(eth))
abi = '''[
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
"name": "",
"type": "address"
],
"payable": false,
"type": "function"
,
"inputs": [],
"payable": false,
"type": "constructor"
]'''
contract = web3.eth.contract(address=Web3.toChecksumAddress("0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE"), abi=abi)
owner = contract.functions.owner().call()
print(owner)
但如果我尝试执行代码,我会收到以下错误:
web3.exceptions.ContractLogicError: execution reverted
也许 ABI 不适用于此 RPC,或者不知道会发生什么。有人可以帮助我吗?谢谢。
【问题讨论】:
【参考方案1】:查询的合约 (source code) 没有 owner()
函数(也没有公共属性 owner
会自动生成 getter 函数)。
当您尝试调用不存在的函数时,EVM 会尝试调用 fallback()
(docs)。但它也不存在,所以调用失败。
合同不一定要有所有者。它“只是”一种广泛使用的模式,described,由 OpenZeppelin 和其他开源库作者实现。
【讨论】:
你是对的。那么如果我尝试与它的所有者签订合同,它就会成功。谢谢。以上是关于web3 ABI 无法在以太坊主网上获得合约所有权的主要内容,如果未能解决你的问题,请参考以下文章