개발하기좋은날

Fallback, Receive 그리고 재진입 공격 본문

BlockChain

Fallback, Receive 그리고 재진입 공격

devbi 2022. 10. 30. 15:37
반응형

Fallback, Receive 함수에 대해 알아보겠습니다 

 

Fallback

- 대비책 함수

- 무기명 함수 즉 이름이 없는 함수 

- external과 payable이 필수 

 

어떤 경우에 사용이 되는가? 

- 스마트 컨트랙트가 이더를 받을수 있게함 

- 이더를 받고 난 후 어떠한 행동을 취하게 할 수 있음

- Call 함수로 없는 함수가 불려질떄, 어떠한 행동을 취하게 할 수 있음 

 

0.6 이전 버전의 Fallback은 아래와 같이 사용 

 

function() external payable {
    
}

0.6 이후 fallback 

 

Fallback은 Recevie와 Fallback 두가지 형태로 나뉨 

 

Receive: 순수하게 이더만 받을때 작동  

Fallback : 함수를 실행하면서 이더를 보낼때, 불려진 함수가 없을 때 작동함

 

1. 불려진 함수가 특정 스마트 컨트랙트에 없을때 fallback 함수가 발동 합니다 

fallback() external {
   
 }

- 위 형태는 call(0.6.0 이후)을 통해 호출하는 컨트랙트의 함수 이름이 없을때 사용되는 형태입니다 

 

 

2. 이더를 받고  나서도 fallback 함수가 발동 

fallback() external payable {
   
}

receive() external payable{
    
}

- 위와 같이 payable을 추가해줘야한다

 

Fallback, Receive을 호출한 대상의 msg.sender는 누구일까? 

 A 컨트랙트에서 B컨트랙트로 Call 호출을 하여 Fallback, Receive 함수가 동작을 했을때 

msg.sender는 A컨트랙트로 지정되어있다

 

2019년 이스탄불 하드포크 이후 0.6.0이후 Fallback, Receive를 사용을하니 자신에게 필요한 방법을 사용하면 된다 

주의할건 단순히 이더를 전송하는 Send, Transfer 함수는 2300의 고정 gas 소모때문에 원하는 로직 구현이 힘들어 

Call을 권장하고 사용되고있다 

 

하지만 Call은 재진입 공격 문제가있어 주의가 필요하다 

 

왜 Call을 사용하면 재진입 공격문제가있는가? 

 fallback() external payable {
     emit JustFallbackWIthFunds(msg.sender, msg.value,"JustFallbackWIthFunds is called");
}

위 컨트랙트를 살펴보면 Fallback이 이벤트를 실행시킨다 

이때 호출을 하면 revert가 발생하게 된다 

send, trasfer등을 사용했을때 그래서 재진입 공격에 필요한 로직을 구성할수가없다 

 

하지만 Call은 가변길이의 가스소모를 가지고있어 재진입 공격에 필요한 로직을 구성할수있는 External Call을 할수있기 떄문에 

반드시 시큐리티 코딩이 필요하다 

 

 

 

반응형

'BlockChain' 카테고리의 다른 글

이더리움의 MEV (Maximal Extractable Value)  (0) 2022.12.07
스마트 컨트랙트 시큐리티 패턴  (0) 2022.11.02
재진입 공격 방지 (Re-Entrancy)  (0) 2022.10.28
External Call 보안  (0) 2022.10.28
채굴 (Mining)  (0) 2022.10.17
Comments