상세 컨텐츠

본문 제목

솔리디티 강좌 37강 - call Vs delegate call

솔리디티 깨부수기 - 기본

by D_One 2021. 10. 6. 10:11

본문

 


유튜브를 통해, 쉽고 간편하게 이해 해보아요!

https://youtu.be/NnZ0KOy2yJY

구독/좋아요 해주셔서 감사합니다 :) !!


안녕하세요

오늘은 delegate call 에 대해서 알아 보겠습니다.

 

먼저 delegate call을 알기 위해서는 call 와 delegae call 의 차이점을 아는것이 중요합니다. 

 

Call Vs Delegate call

 

Call

스마트 컨트랙 A 안에 있는 call 을 통하여, 스마트 컨트랙 B의 함수를 부른다고 하였을때, 

스마트 컨트랙 A 와 스마트 컨트랙 B의 msg.sender 는 다릅니다. 

그 이유는 , Alice 라는 주체가 스마트 컨트랙 A를 불렀기때문에 스마트 컨트랙 A의 msg.sender 는 Alice의 주소가 됩니다. 그에 반해, 스마트 컨트랙 B의 msg.sender는 Alice의 주소가 아니라, 스마트 컨트랙 A의 주소가 나옵니다.

이유인즉슨,  Alice 때문에 스마트 컨트랙 B가 결과적으로 불려졌다고 해도, 스마트 컨트랙 A에 있는 call이 실질적으로 스마트 컨트랙 B의 함수를 부른거기 때문에 스마트 컨트랙B의 msg.sender는 스마트 컨트랙 A의 주소가 나옵니다.  

 

더 나아가서, 스마트 컨트랙 A가 부른 스마트 컨트랙 B의 함수가 num 이라는 변수의 값을 3에서 5로 변경한다면, num의 값은 당연히 5가 될것이고, 그리고 num = 5 는 스마트 컨트랙 B에 저장이 될 것 입니다.

 

그러면 간단히 정리해서 3가지 정도를 알 수 있네요. 

1. 스마트 컨트랙 A의 msg.sender 는 Alice 의 주소

2. 스마트 컨트랙 B의 msg.sender 는 스마트 컨트랙 A의 주소

3. 스마트 컨트랙 B의 num은 5로 변경되고, num=5라는 것은 스마트 컨트랙B 에 저장이된다. 

 

Delegate call

delegate call은 call 과 크게 2가지 다름점들이 눈에 띄는 것을 볼 수 가있습니다. 

1. 스마트컨트랙 B의 msg.sender는 스마트 컨트랙 A 주소가 아니라, Alice의 주소 이다. 

2. 스마트 컨트랙 B의 함수가 불려서, num의 값은 5가 됬지만, 정작 num=5라는 것은 스마트컨트랙 A에 저장이되어있고, 스마트 컨트랙B의 num의 값은 그대로 3이다. 

 

즉 delegate call은 스마트 컨트랙 B의 함수를 스마트 컨트랙 A에 옮겨놓은것 처럼 행동합니다. 

쉽게 말하자면, 스마트 컨트랙 A는 껍데기이고, 스마트 컨트랙 B는 주요 함수들을 갖고 있는 핵심이라 할 수 있겠습니다. 

 

자 그러면 다시 생각해보자면, 스마트 컨트랙 B 함수들을, 스마트 컨트랙 A에서 delegate call 로 불리면, 스마트 컨트랙 A의 변수들의 값이 영향을 받으니 당연히, 스마트 컨트랙 A는 스마트 컨트랙 B와 같은 변수들이 있어야겠죠. 

 

그러면 왜 delegate call 이 필요할까요?

 

예를들어서, 저희는 스마트 컨트랙 A 와 스마트 컨트랙 B를 배포 하였습니다.

물론 스마트컨트랙 A에서 스마트 컨트랙 B를 delegate call로 부르고 있습니다. 

그러다가, 어느날 num = 5 를 변경하는 함수가, num = 10 으로 변경해야 한다고 합니다. 

 

그런데, 문재는 스마트 컨트랙이 이미 배포된 이상, 블록체인에 올라간 이상 스마트 컨트랙을 바꿀수 없단 말이죠... 

그렇다면, 바꿀수 없으니 아예 그냥 새롭게 스마트 컨트랙 A와 스마트 컨트랙 B (num=10 함수 수정후)를 재배포 해도 되겠죠? 그런데 문제는 재 배포를 한다면, 기존에 사용하던 고객들의 정보는 초기화가 되버겠네요? 그렇다고 기존 스마트컨트랙에 쌓인 정보들을 블록체인에서 싹다 긁어 와서 넣기도 그렇단 말이죠. 그리고, 무엇보다도 스마트 컨트랙 A와 B의 주소도 변경이 된단 말이죠. 

 

그렇게 때문에, 저희는 delegate call 을 써서 이 문제점을 해소 할 수 있답니다. 

즉, 스마트 컨트랙 A는 껍데기니까, 스마트 컨트랙 B의 주요 로직을 변경해서 새로운 스마트 컨트랙 B`로 배포를 하는것 입니다. 그리고 기존의 스마트 컨트랙 A의 delegate call의 주소를 스마트 컨트랙 B -> 스마트 컨트랙 B`으로 변경해주면 num=10인 함수를 쓸 수 있겠죠. 

 

즉, 이렇게 한다면, 데이터는 스마트 컨트랙 A에 저장이 되니까, 스마트 컨트랙A를 새로 배포해준게 아닌거니까 데이터를 보전 할 수 있겠죠, 그리고 유저는 스마트 컨트랙 A를 통해서 상호작용을하니 스마트 컨트랙 A의 주소가 바뀌지 않앗으니 유저가 신경쓸 필요는 없겠죠. 

 

저희는 이거를 upgradeble smart contract framework 이라 합니다. 

 

영상과 함께 꼭 보시기를 바랍니다. 

관련글 더보기