상세 컨텐츠

본문 제목

솔리디티 강좌 35강 - fallback / receive 함수

솔리디티 깨부수기 - 기본

by D_One 2021. 10. 4. 12:45

본문

 


유튜브를 통해, 쉽고 간편하게 이해 해보아요!

https://youtu.be/bS4yIW4CHo8

구독/좋아요 해주셔서 감사합니다 :) !!


 

안녕하세요

 

오늘은 fallback과 receive 함수에 대해서 알아 보도록 하겠습니다. 

 

fallback

이름 그대로 대비책 함수 입니다. 

특징 
1. 먼저 무기명 함수, 이름이 없는 함수입니다.
2. external 필수 
3. payable 필수 

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

 

먼저 0.6 이전 버전 전후 fallback 함수는 변화가 생깁니다.

 

0.6이전의 fallback

function() external payable {
    
}

 

자 그러면 0.6 이후로 어떻게 fallback 변했는지 보겠습니다. 

 

0.6 이후 fallback 

 

fallback은 recevie 와 fallback 으로 두가지 형태로 나뉘게 되었습니다.

receive:  순수하게 이더만  받을때 작동 합니다. 
fallback: 함수를 실행하면서 이더를 보낼때, 불려진 함수가 없을 때 작동합니다.

 

기본형 :  불려진 함수가 특정 스마트 컨트랙이 없을때 fallback 함수가 발동 합니다. 
fallback() external {
   
  }

payable 적용시 : 이더를 받고 나서도 fallaback 함수가 발동합니다. 
fallback() external payable {
   
  }

receive() external payable{
    
}

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0 < 0.9.0;


contract Bank{
    event JustFallback(address _from,string message);
    event RecevieFallback(address _from,uint256 _value ,string message);
    event JustFallbackWIthFunds(address _from,uint256 _value ,string message);
    //~0.6 
//   function() external payable {
//      emit JustFallbackWIthFunds(msg.sender, msg.value,"JustFallback is called");
//     }
    
    
    //0.6~
    // fallback() external {
    //   emit JustFallback(msg.sender,"JustFallback is called");
    // }
    // receive() external payable {
    //   emit RecevieFallback(msg.sender, msg.value,"RecevieFallback is called");
    // }
    
    //
    fallback() external payable {
     emit JustFallbackWIthFunds(msg.sender, msg.value,"JustFallbackWIthFunds is called");
    }
  
}

contract You{

    //receve() 
    function DepositWithSend(address payable _to) public payable{
         bool success = _to.send(msg.value);
         require(success, "Failled" );
    }
    
    function DepositWithTransfer(address payable _to) public payable{
        _to.transfer(msg.value);
    }
    
    function DepositWithCall(address payable _to) public payable{
        // ~ 0.7
        // (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 payable _to) public payable{
        (bool success, ) = _to.call("HI");
        require(success, "Failled" );
    }
    
    //To the fallback() with Funds
    function JustGiveMessageWithFunds(address payable _to) public payable{
        (bool success,) = _to.call{value:msg.value}("HI");
        require(success, "Failled" );
    }
    
}

관련글 더보기