[solidity] payable, receive, fallback 이제 그만 헷갈리자!

HyeongA·2023년 5월 18일
0

Blockchain_dev

목록 보기
8/20
post-thumbnail

contract에 돈을 받기 위해서 어떻게 해야할까?
payable과 receive를 사용하면 된다.

fallback은 돈을 받는 것과는 무관한 함수이다.
다만 receive와 비슷한 특성을 가지고 있는 부분이 있다.

이것 때문에 payable과 receive를 비교할 때 항상 언급되곤 한다.

1. payable

  • 스마트 컨트랙트가 Ether를 받을 수 있도록 하는 기능이다.
  • address 변수 또는 함수에 사용된다.
  • address payable 변수명 | function 함수명() public payable{}
  • payable은 지갑 잔고를 변경시키기 때문에 가스비를 소모한다.
  • payable이 적용된 함수를 실행하면 돈이 컨트랙트로 들어온다.
  • msg.value작성한 돈을 받을 수 있다.
contract example{
	//owner는 돈을 지불받을 수 있는 address 변수임
    address payable owner; 
    // deposite 함수를 실행시, msg.value로부터 컨트랙트로 돈 받기 가능. 
    function deposite() public payable {} 	//transfer 받기 불가능
}

2. receive

  • 이더를 받을 때 별도의 작동 없이 자동으로 실행되는 함수이다.
  • receive() external payable {}
  • 타 컨트랙트에서 transfer함수 실행 시 돈을 받을 수 있다.
  • 타 컨트랙트나 사람이 돈을 보낼 때 해당 컨트랙트에 receive함수가 있어야만 돈을 받을 수 있다.
//transfeTo로부터 보낸 돈을 받을 수 있음
    contract Receive{
        receive() external payable {} 	//msg.value값 받기 불가능
    }

3. fallback

  • 호출을 하려했는데 contract안에 함수가 없을 때 fallback 반환
  • 예외처리시 사용되며, default함수(무기명 함수) 같은 개념이다.
  • fallback() external payable {}

정리해보면 다음과 같다.

내 컨트랙트에서 돈을 받기 위한 함수 실행할 때는 payable.
타 컨트랙트에서 보낸 돈을 내 컨트랙트가 그냥 받을 수 있게 하기 위해서는 receive.

receive는 내 컨트랙트 안에서 실행되는 별도의 함수가 없을 때 자동적으로 실행되는 함수인데, 이런 특징을 똑같이 가진 녀석이 fallback.

receive와 fallback의 차이점은 msg.data, msg.value의 유무로 결정된다.
msg.data가 있을 경우 => fallback()
msg.value가 있을 경우 => receive()


이해하는데 도움이 된 그림


참고자료

profile
Solidity | React | Python

0개의 댓글