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 {
// ...
}
external
과 payable
식별자가 필요하다.아래 예제로 작성된 컨트랙트 주소(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();
}
}