Solidity
我可以通過任何方法知道特定地址是合約地址還是簡單的乙太坊地址?
這是我面臨的問題。
我正在使用其契約地址呼叫已部署契約的某些功能。
以下是程式碼行:-
function registerYourBrand(string memory brand, address contract_address)public onlyOwner returns(bool){ require(! exists[contract_address][brand], "You have already register your brand"); (bool success, bytes memory brand_Owner)=address(contract_address).call(abi.encodeWithSignature("getOwner()")); require(success); address brandOwner = address(bytesToAddress(brand_Owner)); brandOwners[brand] = brandOwner; contractAddresses[brand] = contract_address; tokenValue[brand] = 1; exists[contract_address][brand] = true; emit Register(brand,contract_address); return true; }
contract_address
應該是已經部署的合約的地址。但是,當我在這里傳遞任何其他地址時,即使它不是合約地址,也會執行這些行。但我想知道,這怎麼可能。
我正在混音中測試它。我有一個名為**‘AirToken’ 的已部署契約。在該契約中,getOwner()是一個功能。當我使用它的contact_address從其他合約呼叫這個函式時,它工作正常並且我成功地獲得了AirToken所有者的地址。但是當我傳遞一些不是契約地址的其他地址時,這一行會成功執行,但返回的值是一些虛擬值,例如0x00000000000000000000000000000000000000001**這個。
如果沒有任何合約地址,如何找到**getOwner()**函式?
contract_address
鏈下 - 是的,例如,使用 web3.js:
async function isContract(address) { const bytecode = await web3.eth.getCode(address); return bytecode != "0x"; }
至於你的問題:
如果沒有任何合約地址,如何
getOwner()
找到函式?contract_address
未找到 -
call
失敗,第一個輸出 (bool success
) 的值為false
。
- 呼叫隨機合約很可能不會失敗。
如果合約沒有實現函式,則將呼叫回退函式。大多數備份函式什麼都不做。所以呼叫將成功,結果將是一個長度為 0 的數組。有些可能會返回編碼為 bytes32 的真/假。
- 如果您呼叫 EOA,則呼叫將成功並返回長度為 0 的數組。
為了確保合約實現了一個介面,你必須強制他們使用像ERC-165 標準介面檢測這樣的東西。