본문 바로가기
솔리디티

call vs delegate call 알아보기

by gun_poo 2023. 1. 4.

회사 일에 바쁘게 치이다보니 블로그 작성을 할 힘이 남아있지않다 

공부한 것도 정리해야되는데 이걸 언제하나 싶다. 시간은 남지만 체력과 정신이 나약하다.

 

우선 콜과 딜리게이트 콜에 대하여 알아보자

 

call

기존의 call은 

스마트컨트랙트 1 안에있는 콜 함수를 통해 컨트랙트 2의 함수를 부른다고 했을때

컨트랙트 1과 2의 msg.sender가 다르게 된다.

poo라는 주체가 컨트랙1을 불렀기 때문에 컨트랙1의 msg.sender는 poo가 되고

컨트랙1이 컨트랙2를 호출했기 때문에 컨트랙 2의 msg.sender는 컨트랙 1 이 된다.

 

또한 컨트랙 1이 부른 컨트랙2의 함수가 num 이라는 변수의 값을 1 => 3 변경 시

num은 3이 되고 컨트랙 2에 저장이 된다.

 

요약

컨트랙트 1을 통해 2의 함수 호출 시 2의 storage를 변경시키며 msg.sender(호출자)는 컨트랙트 1의 주소가 된다.

 

static call

상태 변경 혹은 읽는 경우를 구분하기 위해 사용된다.

다른 컨트랙트로 리다이렉트 되는 경우에도 상태변경이 일어나지 않음을 보장한다.

delegate call

컨트랙트 2의 msg.sender는 poo의 주소이다.

컨트랙트의 2의 함수가 불려서 num의 값은 5가 되었지만 그 데이터는 컨트랙트 1에 저장이 되어있고

컨트랙트 2의 num의 값은 3으로 변함이 없다.

 

delegate call 은 컨트랙 2의 함수를 컨트랙 1에 옮겨놓은것과 같다.

생각을 해보면 컨트랙 2의 함수들을 컨트랙 1에서 delgate call로 호출하면 1의 변수 값들이 영향을 받으니

컨트랙 1은 2와 같은 변수들이 있어야한다.

 

요약

컨트랙트 1을 통해 컨트랙트 2를 호출 시 2의 storage를 변경시키지 않고 2의 코드를 1에서 실행한다.

msg.sender, value가 1에서 호출하는 것과 같고 변동 되지 않는다.

why?

delegate call을 왜쓸까

컨트랙 1과 2를 배포했다. 컨트랙 1에서 2를 delegate call로 부르고 있었다

그러다가 내부 사정으로 인해 함수변경을 해야한다고 한다.

기본적으로 한번 배포된 컨트랙트는 변경이 불가능하다.

재배포를 해도 되지만 이미 배포된 컨트랙트에서 발생한 데이터들은 사용할 수가 없다.

호환되지도 않는다. 

 

이를 delegate call로 해결가능하다

컨트랙트 1은 껍데기고 2의 주요 로직을 변경해서 새로운 컨트랙트 3로 배포하는 것이다.

기존의 컨트랙트 1의 delegate call의 주소를 컨트랙트 3으로 변경해주면 함수를 사용 할 수 있다.

이렇게 하면 "데이터"는 컨트랙트1에 저장이 되므로 보존이 가능하다. 

또한 유저는 컨트랙트 1을 이용해 통신을 하고 컨트랙트 1의 주소가 바뀌지 않으니 유저는 신경 쓸 필요가 없다.

 

이를 "upgradeble smart contract framework" 라고 한다.

 

예제

call을 할 시 매개변수로 호출하고자 하는 함수의 시그니처가 포함되어 있어야한다.

함수 시그니처는 string 타입의 함수명+매개변수 형태를 암호화(sha3(keccak256)) 해시의 앞 8바이트를 의미한다.

 

(bool check, bytes memory data) = address.call(abi.encodeWithSignature("함수명(변수타입)",매개변수값));
(bool check, bytes memory data) = address.delegatecall(abi.encodeWithSignature("함수명(변수타입)",매개변수값));
//data decode
(uint a, uint b) = abi.decode(data, (uint, uint))

취약점

 

 

자료출처: https://dayone.tistory.com/38, https://eun97.tistory.com/entry/Solidity-call-delegateCall

'솔리디티' 카테고리의 다른 글

ERC-4337 , Account Abstraction  (0) 2023.04.04
EIP-4337 이해하기  (0) 2023.03.22
솔리디티 Erc-20 토큰 기본 전문  (0) 2022.02.04
솔리디티 OwnerHelper, TokenLock  (0) 2022.02.04
솔리디티 SafeMath 이해하기  (0) 2022.02.04

댓글