본문 바로가기

4차산업/블록체인

이더리움 스마트 건트랙트 시큐어코딩

[체크 또 체크] 이더리움 스마트 컨트랙트 프로그램을 작성할 때 반드시 주의 해야 하는 사항들 



(1) 접근제어자(Access Modifier) 설정


실수를 방지하기 위해서는 최소한의 접근 권한을 가지도록 접근제어자를 설정한다.


public: 어디에서나 호출가능

external: 해당 컨트랙트 내부에서는 호출 불가능, 외부에서만 호출 가능

private: 해당 컨트랙트 내부에서만 호출 가능

internal: 해당 컨트랙트와 derived 컨트랙트만 호출 가능 



(2) 오버플로우/언더플로우


오버플로우는 숫자가 최댓값 이상으로 증가하는 경우이다.


   0xFFFF.......FF

+ 0x000.........01

-----------------

   0x0000......00


연산을 수행하는 경우 오픈제플린에서 제공하는 safeMath를 사용하여 연산을 수행하게 되면 오버플로우나 언더플로우가 발생시 예외를 발생시키고 revert되어서 안전하게 연산을 수행할 수 있다.


오픈제플린: https://openzeppelin.org/api/docs/math_SafeMath.html

오픈제플린Git: https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol



(3) 함수의 Reenter 방지


외부 스마트 컨트랙트 함수를 호출하는 경우, 그 함수에서 호출한 함수를 재귀 호출하게 되어 있다면 반복적으로 토큰을 전송하는 등 예상치 못한 결과를 발생 시킬 수 있다.


사례) The DAO 해킹

2016년 6월17일, 다오의 기능 중 하나인, 투자자들이 클아우드 세일에 참여해서 다오 토큰 구매를 위해 지불했던 이더를 환불받는 기능에서, 이더를 환불신청(,split)해서 이더를 먼저 받고, 자신의 다오토큰을 되돌려주기전에 다시 이더를 환불 받는 재귀 call 코드 (Recursive calling vulnerability)를 통해 무한환불 공격을 수행하여 총 243만 이더(약 750억)가 해킹당함.


이를 방지하기 위해서는 nonReentrant라는 modifier 사용.

noReentrant를 사용하면 reentrancy_lock이라는 플래그 변수로 lock 상태로 전환되어, 해당 함수가 실행되는 도중에 해당 함수 재귀 호출을 막아준다.



[작성중]


(4)  Storage 변수 사용 주의


(5) memory 변수 선언 


(6) 버전 선언 규칙 지정


(7) 다중 상속 주의 


(8) 컨트랙트 오너 관리