티스토리 뷰
728x90
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.11;
contract Adder {
uint num = 0;
event log(address _caller, uint _value);
function add() public {
num += 1;
emit log(msg.sender, num);
}
}
contract Caller {
uint num = 0;
function callNow(address _CA) public {
(bool sent, ) = _CA.call(abi.encodeWithSignature("add()"));
require(sent, "Failed");
}
function delegateCallNow(address _CA) public {
(bool sent, ) = _CA.delegatecall(abi.encodeWithSignature("add()"));
require(sent, "Failed");
}
}
delegate call이 필요한 이유
Upgradable smart contract를 위해서. 스마트 컨트랙트는 한 번 배포하면 수정하지 못한다. 로직을 변경해서 새로 배포를 해야한다. 사용자 -> 컨트랙트 A -> 컨트랙트 B 순서로 호출하는 프로세스가 있다. 컨트랙트 B에서 처리하는 로직 중 일부에서 변경이 필요해 새로 배포하려고 한다. 그런데 컨트랙트 A에서 컨트랙트 B를 호출할 때 delegate call을 하지 않고 그냥 call을 했다면, 컨트랙트 B에서 변경한 값이 컨트랙트 A에 저장되는 것이 아니라 B에 저장될 것이다. 컨트랙트 B에 값이 저장된다는 것은 컨트랙트 B에 종속되어 업그레이드한 로직을 배포하지 못하고 계속 컨트랙트 B를 사용해야 한다는 것이다. 따라서 이렇게 업그레이드가 필요한 경우를 대비하여 컨트랙트 A에서 컨트랙트 B를 호출할 때는 delegate call을 사용하고 값들을 컨트랙트 A에 저장해야 한다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- caver-js
- 앱 아이콘
- Upgradeable Contracts
- caver.js
- ERC721
- ethers.js
- web3
- metamask-extension
- Truffle
- class
- 이더리움
- 블록체인
- nft
- 스마트 컨트랙트
- eslint
- erc20
- interface
- swr
- Call
- Flutter
- web3-token
- Hardhat
- ganache
- JWT
- 블록 탐색기
- Proxy Pattern
- typescript
- web3.js
- avalanchego
- Android
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함