728x90
Fallback과 Receive함수는 둘 다 이더를 전송 받을 때 사용되는 함수이다.
그러나 두 함수에 몇가지 차이점도 있고 헷갈리는 부분이 있어 정리할려 한다.
공통점
- 상대방이 이더를 전송해서 내 컨트랙트에서 이더를 받을 때 실행된다.
차이점
순수하게 이더만 전송할때는 Receive()
이더와 데이터를 포함하여 전송 또는 잘못된 함수를 호출할때 Fallback()함수가 호출된다.
예를 들어,
contractAddress.call{value: 1 ether}();는 Receive함수를
contractAddress.call{value: 1 ether}("someData");는 Fallback 함수를 호출한다.
다만, 순수하게 이더만 전송할 때, Receive함수가 없고 Fallback 함수만 있으면 Fallback함수만 실행된다.
만약, 두 함수 둘 다 있을 경우엔 Receive함수만 호출 된다.
반대로 데이터가 있을 경우엔 Fallback함수가 없고 Receive함수만 있다 해도 Receive함수는 실행되지 않는다.
그리고 Fallback은 잘못된 함수를 호출할 때도 실행되는데
예를 들어,
contractAddress.call(abi.encodeWithSignature("nonExistentFunction()"));
와 같이 존재하지 않는 함수를 호출할 경우에도 Fallback함수가 호출 된다.
Receive함수는 반드시 external payable로 선언해야 하지만
fallback함수는 external이 필수, payable이 선택적이다.
만약 payable로 안하고 이더를 보낼 경우 트랜잭션은 실패한다.
728x90
반응형