관리 메뉴

멍개의 연구소

[ethereum] Token, ICO 1편 - 동작과정 본문

블록체인

[ethereum] Token, ICO 1편 - 동작과정

멍개. 2022. 8. 27. 15:16

Token과 ICO에 대해서 알아보겠습니다.

 

Token과 ICO는 2편에 걸쳐서 설명할 예정입니다. 1편 에서는 Token을 발행한 후 ICO까지 하는 과정을 설명합니다. 2편에서는 토큰과 ICO 컨트랙트 코드를 작성해봅니다.

해당 내용은 일주일간 삽질한 과정을 정리한 내용입니다.

개발환경
컨트랙트 작성 + 배포 => remix
지갑 => metamask(크롬 확장프로그램)

1. 토큰 발행 원리

토큰 컨트랙트를 이용하여 토큰을 발행하게 되면 토큰 컨트랙트 주소가 생성이 되고 발행된 토큰은 발행자가 가지고 있게 됩니다.

토큰 발행 시 토큰 발행량, 토큰 이름을 설정할 수 있습니다. 코드에는 Decimal이라는 변수가 보입니다. 코드에 대한 부분은 2편에서 설명을 하지만 Decimal 부분만 짚고 넘어가겠습니다.

Decimal이 1이면 1은 10으로 표현합니다. 이렇게 표현하는 이유는 소수점을 정수로 표현할 수 있기 때문입니다. 예를 들어 0.1을 표현하려면 원래는 0.1로 저장을 하지만 Decimal이 1인 컨트랙트에서는 1로 표현이 가능합니다. 정수와 실수는 메모리에 저장되는 방식이 다릅니다. 정수가 실수보다 더 적은 메모리 공간을 사용하기 때문에 복잡하지만 Decimal이 존재합니다. 참고로 이더리움은 Decimal이 18입니다. 1 ETH를 표현하기 위해서는 1000000000000000000으로 표현됩니다.

토큰이 발행되면 개인 지갑과 etherscan에서 확인 가능합니다.

· 토큰 생성 - etherscan 확인

Total Supply는 총 얼마나 발행했는지 표시되는 부분입니다. ICO를 할 때 일반적으로 Decimal은 8로 설정한다고 합니다.(컨트랙트 코드를 짜고 테스트를 했을 때는 왜 8로 했는지 깨달았는데 정리하려고 하니깐 갑자기 생각이 안 나네요.... )

Holder 부분에 누가 얼마나 토큰을 가지고 있는지 떠야 하는지 반응이 느린 건지 원래 잘 안 뜨는 건지 확인이 필요한 부분입니다.

· 토큰 생성 - 지갑 확인

토큰을 10만 개 발행했고 발행자인 이더 계정은 10만 개의 토큰을 보유합니다.

2. ICO 원리

토큰을 생성했으면 ICO 컨트랙트를 이용하여 발행된 토큰을 팔 수 있습니다.

ICO를 하기 위해서는 먼저 ICO를 생성해야 합니다. 그리고 생성된 토큰을 ICO 컨트랙트에 전송을 하여 다른 사람들에게 토큰을 나눠줄 준비를 해야 합니다.

· ICO 생성 - ABI 확인

컨트랙트 생성 Transaction이 확정됐으면 remix에서 컨트랙트 주소를 알 수 있습니다. 그리고 ABI에서 파란 버튼들을 누르면 해당 컨트랙트의 정보를 가져올 수 있습니다.

ICO 컨트랙트를 발행할 땐 ICO 세일즈 끝난 후이더를 받을 주소, 총 판매량, 판매시간(분단위), 1이 더 당 가격, 토큰 컨트랙트 주소를 이용하여 컨트랙트를 생성합니다.

· ICO 생성 - etherscan 확인

etherscan에서 해당 컨트랙트의 정보를 볼 수 있습니다. 생성됐을 땐 토큰이 보유되어있지 않습니다.

· 토큰 전송 ABI 호출

토큰 컨트랙트 ABI인 transfer를 이용하여 ICO 계정에 토큰을 전송합니다.

