이미 알고 있는 내용들이지만, 이번 기회에 이것저것 정리를 해보려고 한다.
: external + internal
: external call만 가능
: internal call (상속받은 child contract 포함)
: internal call (상속받은 경우 접근 불가능)
자동으로 getter function이 생성됨
contract 내부, 상속받은 contract
contract 내부에서만 가능 (상속받은 경우 불가능)
0.5.0 이전의 경우 자동으로 public
으로 설정됨
여기서 _sendETH
가 internal로 설정되지 않아 누구나 withdraw
가 가능해진다.
(이 코드는 visibility를 쓰지 않아 물론 0.5.0 이전에서만 컴파일된다)
$31M이 털렸다고 한다
함수에 visibility가 없어 owner 권한을 탈취할 수가 있었다.
실제로 2022년 6월에 털린 컨트랙트의 코드라고 한다.
immunify에서 찾아진 취약점으로, $42k를 보상으로 받았다고 한다.
external로 선언되어 누구나 init을 호출할 수 있다.
_burn
이 external로 선언되어 있다.
항상 visibility를 체크할 것
sensitive function들은 반드시 access control을 붙일 것
Attacker의 mindset으로 코드를 리뷰할 것
Access Control을 직접 만들지 말 것! (바퀴의 재발명 X)
-> 가급적 Openzeppelin에서 만든 라이브러리를 사용할 것!
owner
만 접근할 수 있는 onlyOwner
modifier를 제공하는 라이브러리이다.
default로 deployer의 주소가 등록된다
onlyRole
modifier를 제공한다.
Ownable
의 onlyOwner
의 경우에는 msg.sender
가 owner
인지만 체크하는데,
onlyRole
의 경우 특정 msg.sender
가 특정 role을 갖고있는지를 체크한다.