티스토리 뷰
728x90
v0.6 이전의 fallback 기능을 v0.6 이후 fallback과 receive 함수가 나누어 가진다. 컨트랙트가 이더를 수신하면 fallback 함수가 실행된다. fallback 기능이 없으면 이더가 거부된다. transfer나 send를 통해 이더를 받아 fallback()이 실행되었으면 2300 가스 내의 기능만 fallback에서 구현할 수 있다. 예를 들어 스토리지에 접근하는 기능을 구현하기에는 가스가 부족할 것이다.
fallback(v0.6 이전)
대비책이라는 의미로 아래와 같은 특징을 갖는다.
- 이름이 없는 함수
- external 키워드 필수
- payable 키워드 필수
사용 이유
- 컨트랙트가 토큰을 받기 위해서
- 토큰을 받은 후 특정 행동을 취하기 위해서
- call()로 존재하지 않는 함수가 호출되었을 때 행동을 취하기 위해서
receive(v0.6 이후)
v0.6 이후 fallback은 fallback과 receive로 나눌 수 있다.
컨트랙트가 토큰을 받고 특정 행동을 취하기 위해서 사용
fallback(v0.6 이후)
call()로 존재하지 않는 함수가 호출되었을 때 행동을 취하기 위해서 사용. payable 키워드는 필수가 아니라 옵션
// ~v0.6
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.11;
// contract Bank {
// event fallback1(addreess _from);
// event fallback2(address _from, uint256 _value);
// // ~ v0.6
// function() external payable {
// emit fallback(msg.sender, msg.value)
// }
// }
// v0.6 ~
contract Bank {
event fallback1(address _from);
event fallback2(address _from, uint256 _value);
fallback() external {
emit fallback1(msg.sender);
}
receive() external payable {
emit fallback2(msg.sender, msg.value);
}
// fallback() external payable {
// emit fallback2(msg.sender, msg.value);
// }
}
contract Person {
function depositWithSend(address payable _bankCA) public payable {
bool sent = _bankCA.send(msg.value);
require(sent, "Failed");
}
function depositWithTransfer(address payable _bankCA) public payable {
_bankCA.transfer(msg.value);
}
function depositWithCall(address payable _bankCA) public payable {
// ~ v0.7
// (bool sent, ) = _bankCA.call.value(msg.value)('');
(bool sent, ) = _bankCA.call("");
require(sent, "Failed");
}
function callFallback(address _bankCA) public {
// ~ v0.7, 존재하지 않는 함수 호출
(bool sent, ) = _bankCA.call("call nonexistent function");
require(sent, "Failed");
}
function callFallback2(address payable _bankCA) public payable {
// ~v0.7, 존재하지 않는 함수 호출 + 이더 전송
// (bool sent, ) = _bankCA.call.value(msg.value)("call nonexistent function");
// require(sent, 'Failed');
// v0.7 ~
(bool sent, ) = _bankCA.call{value: msg.value}("call nonexistent function");
require(sent, 'Failed');
}
}
'블록체인 개발 > Solidity' 카테고리의 다른 글
interface (0) | 2022.01.02 |
---|---|
call (0) | 2022.01.02 |
send, transfer, call (0) | 2022.01.02 |
에러 핸들링(require, revert, assert) (0) | 2022.01.01 |
문자열 비교 (0) | 2022.01.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- ERC721
- Flutter
- typescript
- 이더리움
- caver-js
- web3-token
- metamask-extension
- web3
- 앱 아이콘
- ganache
- Truffle
- Call
- nft
- Hardhat
- interface
- web3.js
- JWT
- ethers.js
- erc20
- avalanchego
- swr
- 스마트 컨트랙트
- Android
- eslint
- Proxy Pattern
- caver.js
- 블록체인
- class
- 블록 탐색기
- Upgradeable Contracts
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함