일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- External Call
- Mining
- 분산원장
- 재진입공격
- 비트코인
- Report
- view 이동
- POS
- 블록체인
- ethereum
- DEFI
- .dsym
- PBFT
- pow
- dsYM
- 암호화폐
- 이더리움
- Blockchain
- viewcontroller
- Algorithm
- 알고리즘
- ios
- reentrancy
- 프로그래머스
- 백준
- DPOS
- Crash
- 블록체인 기술
- solidity
- Xcode
- Today
- Total
개발하기좋은날
Fallback, Receive 그리고 재진입 공격 본문
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 |