· 토큰 확인 - ICO

etherscan에서 ICO 컨트랙트의 주소를 이용하여 조회를 하면 Token Balances를 확인할 수 있습니다. 저번 주에 삽질할 때랑 UI가 바뀌었네요

· 토큰 확인 - ICO

etherscan에서 토큰을 확인하면 Token Holder에 누가 얼마만큼 토큰을 보유하고 있는지 알 수 있습니다.

· 토큰확인 - ICO

토큰을 전송하면 토큰 컨트랙트를 발행한 주소에서 전송합니다.

3. ICO 토큰 판매

ICO를 생성한 후 토큰을 전송하여 토큰을 판매할 준비를 마쳤습니다. 이제 ICO 컨트랙트 주소로 이더를 전송하면 토큰을 받을 수 있습니다.

· 토큰 구매

ICO 주소로 이더를 전송하면 토큰을 받을 수 있습니다.

(스샷을 실수로 잘못 찍어서 토큰 사기 전에 사진을 못찍어서 다시 찍으려고 하니깐 이미 Transactio 완료되어 1ETH 차감된 상태 원래 4이더있었는데 구매완료되서 3이더가  상태)

· 토큰 구매 - ICO 확인 Transaction

ICO 주소가 보유 중인 이더는 증가되고, Token Balances는 차감됩니다. 여기서는 1이 더 당 1 Token으로 비율 설정되어 1 Token이 차감됐습니다. 이러한 비율 부분은 컨트랙트 코드 작성 시 설정 가능 한 부분입니다.

· 토큰 구매 - ICO 확인 Token Transfer

Token Transfer에서는 토큰이 in/out을 확인할 수 있습니다.

· 토큰구매 - 토큰 확인

etherscan에서 토큰을 확인해보면 Token Holders에 변화가 일어납니다. ICO가 500을 가지고 있었는데 1 차감되고 구매한 계정이 1 가지고 있습니다.

· 토큰구매 - 구매자 지갑 확인

지갑을 확인하면 토큰 1개를 가지고 있습니다.

· 토큰구매 - ICO ABI로 남은 토큰량, 이더량 확인

amountRaised 쌓인 이더량,이더는 decimal 18임. , 1이더가 쌓임. 

getLeftToken 남은 토큰량 decimal 8이므로 499 남아있습니다.

4. 세일즈 종료

ICO 기간이 끝나서 세일즈가 종료된다면 ICO 컨트랙트에 남은 토큰은 토큰 컨트랙트로 돌려주고 쌓인 이더는 초기에 등록한 주소로 전송을 해주어야 합니다. 그리고 컨트랙트에서 ABI는 스스로 호출이 불가능하기 때문에 세일즈가 종료된것을 알려주어야 합니다.

여기서는 테스트를 하기위해 토큰 전송 부분과 이더 전송 부분을 독립적으로 구현했지만 실제로는 세일즈 종료 ABI를 호출하면 즉시 토큰과 이더를 전송하도록 하면 됩니다. 이 부분은 2편에서 직접 코드를 보면서 확인해보겠습니다.

· 세일즈 종료 ABI 호출 - ICO ABI 확인(토큰)

ICO ABI중 OnlyTokenRetire이 토큰 환급합니다.
OnlyTokenRetire를 호출후 해당 Transaction이 컨펌된 후 getLeftToken으로 확인하면 남은 토큰이 0이 됩니다.

· 세일즈 종료 ABI 호출 - ICO 확인(토큰)

ICO에 있던 모든토큰이 컨트랙트 주소를 빠져나가 토큰 컨트랙트 주소로 옮겨졌습니다. IN은 토큰이 들어온것이고, OUT은 토큰이 빠져나간 것 입니다.

· 세일즈 종료 ABI 호출 - 토큰 확인(토큰)

etherscan에서 토큰을 확인하면 ICO가 499개를 가지고 있었는데 토큰 컨트랙트 주소가 499개를 가지고 있다고 바뀌었습니다.

