#14. Token 생성에 필요한 Solidity함수 알아보기

안녕하십니까 블록체인 알려주는 남자 Ryan KIM 입니다.

이번시간에는 지난번 “아무 기능 없는 토큰만들기 포스팅”이 너무 마음에 걸려서 조금 더 기능이 있는 토큰과 함께 그 중 “함수”들이 어떤 기능이 있는지에 대해 살펴보도록 하겠습니다.

우선 지난번 아무 기능이 없는 토큰을 다시 살펴보겠습니다

기본 요건의 Token
기능 없는 토큰 복사 링크 https://gist.github.com/fromjyk/8be0499b3f0709ba04995ba8dd3039ac

하지만 우리는! 더 완벽한 코드를 복사하여 기능이 추가 된 토큰을 발행 할 수 있습니다.


코드 이해하기

기본부터 시작 해 보겠습니다. 기존에 실습했었던 MIST 혹은 remix에서 아래의 코드를 입력합니다.

주소와 잔액을 연결시켜 주는 배열
mapping이란 주소(address)를 잔액(balance)와 연결시켜주는 배열을 의미합니다.

주소는 기본 16진수의 형식이며, 잔액은 0에서 115 quattuorvigintillion범위의 정수입니다. ( * quattuorvigintillion = 10⁷⁵)

‘public’은 블록체인에 있는 모든 사람이 이 변수에 접근(액세스)할 수 있다는 것을 의미합니다. 즉, 모든 잔액이 공개 되어있어야 합니다.

이렇게 컨트랙트를 발행했다면 효과가 있을 수 있지만 유용하지는 않을 것입니다. 즉, 토큰의 잔액은 주소로 불러올 수 있는 계약이 될 수 있지만, 토큰을 만들지 않았기 때문에 동전은 0을 반환하게됩니다.

따라서 우리는 시작할 때 몇개의 토큰을 만들어 보겠습니다. 마지막 닫기 괄호 앞에 아래 코드를 추가하십시오.

2100만개 발행

MyToken 함수는 MyToken 컨트렉트와 같은 이름을 가지고 있습니다. 이것은 매우 중요합니다. 이름을 바꾸게 된다면 다른 모든 이름 또한 변경해야 합니다. 이 기능은 컨트랙트가 네트워크에 처음 업로드 될 때 한번만 실행되는 특수한 기능입니다. 이 함수의 컨트랙트 msg.sender의 잔액을 2100만 잔고로 설정합니다.

2100만은 임의로 설정한 것이므로 원하는대로 변경 가능합니다. 다만 다음과 같이 함수의 매개 변수로 제공하길 권장합니다.
총 공급량 매개변수 만들기

MIST를 사용하셨던 분들은 컨트랙트 입력 옆에 SELECT CONTRACT TO DEPLOY 부분을 눌러보면 MyToken이 생성되며 이를 누르게 되면 CONSTRUCTOR PARAMETERS가 생성됩니다.

토큰 생성기능 구성

이는 토큰에 대해 변경 가능한 매개 변수이므로 동일한 코드를 재사용하고 향후 이러한 변수만 변경이 가능합니다.현재는 토큰의 잔액을 만드는 기능만 있으며, 이동하는 기능이 없기 때문에 동일한 계정에 머물러 있어야 합니다. 이제 해당 코드를 입력해 봅시다.

코인 전송

이 코드는 매우 단순한 기능입니다. 수신자와 값을 매개 변수로 가지며 누군가가 이 값을 호출 할 때마다 ‘_value’를 자산에서 빼고 ‘_to’를 자산에 추가합니다.

하지만, 여기에는 문제가 있습니다.

우리가 보유하고 있는 이더 보다 더 많이 보낸다고 하면 어떻게 될까요?

이 특정 컨트랙트에서 부채를 처리하고 싶지 않기때문에 빠른 확인을 하고 송금자의 자금이 충분하지 않으면 계약실행이 중지됩니다. 실행되는 계약을 중간에 중지 하려면 되돌릴 수도 있고 취소 할 수 있습니다. 전자는 가스를 더 적게 사용하지만 지금까지 계약에 대한 변경 사항은 유지되므로 굉장히 골치아프게 됩니다.

반면에 후자는 모든 계약 집행을 취소하고 거래 할 수 있는 모든 변경사항을 되돌려 보내고 발송인은 가스로 사용된 이더를 잃게 됩니다.

