blockchain

[ethernaut] Fallback

chanchand 2023. 4. 2. 03:51
반응형

문제


- ownership

- 잔액을 0으로 만들기

owner가 되어서 모든 금액 인출하기

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Fallback {

  mapping(address => uint) public contributions;
  address public owner;

  constructor() {
    owner = msg.sender;
    contributions[msg.sender] = 1000 * (1 ether);
  }

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

  function contribute() public payable {
    require(msg.value < 0.001 ether);
    contributions[msg.sender] += msg.value;
    if(contributions[msg.sender] > contributions[owner]) {
      owner = msg.sender;
    }
  }

  function getContribution() public view returns (uint) {
    return contributions[msg.sender];
  }

  function withdraw() public onlyOwner {
    payable(owner).transfer(address(this).balance);
  }

  receive() external payable {
    require(msg.value > 0 && contributions[msg.sender] > 0);
    owner = msg.sender;
  }

 

 

 

풀이


- constructor 

배포자의 contributions 배열에 1000 ether 저장

 

- contribute func

0.001 미만 ether를 전송받을 수 있음

전송받은 금액은 contributions 배열에 저장됨

owner 보다 값이 클 경우에 msg.sender가 owner가 됨

 

- withdraw func

모든 잔액을 owner에게 전송

 

- receive 

msg.value>0, msg.sender의 contributions 값이 0 초과일 때, msg.sender가 owner 됨

 

-> owner가 되어 withdraw 함수를 실행시키면 됨

- owner 

contributions 배열 값이 0 초과이어야 하기 때문에 contribute 함수를 한번 실행시켜야 함

receive 함수 실행 -> owner 변경됨

 

- withdraw 함수 실행

withdraw 함수 실행 -> 출금하여 잔액 0으로 만들기

 

 

 

반응형

'blockchain' 카테고리의 다른 글

[ethernaut] Coin Flip  (0) 2024.09.01
[ethernaut] Fallout  (0) 2023.04.05
[ethernaut] Hello Ethernaut  (0) 2023.04.02
remix - Deploy & At Address  (0) 2023.03.18
IPFS  (0) 2023.03.03