2020.코딩일지

[solidity] fallback과 receive (feat.솔리디티깨부수기) 본문

Block Chain

[solidity] fallback과 receive (feat.솔리디티깨부수기)

개발하는라푼젤 2022. 12. 5. 13:40
728x90
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

//35강 버전별로 테스트!!

/*
0.6이전의 fallback : 이름그대로 대비책함수.
특징
    1. 먼저 무기명 함수, 이름이 없는 함수이다.
    2. external 필수
    3. payable

왜 쓰는가?
    1. 스컨이 이더를 받을 수 있게 한다.
    2. 이더 받고 난 후 어떠한 행동을 취하게 할 수 있다.
    3. call함수로 없는 함수가 불려질 때, 어떠한 행동을 취하게 할 수 있다.

0.6 이전
function() external payable {
    }

0.6 이후 fallback
fallback은 recevie와 fallback으로 두가지 형태로 나뉘게 되었습니다.
    receive는 순수하게 이더만 받을때 작동합니다.
    fallback: 함수를 실행하면서 이더를 보낼 때, 불려진 함수가 없을 때 작동합니다.

0.6 dlgn 
 기본형 : 불려진 함수가 특정 스컨이 없을 때 fallback함수가 발동합니다.
fallback() external {
    }
 payable 적용시 : 이더를 받고 나서도 fallback 함수가 발동합니다.
fallback() external payable{
    }
receive() external payable{
    }
*/
contract Bank {
    event JustFallbackWithFunds(address _from, uint256 _value, string message);
    //~0.6
    function() external payable {
        emit JustFallbackWithFunds(msg.sender, msg.value, "JustFallbackWithFunds is called");
        //누가 얼마만큼을 보냈는지 출력
    }
}
constract You {
    //receve()
    function DepositWithSend(address payable _to) public payable {
        bool success = _to.send(msg.value); //send함수로 Bank에 보내기
        require(success, "Failled");
    }
    function DepositWithTransfer(address payable _to) public payable{
        _to.transfer(msg.value); //transfer함수로 Bank에 보내기
    }
    function DepositWithCall(address payable _to) public payable{
        //~0.7이전의 버전의 call함수로 Bank에 보내기
        (bool sent, ) = _to.call.value(msg.value)("");
        require(sent, "Failed to send either");

        //0.7~
        // (bool sent, ) = _to.call{value: msg.value}("");
        // require(sent, "Failled");
    }

    //fallback()
    function JustGiveMessage(address _to) public {
        // ~ 0.7
        (bool sent, ) = _to.call("HI"); //Bank스컨에는 없는 HI함수
        require(sent, "Failed to send either");

        //0.7 ~
        // (bool success, ) = _to.call("HI");
        // require(success, "Failled");
    }

    //To the fallback() with Funds
    function JustGiveMessageWithFunds(address payable _to) public payable{
        // ~ 0.7
        (bool sent, ) = _to.call.value(msg.value)("HI"); //이더도보내고 없는함수도부르고
        require(sent, "Failed to send either");

        //0.7 ~
        // (bool success, ) = _to.call{value:msg.value}("HI");
        // require(success, "Failled");

    }
}
Comments