[Solidity] receive function

bolee·2022년 12월 17일
0

솔리디티(Solidity)

목록 보기
6/8
post-thumbnail
post-custom-banner

receive function

solidity는 0.6.0 버전 이후로 fallback 함수가 receive와 fallback으로 나뉘어졌다.
0.6.0 버전 이전의 fallback 함수는 이더를 보내거나 받을 때 실행되지만 0.6.0 버전 이후의 fallback 함수는 이더를 보낼 때 실행되고, 이더를 받을 때는 receive 함수가 실행된다.
즉, 하나의 기능을 세분화시켜 두가지로 나누어 놓은 것으로, 여기에서는 0.6.0 버전 이후의 fallback 함수에서 분화된 receive 함수를 소개할 것이다.

컨트렉트의 호출 함수가 확인되지 않을 때, 함수에서 이더를 보낼 때(transfer) 디폴트 함수로 동작하는 fallback 함수와는 다르게 receive 함수는 오직 이더를 받을 때 디폴트 함수로 실행된다.

선언 형태

receive 함수는 다음과 같은 형태로 선언된다.

receive() external payable {
	// ...
}

특징

  • externalpayable 식별자가 필요하다.
  • 각 컨트렉트는 하나의 receive 함수를 선언할 수 있다.
  • 함수는 파라미터를 가질 수 없다.
  • virtual 식별자를 사용할 수 있으며, override가 가능하다.

예제

아래 예제로 작성된 컨트랙트 주소(CA)로 사용자 지갑(EOA)에 있는 이더를 전송하면, 컨트렉트는 receive 함수를 호출할 것이다.

//SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

contract FunctionsExample {

    mapping(address => uint) public balanceReceived;

    function receiveMoney() public payable {
        assert(balanceReceived[msg.sender] + msg.value >= balanceReceived[msg.sender]);
        balanceReceived[msg.sender] += msg.value;
    }

    function withdrawMoney(address payable _to, uint _amount) public {
        require(_amount <= balanceReceived[msg.sender], "not enough funds.");
        assert(balanceReceived[msg.sender] >= balanceReceived[msg.sender] - _amount);
        balanceReceived[msg.sender] -= _amount;
        _to.transfer(_amount);
    } 

    receive() external payable {
        receiveMoney();
    }
}

참고 자료

post-custom-banner

0개의 댓글