하지만, 지갑에서는 컨트랙트가 유출되는 것을 감지할 수 있으므로 항상 경고메세지를 표시함으로써 이더리움이 전혀 사용되지 않도록 할 수 있습니다.

자산과 계좌를 체킹

이제 컨트랙트에 대한 몇가지 기본적인 정보들을 입력하도록 해보겠습니다. 이 작업은 토큰 레지스트리에 의해 처리할 수 있지만, 지금은 직접 컨트랙트에 입력해 보겠습니다. 컨트렌트 생성자 함수를 업데이트하여 모든 변수가 처음부터 설정되도록 하겠습니다.

토큰의 기본적인 정보 입력

마지막으로 우리는 때때로 ‘event’ 라는 것이 필요할 것입니다.

이더리움지갑과 같은 클라이언트가 컨트랙트에서 발생하는 활동을 추적할 수 있도록 도와주는 특별한 함수입니다. 이벤트의 E는 대문자로 써야하며, 계약을 시작할 때 다음 줄을 추가하여 이벤트를 선언하면 됩니다.

이벤트 선언

그리고 다음 두 줄을 “transfer”함수 안에 추가하면 됩니다.

알림

이제 다양한 함수를 추가한 토큰이 준비되었습니다.


더 향상된 기능을 갖춘 토큰

위 코드를 건드리지 않고도 ‘crypto token’을 배포할 수는 있지만, 우리는 이것을 우리에 맞게 여러 기능을 추가해 보겠습니다. 토큰에 추가할 수 있는 함수에 대한 제안을 제공하여 필요에 더 적합하게 만들어보겠습니다.

우선 ‘approve’, ‘sendfrom’등 몇 가지 기능들을 더 살펴보겠습니다.

이러한 기능은 토큰이 다른 계약과 상호 작용 할 수 있도록 도와줍니다. 토큰을 decentralized exchange,에 판매하려는 경우, 컨트랙트에서 이벤트를 읽어올 수 없으므로 거래소가 새로운 토큰이나 발송자를 알지 못하기 때문에 주소로 보내는 것만으로는 충분하지가 않습니다. 오직 함수 호출에만 사용되기 때문입니다.

따라서 컨트랙트의 경우 우리의 계좌로부터 전송할 수 있는 토큰의 양을 승인한 다음 계약을 수행하여 이 작업을 수행하도록 알리거나 승인 및 불러오기를 취해야 합니다.

이 함수들 중 많은 것들이 토큰의 전송을 재 실행해야 하기 때문에 컨트랙트 함수 자체로만 호출 할 수 있는 내부 함수로 변경하는 것이 좋습니다.

내부 함수로 변경

이제 토큰을 전송하는 모든 함수가 자체로 점검을 수행 한 다음, 올바른 매개변수로 토큰을 전송할 수 있습니다. 이 함수는 모든 계정에서 다른 계정으로 이동하는데에 있어 어떠한 사람도 권한이 없기 때문에 컨트랙트에 의해서만 호출이 됩니다.

호출하는 함수를 추가하는 경우 해당 함수가 제대로 작동 하는지(잠겨있지는 않는지) 발신자는 이동 권한이 있어야 합니다.

관리자 권한 함수

모든 dapps은 기본적으로 완전히 분산되어 있지만 원하는 경우 일종의 중앙 관리자를 가질 수 있습니다. 어쩌면 우리는 더 많은 코인을 찍어낼 수 있는 능력을 갖길 원하거나 우리 통화를 사용하는 것을 제한할 수가 있습니다.

이러한 기능 중 하나를 추가 할 수는 있지만 시작 부분에만 추가 할 수 있다는 점에서 모든 토큰 소유자는 토큰을 소유하기 전에 규정을 정확히 알아야 하는 번거로움이 있을 수 있습니다.

따라서 관리자가 필요한 부분도 필요합니다.

단순한 계좌가 될 수 있지만, 하나의 계약이 될 수 있으므로 더 많은 토큰을 만드는 것에 대한 결정은 컨트랙터에 달려 있습니다. 이것은 투표권을 행사할 수 있는 민주적 조직일 경우 또는 토큰 소유자의 권한입니다.

이를 위해 우리는 유용한 컨트랙트인 상속함수를 배우겠습니다.

상속을 사용하면 컨트랙터를 모두 재정의하지 않고도 컨트랙터의 특성을 취득 할 수 있습니다. 이렇게 하면 코드를 보다 명확하고 쉽게 재 사용할 수 있습니다. MyToken 계약을 맺기 전에 이 코드의 첫줄에 추가해야 합니다.

