생성자 관리
- 최근 솔리디티는 컨트랙트 이름으로 생성자를 생성하지 않는다. 컨트랙트 이름과 생성자 이름을 다르게 한 경우, 그 함수는 그냥 보통 함수가 되어 호출가능하게 된다.
취약점
- 이전 버전의 솔리디티로 컨트랙트 구현할 때, 컨트랙트 이름과 생성자 이름을 다르게 쓰기 쉽다.
- OwnerWallet 컨트랙트
1 contract OwnerWallet {
2 address public owner;
3
4 // constructor
5 function ownerWallet(address _owner) public {
6 owner = _owner;
7 }
8
9 // Fallback. Collect ether.
10 function () payable {}
11
12 function withdraw() public {
13 require(msg.sender == owner);
14 msg.sender.transfer(this.balance);
15 }
16 }
- 위 코드는 컨트랙트 이름과 생성자 이름이 다르다! 첫글자가 소문자이다.
- 특히 위 생성자라고 생각되는 함수에서 매우 중요하게 입력 파라미터로 owner를 설정한다!
- 이 함수를 호출하는 누구든지 이 컨트랙트의 오너가 될 수 있는 위험에 있다!
예방기법
- 솔리디티 0.4.22부터 생성자는 constructor라는 키워드를 사용한다.
- 생성자이름을 컨트랙트 이름과 동일하게 사용하지 말라!