추가 공부 [Solidity - 3, compound, MultiCall]

Lumi·2022년 2월 3일
0

Block_Chain_Project

목록 보기
28/30
post-thumbnail

🔥 Solidity - 3

🔨 Timelock

쉽게 말해서 알람시간을 정해서 특정 시간 이후에 트랜잭션을 실행시키는 것을 말합니다.

음... 좀 이해가 쉽게 현실에서 사용되는 예시를 들어보자면

특정 플랫폼에서 업데이트를 위해 공지를 띄우고 날짜를 정해 서버를 막고 업데이트 하는것과 비슷하게

Timelock을 활용하여 일정기간후에 트랜잭션을 쏘는것을 말합니다.

이외에도 오류가 발생을 하였을떄 컨트랙트를 정지시키는 기능으로도 활용 가능합니다.

이런 식으로 활용가능합니다.

처음에는 아 이런게 있구나!! 코드부터 보자! 라는 방식으로 접근을 하였는데 백그라운드 정보가 없다보니깐 함수가 왜 사용되는지에 대해서 이해를 하지 못했습니다.

그래서 따로 이론적인 내용을 학습한 후에 코드분석을 해 보았습니다.

  • 기본적인 변수, 이벤트는 다루지 않았고 함수만 다루었습니다.

setDelay

말 그대로 delay를 설정하는 함수입니다.

재미있는 부분은 require(msg.sender == address(this)) 구문이 들어가있다는 점이고

관리자가 아닌 컨트랙트가 실행을 시켜야 하는 함수 입니다.

  • 의문이 드는점은 어차피 내부에서 실행시킨다는 의미로 해당 조건문을 추가한거 같은데 그러면 public이 아닌 internal이 낫지 않나?? 라는 의문점이 남아 있습니다.

컨트랙트가 실행을 시켜야 하는 이유는 매우 간단하며 이는 중앙화 이슈를 방지하기 위함입니다.

  • 관리자를 통해서 timeLock가 변경가능하기 떄문입니다.

그러기 떄문에 관리자도 똑같은 조건으로 timeLock을 변경해야 합니다.

setpendingAdmin, acceptAdmin

단순히 admin을 바꿔주는 함수입니다.

queueTransaction

일정 시간 후에 실행시킨 트랜잭션들을 넣는 함수 입니다.

eta라는 인자값을 톹ㅇ해서 시간을 비교하는 조건문이 들어가 있습니다.

  • 왜냐하면 delay후에 실행이 되어야 하기 떄문에

특별한 작업은 하지 않고 단순히 일정시간후에 작업할 내용들을 모아두는 곳이라고 이해하면 될 것 같습니다.

target 인자 : 실행시키고자 하는 EOA,CA주소
value 인자 : 얼마만큼의 금액을 전송할지에 대한 영역
signature 인자 : 어떤 함수를 실행시킬것인가
data 인자 : 트랜잭션을 보낼떄 포함시킬 메시지
eta 인자 : 얼마만큼의 시간 이후에 실행시킬 것인가

cancelTransaction

별거없이 이후에 실행시킬 트랜잭션들을 취소할수 있는 함수 입니다.

excuteTransaction

제일 중요한 함수로 저장되어있는 트랜잭션을 실행시키는 함수 입니다.

실행하고자 하는 인자를 넘겨주게 되고 이후 해시값을 뺴온뒤에 초기화 해줍니다.

call을 통해서 트랜잭션을 실행하게 됩니다.

  • 이 부분에서 살짝 인지부조화가 왔는데 value가 중복되어 사용되고 있기 떄문입니다.
  • value는 payable함수 이기 떄문에 wei값을 말하는것 같은데... call을 통해서 함수 value를 실행시키는 것으로 보여서 이 부분을 아직 확실하게 이해를 하지 못하였습니다.

🔨 MultiCall

Defi를 경험해보신 분이라면 프론트에서 쉽게 확인가능한 화면입니다.

제공되는 서비스를 보여주는 방법이며 이러한 수치들은 모두 스마트컨트랙트에 존재하기 떄문에 한 페이지를 작성하기 위해서 위에있는 모든 값들을 불러와야 합니다.

일일히 불러오는 것보다는 한번에 불러오는 것이 효율적이며

가장 좋은 방법으로는 스마트 컨트랙트 자체에서 모든 정보를 가져올수 있는 함수를 만들어 사용하는 것 입니다.

  • 물론 이 방법은 코드 자체가 길어지고 새롭게 들어오는 정보가 있다면 업데이트 해야 하는 단점이 있습니다.

대표적으로 makerDao의 MultiCall코드를 살펴 보았습니다.

봐야 하는 함수는 단 한가지 입니다.

aggregate

호출하고자 하는 값들을 배열로써 한번에 내어주는 함수로 프론트에 있는 모든 값들을 해당 함수를 실행시킴으로서 받아올수 있습니다.

구조체이 있는 target이라고 하는 주소에게 callData라는 임의의 메시지를 담아서 호출을 하게 되고

그 격로가를 함수내 변수에 담고 해당 변수를 return함으로써 작동을 하게 됩니다.

이 과정을 넘겨주고자 하는 원소의 갯수만큼 반복을 합니다.

  • 실질적으로 어떠한 데이터를 전송하는지, 받는지를 눈으로 확인하지는 못해서 아 이런식으로 작동을 하는구나 라는 정도로 이해를 하였습니다.

저희가 Solidity코드를 짜다보면 단순히 값을 읽어오는 함수는 View로 선언을 하게 되지만

이 함수는 view함수가 아닙니다.

이런 이유는 매우 간단한데 함수 내부에서 실행되는 다른 함수들이 view 함수가 아니기 떄문 입니다.

  • view로 선언하려면 내부에서 실행되는 다른 함수들도 view이어야 합니다.

🔥 후기

음.. 정신없이 Solidity공부를 해나가고 있습니다.

youtube나 github, google을 주로 활용해서 공부를 하고 있으며

다음에는 Uniswap에 대해서 좀더 심도있게 다뤄볼 생각입니다.

  • 이전에도 다루어 보았지만 맛보기 정도라고 생각을 하여서

이 부분은 Youtube를 참고해서 공부를 해볼것이며

얼른 Solidity공부를 끝내고 Go에 대해서 저의 새로운 언어에 대해서 공부를 하고 싶습니다!!

감사합니다~~!!!

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글