fallback() & receieve()

CHOYEAH·2023년 10월 23일
0
post-thumbnail

fallback, receieve


fallback

이름 그대로 대비책 함수

특징 

1. 먼저 무기명 함수, 이름이 없는 함수

2. external 필수 

  1. payable 필수 

왜 쓰는가 ?

1. 스마트 컨트랙이 이더를 받을 수 있게 한다.

2. 이더 받고 난 후 어떠한 행동을 취하게 할 수 있다. 

3. call 함수로 없는 함수가 불려질때, 어떠한 행동을 취하게 할 수 있다.

UseCase

  • 사용자가 컨트랙트에 존재하지 않는 함수를 호출 할 경우를 대비하여 사용
  • erc20 토큰만 받는 컨트랙트에서 유저가 eth를 전송하는 경우, 컨트랙트에 한 번 들어가게되면 다시 뺄 수 없는 상황이 발생할 수 도 있으므로 그런 경우를 대비하여 revert 시키는 로직을 추가하여 만일의 사고에 대비할 수 있다.

솔리디티 0.6 버전 이후 fallback은 recevie와 fallback 으로 두가지 형태로 나뉘게 되었다.

//SPDX-License-Identifier: MIT
pragma solidity >= 0.8.0 <0.9.0;
import "hardhat/console.sol";

contract FallbackAndReceive{

    uint public data = 0;

    constructor() {
        data = 1;
    }

    function order() external payable {
        data = 2;
    }

    // 사용자가 존재하지 않는 함수를 호출할때
    // msg.data가 비어있지 않은 경우
    fallback() payable external {
        revert();
    }

		// receive는 순수하게 이더만 받을때 작동한다.
    // msg.data가 비어있는 경우 
    receive() payable external {
        revert();
    }
}
  • receive: 순수하게 이더만 받을때 작동

  • fallback: 스마트 컨트렉트에 존재하지 않는 함수를 호출하거나 또는 이더를 보낼 때 fallback 함수가 디폴트로 실행된다. Solidity에서 하나의 컨트렉트는 하나의 fallback 함수를 가질 수 있다.

참고: [Solidity] fallback 함수

profile
Move fast & break things

0개의 댓글