· 세일즈 종료 ABI 호출 - ICO ABI 확인(이더)

ICO ABI중 OnlyEthRetire 이더 환급 ABI입니다
OnlyEthRetire 컨펌된  amountRaised 확인하면 0이더가 남아있음

· 세일즈 종료 ABI 호출 - ICO 확인(이더)

ICO 컨트랙트가 가지고 있는 모든 이더를 ICO 생성시 등록한 주소로 전송합니다.

· 세일즈 종료 ABI 호출 - 이더확인

7이더를 가지고 있었는데 8이더로 증가했습니다.

여기서는 이더와 토큰 환급을 분리했지만 실제로는 하나로 합칩니다. 세일즈 종료버튼을 누르면 두개의 기능을 모두 실행하면 됩니다.

5. 토큰소각

토큰을 소각할 땐 토큰 컨트랙트로 토큰을 없애버리는 ABI를 호출하면 끝입니다. 머 그냥 수치만큼 마이너스(-)만 하면됩니다.

· 토큰 소각 - 토큰 ABI 호출

토큰 ABI중 b가 소각 ABI
소각 ABI에서는 얼마만큼의 토큰을 소각할지 인자로 전달합니다

· 토큰 소각 - 토큰 ABI 확인

토큰 ABI에서 balanceOf를 이용하면 해당 주소가 얼마만큼의 토큰을 가지고 있는지 알 수있습니다. 10개를 소각했기 때문에 실제 수치는 1000000000입니다. Decimal이 8이므로 0이 8개 붙습니다

· 토큰 소각 - 토큰확인

해당 소각기능은 전체 발행량도 같이 줄여줌

(추가적으로 etherscan에서 토큰 Holder 적용이  느린건지 원래  안뜨는 건지 확인중)

해당 컨트랙트에서는 토큰 소각시 전체 발행량도 같이 줄여주었습니다. 물론 이 부분도 만들기 나름입니다.

개인적으로 추측을 하는 부분은 토큰을 전송하는건 Transaction이 이루어지지 않아서인가? 라는 생각을 해봄.

6. 토큰 추가발행

토큰 발행 후 사용하다보면 추가발행이 필요할 수 있습니다.

발행자는 토큰에있는 추가발행 ABI를 호출합니다. 그럼 토큰 컨트랙트는 발행자에게 생성된 토큰을 전달합니다.

· 토큰 추가발행 - 토큰 ABI 호출

addPublish ABI를 이용하여 토큰을 추가발행 합니다. 이때 얼마만큼 발행할지 인자를 전달합니다.
totalSupply로 토큰이 얼마나 발행됬나 확인가능 합니다.

· 토큰 추가발행 - 토큰 확인

전체 발행량이 늘어났습니다. Holder에도 발행자의 토큰이 늘어나야 되는데 앞에서 말했다시피 해당 부분만 잘 안됩니다. 하지만 토큰은 정상적으로 추가 발행되어있습니다.

· 토큰 추가발행 - 개인지갑 확인

개인지갑을 통해서 확인하거나 토큰 ABI에 있는 balanceOf를 이용하면 토큰을 확인할 수 있습니다. 추가 발행한 만큼 정상적으로 늘어나 있습니다. 만약 ICO에 토큰이 부족하다면 토큰 ABI에 있는 transfer를 이용하여 추가적으로 더 넣어주면 됩니다.

여기까지 ICO와 Token에 대한 전반적인 흐름에 대한 설명을 마치겠습니다. 2편에서는 이것을 직접 구현을 해보도록 하겠습니다.

코드를 먼저 보지않고 이것을 먼저 본 이유는 코드먼저 보면 더 해깔려서 전체적으로 어떤식을 동작하는지 이해하는게 좋지않을까 해서 코드보다 전체적인 흐름을 먼저 설명했습니다.
저는 처음에 어떤식으로 동작하는지 모르고 코드부터 만져서 일주일동안 너무많은 삽질을 했습니다 ㅠ.ㅠ

Comments