본문 바로가기
aaa
블록체인

이더넛 레벨2 풀기

 이더넛 레벨2 풀기

 

레벨2. Fallout

 

목표

스마트컨트랙트의 owner에 대입된 주소를
내 주소로 변경한다.

 

Full code
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import '@openzeppelin/contracts/math/SafeMath.sol';

contract Fallout {
  
  using SafeMath for uint256;
  mapping (address => uint) allocations;
  address payable public owner;


  /* constructor */
  function Fal1out() public payable {
    owner = msg.sender;
    allocations[owner] = msg.value;
  }

  modifier onlyOwner {
	        require(
	            msg.sender == owner,
	            "caller is not the owner"
	        );
	        _;
	    }

  function allocate() public payable {
    allocations[msg.sender] = allocations[msg.sender].add(msg.value);
  }

  function sendAllocation(address payable allocator) public {
    require(allocations[allocator] > 0);
    allocator.transfer(allocations[allocator]);
  }

  function collectAllocations() public onlyOwner {
    msg.sender.transfer(address(this).balance);
  }

  function allocatorBalance(address allocator) public view returns (uint) {
    return allocations[allocator];
  }
}

솔리디티  Solidity 0.4.23 이전 버전에서는 

컨트랙트과 이름과 동일한 함수를 만들면

현재 버전에서 쓰이고 있는 컨스트럭터 함수와 동일한 기능을 했다.

 

그러한 의도로 위 스마트컨트랙트

Fallout에는 Fallout 함수를 만들려고 한 것 처럼 보인다.

하지만 실수로 오타가 났는지

Fal1out 이라는 함수명으로 작성되었다.

 

컨스트럭터는 스마트컨트랙트 배포시에만 호출되지만

위 스마트컨트랙트는 함수명을 잘못적었기 때문에

Fal1out 함수를 호출할 수 있다.

 

  /* constructor */
  function Fal1out() public payable {
    owner = msg.sender;
    allocations[owner] = msg.value;
  }

 

함수 Fal1out을 호출하면

owner는 함수 호출자가 된다.

 

전략 실행

 

owner가 누구인지 체크하면

아무것도 설정되어 있지 않다.

 

오타가 나는 바람에 컨스트럭터가

제대로 작동하지 않았기 때문이다.

 

 

실수를 하지 않고

함수명을 Fallout으로 했다면

Fal1out은 함수는 스마트컨트랙트 배포 이후에는

호출되지 않았을 것이다.

 

하지만 오타가 났기 때문에

Fal1out 함수는 호출이 가능하다.

player가 Fal1out 함수를 호출하면

owner에는 player의 주소인 msg.sender가 대입된다.

 

 

Fal1out 함수 호출 이후

owner가 누구인지 체크하면

player 주소가 대입된 것을 확인 할 수 있다.

 

 

성공~!

 

코딩을 하다 보면 아주 사소한 오타 때문에

의도대로 실행되지 않는 경우를 자주 볼 수 있다.

 

만약 스마트컨트랙트에서 위와 같이 사소한 오타로 허점이 발생했고

이를 이용해서 Dapp이 타격 받는다면 큰 금전적 손실로 이어질 수 있다. (특히 디파이)

따라서 항상 변수나 함수명에 오타가 있는지 꼼꼼히 확인하자.

'블록체인' 카테고리의 다른 글

[이더넛] 레벨4 'Telephone' 풀기  (0) 2021.08.11
[이더넛] 레벨3 'Coin Flip' 풀기  (0) 2021.08.10
이더넛 레벨1 풀기  (0) 2021.08.10
이더넛 시작 & 레벨 0  (0) 2021.08.10
이더스캔 만들기  (0) 2021.08.06

loading