관리자 권한

이는 “owned : 소유” 할 수 있는 계약에 대한 일부 기능을 정의하는 것을 제외하고는 아무것도 하지 않는 매우 기본적인 컨트랙트를 생성합니다.

이제 다음 단계는 컨트랙터에 텍스트가 추가되로록 하는 것을 알아보겠습니다.

텍스트 추가

모든 MyToken의 함수가 다양한 소유자에게 접근권한을 가지며 소유자를 한정하여 접근권한을 줄 수 있습니다. 이 컨트랙터는 소유권을 이전하는 기능을 갖습니다. 시작할 때 소유자를 설정하는 것도 흥미가 있지만 소유자를 추가하는 것 또한 가능합니다.

소유자를 추가

토큰발행 기능

우리는 유통되는 코인의 공급량을 바꾸기를 원한다고 가정해봅시다.

이는 통화 보유자가 토큰 가격을 일부 통제 하기를 기대하고 순환에 필요한 토큰을 발행하거나 제거하려는 경우에도 해당 될 수 있습니다.

먼저 totalSupply를 저장하고 생성자 함수에 할당 할 변수를 추가해야 합니다.

생성자 함수

이제 소유자가 새 토큰을 만들 수 있도록 마지막으로 새 함수를 추가해 보겠습니다.

새 토큰 생성 함수

함수 이름 끝에 ‘onlyOwner’가 있습니다. 즉, 컴파일시에 이 함수를 다시 작성하여 이전에 정의한 수정 onlyOwner의 코드를 상속받습니다.

이 특정 함수는 소유자로 설정된 계정에서만 호출할 수 있습니다. 이 옵션을 소유자 한정자가 있는 컨트랙트에 추가하기만 하면 더 많은 코인을 만들 수 있습니다.

자산의 동결

‘use case’에 따라 토큰을 사용할 수 있는 사람과 없는 사람에 대한 규정이 필요할 수 있습니다. 이를 위해 컨트랙트 소유자가 자산을 고정하거나 해제 할 수 있는 매개변수를 추가할 수 있습니다.

이 함수는 컨트랙트 내 어디서든 변수와 함수를 배치할 수 있지만, 좋은 연습을 위해 다른 매핑 및 이벤트와 함께 배치하는 것을 권장합니다.
자산 동결 함수

이 코드를 사용하면 모든 계정이 기본적으로 고정 해제되지만, 소유자는 고정 계정으로 전환하여 고정 상태로 설정할 수 있습니다. 아쉽게도 우리가 전달한 함수에 어떠한 토큰도 추가하지 않았기 때문에 동결은 실제적인 효과가 없습니다. 우리는 이것을 수정해 보겠습니다.

자산 동결

이제 고정 된 계정에는 자금이 그대로 유지되지만 이동할 수는 없게 됩니다. 모든 계정은 기본적으로 고정 될 때까지 고정 해제되지만 모든 계정을 수동으로 승인해야 하는 허용 목록으로 쉽게 되돌릴 수 있습니다.

‘frozenAccount’의 이름을 ‘approvedAccount’로 변경하고 마지막 행을 다음으로 변경하십시오.
자동 승인

자동 판매 & 구매 함수

지금까지 효용과 신뢰를 토대로 토큰의 가치를 평가했습니다. 하지만, 원하는 경우 자동으로 판매하고 시장가치로 구매하는 펀드를 만들어서 토큰의 가치를 이더 혹은 다른 토큰으로 만들 수 있습니다.

먼저 구매 및 판매 가격을 설정해 보겠습니다.

구매 및 판매 가격 설정

이것은 자주 변동되지 않는 가격에는 받아 들여질 수 있습니다. 왜냐하면 모든 가격변화는 우리가 거래를 실행하고 약간의 이더를 소비하도록 요구할 것이기 때문입니다.

변동 가격을 일정하게 유지하려면 표준데이터 피드를 조사하는 것이 좋습니다.

다음 단계는 구매 및 판매 기능을 만드는 것입니다.
구매 및 판매 기능 함수

이것은 새로운 토큰을 생성하지는 않지만, 컨트랙터가 소유한 자산은 변경됩니다.

이 컨트랙터는 자체 토큰과 Ether 및 계약 소유자를 모두 포함 할 수 있습니다. 이 컨트랙터는 자금을 이동할 수있는 유일한 방법은 코인을 판매하고 구매하는 것입니다.

