web3 ABI 无法在以太坊主网上获得合约所有权
web3 ABI doesn't work to get contract ownership on Ethereum mainnet
我正在 python 使用 web3 API。我正在尝试获得部署在以太坊主网上的合同的所有权。我可以发短信的最佳代码如下:
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,或者不知道发生了什么。有人可以帮助我吗?谢谢
查询的合约 (source code) 没有 owner()
函数(也没有 public 属性 owner
会自动生成 getter 函数).
当您尝试调用不存在的函数时,EVM 会尝试调用 fallback()
(docs)。但它也不存在,所以调用失败。
合同不一定要有所有者。它“只是”一种广泛使用的模式,described 并由 OpenZeppelin 和其他开源库作者实现。
我正在 python 使用 web3 API。我正在尝试获得部署在以太坊主网上的合同的所有权。我可以发短信的最佳代码如下:
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,或者不知道发生了什么。有人可以帮助我吗?谢谢
查询的合约 (source code) 没有 owner()
函数(也没有 public 属性 owner
会自动生成 getter 函数).
当您尝试调用不存在的函数时,EVM 会尝试调用 fallback()
(docs)。但它也不存在,所以调用失败。
合同不一定要有所有者。它“只是”一种广泛使用的模式,described 并由 OpenZeppelin 和其他开源库作者实现。