본문 바로가기
Programing/Solidity

[Solidity] receive 함수

by AustinProd 2022. 3. 12.

이전 포스트에서 fallback 함수에 대해 알아보았다. 이번 포스트에서는 fallback 함수와 관련된 receive 함수를 알아보자.

 

Receive 함수

솔리디티 0.6.0 버전 이후 fallback 함수는 fallbackreceive로 나뉘어졌다. 본래 하나였던 기능이 세분화되어 두개로 분리되었다고 이해하면 된다. 해당 버전 이후 fallback 함수는 컨트렉트의 호출 함수가 확인되지 않을 때, 함수에서 이더를 보낼 때(transfer) 디폴트 함수로 동작한다. 그리고 receive 함수는 오직 이더를 받을 때 디폴트 함수로 실행된다.

 

Receive 함수의 특징

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

 

해당 함수의 구성은 위와 같으며 특징은 다음과 같다.

  • externalpayable 옵션이 필요하다.
  • 각 컨트렉트는 하나의 receive 함수를 선언할 수 있다.
  • 함수는 파라미터를 가질 수 없다.
  • virtual 옵션으로 인터페이스 적용이 가능하다.
  • override 적용이 가능하다.

 

예제 코드

아래 코드를 Remix로 옮긴 뒤 이미지를 참조해 테스트해보자. 사용자 지갑(EOA)에 있는 이더가 컨트렉트 주소(CA)로 전송되면서 컨트렉트는 receive 함수를 호출할 것이다.

 

예제 코드 실행 결과는 balanceReceived에 사용자 지갑 주소를 입력하면 전송된 이더로 보다 정확하게 확인할 수 있을 것이다.

 

    //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();
        }
    }

출처 : https://ethereum-blockchain-developer.com/028-fallback-view-constructor/02-receive-fallback-function/

'Programing > Solidity' 카테고리의 다른 글

[Solidity] Storage와 Memory  (0) 2022.03.15
[Solidity] payable 옵션  (0) 2022.03.15
[Solidity] fallback 함수  (0) 2022.03.12
[Solidity] 솔리디티 코드 연습 - 크립토 좀비  (1) 2022.03.11
[Solidity] 함수 제어자 view & pure  (0) 2022.03.11

댓글