NOTE : 구매 및 판매 “가격”은 이더에서는 설정되지 않지만 시스템의 최소 통화(유로 및 달러의 센트 또는 비트 코인의 사토시와 같습니다) 하나의 에테르는 1000000000000000000 wei입니다. 따라서 Ether에서 토큰 가격을 설정할 때 끝에 18 개의 0을 추가하십시오.

컨트랙트를 작성할 때 충분한 Ether을 보내 시장에 있는 모든 토큰을 구입하지 않으면 계약이 취소되고 사용자가 토큰을 판매할 수 없게 됩니다.

따라서 우리는 자동리필 함수를 다뤄볼 필요가 있습니다.

자동리필

매번 Ethereum에 거래를 할 때마다 스마트 계약의 결과를 계산할 마이너에게 수수료를 지불해야합니다. 이것은 나중에 바뀔 수도 있지만, 현재 수수료는 이더리움에서만 지불 될 수 있으므로 모든 토큰 사용자에게 이러한 것이 필요합니다. 이를 수행하려면 우선 임계값을 유지하는 변수와 이를 변경하는 함수를 만들어야합니다.

값을 모르는 경우 5 finney (0.005 에테르)로 설정하십시오.

자동 리필 함수

그런 다음 송신자가 환불되도록 전송 함수에 다음 줄을 추가하십시오.

환불

또한, 발신자가 수신자에게 수수료를 지불하도록 변경할 수도 있습니다.

수수료 지불

이렇게 하면 토큰을 받는 계좌에 수수료를 지불하는 데 필요한 이더보다 적은 돈이 들지 않습니다.

작업증명(pow)

코인에 대한 공급을 수학공식과 연결시키는 방법에는 몇 가지가 있습니다. 가장 간단한 방법 중 하나는 Ethereum에서 블록을 발견 한 사람은 누구나 해당 블록에서 보상 기능을 호출하면 코인으로 보상을 받을 수 있습니다.

블록을 찾은 마이너를 지정하는 특수 키워드는 coinbase를 사용하여 이 작업을 수행할 수 있습니다.

마이너를 지정하는 특수 키워드

또한 수학 공식을 추가하여 계산을 할 수 있는 사람이라면 누구나 보상을 받을 수 있도록 추가 할 수 있습니다. 이 다음 예제 에서는 현재 도전의 3차 루트를 계산해야 하고 다음 도전을 설정할 수 있는 권한을 얻습니다.

3차 루트 계산 예제

물론, 루트를 계산하는 것은 사람의 머리로 하기가 어려울 수 있지만, 계산기로는 매우 쉽습니다. 따라서 이 게임은 컴퓨터에 의해 쉽게 깨질 수 있습니다. 또한 마지막 우승자는 다음 도전 과제를 선택할 수 있기 때문에 그들이 알고있는 것을 골라 낼 수 있으므로 다른 플레이어에게는 매우 공정한 게임이 아니게 됩니다. 가장 좋은 후보자는 도전자가 주어진 난이도 보다 낮은 해시를 찾을 때까지 여러개의 해시를 생성해야하는 해시 도전을 만드는 것입니다.

이 프로세스는 1997 년 Adam Back에 의해 Hashcash로 처음 제안 된 후 2008 년에 Satoshi Nakamoto의 Bitcoin에서 구현되었습니다.

Ethereum은 보안 모델을 위해 이 시스템을 사용하여 시작되었지만, 작업 증명 보안 모델에서 Casper라는 POS 및 베팅 시스템의 혼합으로 전환할 계획입니다.

작업증명 함수

또한 Constructor 함수 (계약서와 이름이 같고 처음 업로드 할 때 호출되는 함수)를 변경하여 이 줄을 추가하면 난이도를 변경하지 않게 됩니다.

난이도를 변경하지 않는다.

다음엔 완벽한 토큰을 한번씩 곱씹어 보도록 하겠습니다.



저와 같은 비전공자, 블록체인을 처음 접해보시는 분들, 블록체인 분야로의 진출을 고려하시는 분들을 위해 같이 공부하고 알아가기 위해서 글을 쓰기 시작해보려고 합니다.

또한, 같이 블록체인 공부하여 논의하는 취지로 만든 카카오톡 방에 들어오셔서 blockchain, ICO, 투자 등 다양하게 논의했으면 합니다. : )

(비밀번호:lb0808)