2주 전에 ERC20에 대해 배우고 이를 통해 간단한 토큰을 만들어보는 실습이 있었다. 그 당시에는 어려운 이론들과 그것을 빠르게 받아들이지 못하는 나의 머리에 좌절하며 멘탈이 상당히 좋지 않았고.. 지금도 사실 그리 좋지는 못하다. 그래서 지금까지도 토큰 만들기 실습을 제대로 성공하지 못하고 있었는데 그래도 이렇게 포기할 수는 없으니 다시 한 번 멘탈을 다잡고 코드를 들여다보았다..
기본 ERC20에 잔액 계산 도중 오버플로, 언더플로가 나지 않도록 해주는 SafeMath 함수와 특정 함수를 관리자만 사용할 수 있도록 설정하는 OwnerHelper 함수, 토큰에 락을 걸었다 풀었다할 수 있는 함수를 추가하며 이것저것 살펴볼 수 있는 기회였다.
처음에는 컨텐츠에 있는대로 SafeMath, OwnerHelper, TokenLock까지 모조리 따라적어놓고 한꺼번에 코드를 읽으려고 했는데, 그래서 그런지 코드를 제대로 이해하지 못해서 많이 헤맸다. 그래서 다시 처음으로 돌아가 가장 기본 코드만 둔 상태에서 차례대로 수행해보았다. 또 토큰이 제대로 배포되고 함수들이 제대로 작동하게 하기 위해서는 직접 일부분을 수정할 필요가 있었다.
SafeMath나 OwnerHelper까지는 큰 어려움이 없었다. 그래서 가장 고생했던 TokenLock 부분을 위주로 정리해보려한다.
우선 아래는 내가 작성한 토큰 락과 관련된 코드이다.
여러차례 테스트해보며 알게 된 점이, mapping으로 생성한 _personalTokenLock은 직접 초기화시켜준 값이 아니라면 항상 false로 나온다는 것이었다. 그러니까 만약 주소가 'a'인 사용자가 처음 해당 토큰 거래에 참여하면 _personalTokenLock['a'] 값이 false로 설정되어 전체 토큰 락만 풀어주면 거래가 가능한 것이었다. 나는 이점이 마음에 들지 않아 처음 참여하는 사람은 토큰이 잠겨있도록 하고 싶었다. 그래서 특정 주소가 이 토큰에 어떠한 활동을 한번이라도 했는지를 체크할 수 있도록 mapping을 하나 더 생성했다. 그것이 _personalParticipate이다. 처음에는 똑같이 false로 초기화될 것이고, 개인 토큰 락 상태를 변경하는 함수나 토큰 전송을 수행하면 true로 바뀌도록 하면서 전체 락과 개인 락을 모두 풀어야 거래가 가능하도록 설정해주었다.
주용토큰 JYT를 발행한 직후 관리자'a'와 일반 사용자'b'가 해당 토큰을 주고 받으려는 상황으로 다시 정리를 해보면, 토큰 전체 락이 걸려있고, a와 b의 _personalTokenLock 도 false, _personalParticipate 도 false 값을 가진다.
테스트해본 기록이 아래에 남아있다..
https://ropsten.etherscan.io/address/0x03562f24186FF349Aa8795070E0Ad972a19D1cA9
테스트는 test1, test2 계정 2개로 다음과 같이 진행했다.
1. JYT 배포 직후 test1에서 test2로 JYT 토큰 전송 (실패)
2. 전체 토큰 락 해제 후 test1에서 test2로 JYT 토큰 전송 (실패)
3. 전체, 1번 토큰 락 해제 후 test1에서 test2로 JYT 토큰 전송 (실패)
4. 전체, 1,2번 토큰 락 해제 후 test1에서 test2로 JYT 토큰 전송 (성공)
5. 다시 1번 락 후 test1에서 test2로 JYT 토큰 전송 (실패)
6. 다시 전체 락, 1,2번 해제 후 test1에서 test2로 JYT 토큰 전송 (실패)
아래는 코드 전체.. 프로젝트 전체는 아니고 메인 코드만 올렸다..
https://github.com/be-kid/JYToken
나름대로 머리를 굴려 이렇게 토큰을 잠궜다 풀었다 할 수 있도록 만들기는 했지만 사실 이게 잘 수행한 것인지는 모르겠다. 문법도 잘 몰라 많은 검색과 시행착오를 겪으며 겨우 이만큼은 해냈다.. 그래도 2주간 가슴 속에 꽉 막혀있던 응어리가 조금은 풀린 기분이 들기도 했다... 죽으라는 법은 없나보다..(?) 다른 고수분들은 어떻게 해결했을지도 많이 궁금하다.