Solidity
合約如何判斷另一個地址是否是合約?
是否可以從用 Solidity 編寫的合約中檢查合約是否放置在特定地址或該地址是否不包含任何程式碼?
這有效:
function isContract(address _addr) private returns (bool isContract){ uint32 size; assembly { size := extcodesize(_addr) } return (size > 0); }
所有乙太坊合約編譯成的彙編語言包含一個用於此精確操作的操作碼:
EXTCODESIZE
. 此操作碼返回地址上程式碼的大小。如果大小大於零,則地址為合約。但是您需要在合約中編寫彙編程式碼才能訪問此操作碼,因為 Solidity 編譯器目前不直接支持它。上面的程式碼創建了一個私有方法,你可以在合約中呼叫它來檢查另一個地址是否包含程式碼。如果您不想要私有方法,請從函式頭中刪除 private 關鍵字。編輯:
EXTCODESIZE
如果從合約的建構子呼叫它,則返回 0。因此,如果您在安全敏感的設置中使用它,則必須考慮這是否是一個問題。