isContract 체크 오류 문의

안녕하세요.
solidity 코드 관하여 질문 드립니다.

저희 klaytn의 go package를 사용하여 구성한 테스트 환경과 리믹스에서 연결한 테스트 넷 환경에서는 정상 동작하는 부분이 실제 클레이튼 네트워크 (바오밥) 에서는 동작하지 않는 것을 확인하였습니다.

사용한 코드는 openzepplin의 isContract 검사이며

function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

해당 코드에서 address(0)를 입력하면 revert가 나야하나 사이드 체인에서는 address(0)도 검사를 통과합니다. 확인 부탁드립니다.

안녕하세요, 클레이튼 메인넷/바오밥 테스트넷의 address(0) (zero address) 에는 code hash가 있습니다. (해당 컨트랙트) 따라서 해당 isContract로는 true가 반환됩니다.

해당 주소가 caller인 경우는 없으니 무시하셔도 큰 지장은 없으나, 신경이 쓰이신다면 zero address를 확인하는 require문 등을 추가하시면 해결될 것 같습니다.

감사합니다.

2개의 좋아요