5주차 공부 - 1

박세연·2021년 1월 26일
0

Mastering Ethereum

목록 보기
6/10
post-thumbnail

Chapter 10. 토큰

토큰(token)

블록체인에서 관리되는 '토큰'은 소유할 수 있고, 자산, 화폐 혹은 접근 권한 등 블록체인 기반의 추상화된 의미로 재정의된다.
물리적인 토큰은 쉽게 교환할 수 없고, 일반적으로 하나의 기능을 가지며 특정 비즈니스 혹은 사용에 제한되는 경우가 많지만, 블록체인 토큰을 사용하면 이러한 제한을 없애거나 새로 재정의할 수 있다.

토큰은 어떻게 사용되는가?

  • 화폐(currency)
    토큰은 사적인 트레이딩으로 가치가 결정되는 화폐의 한 형태로 작동할 수 있다.

  • 자원(resource)
    토큰은 공유 경제 또는 자원 공유 환경에서 획득되거나 생산된 자원을 나타낼 수 있다.
    ex. 스토리지/CPU 토큰은 네트워크 상에서 공유될 수 있다.

  • 자산(asset)
    토큰은 내재적 또는 외적, 유형 또는 무형 자산의 소유권을 나타낼 수 있다.
    ex. 금, 부동산, 자동차, 기름, 에너지, MMOG(다중 접속 온라인게임) 항목 등

  • 접근(access)
    토큰은 접근 권한을 나타낼 수 있으며, 토론 포럼, 회원전용 웹사이트, 호첼 객실 또는 렌터카 같은 디지털 또는 물리적 속성에 대한 접근 권한을 부여할 수 있다.

  • 지분(equity)
    토큰은 디지털 조직 또는 법인의 주주 지분을 나타낼 수 있다.

  • 투표(voting)
    토큰은 디지털 또는 법률 시스템에서 투표권을 나타낼 수 있다.

  • 수집(collectible)
    토큰은 디지털 수집물 또는 물리적인 수집물(그림)을 나타낼 수 있다.

  • 신원(identify)
    토큰은 디지털 신원 또는 법적 신원을 나타낼 수 있다.

  • 증명(attestation)
    토큰은 일부 기관이나 탈중앙화된 평판 시스템에의한 사실 증명서 또는 인증서를 나타낼 수 있다.

  • 유틸리티(utility)
    토큰은 서비스에 접근하거나 사용료를 지불하는데 사용될 수 있다.


거래상대방 위험

트랜잭션에서 상대방이 자신의 의무를 이행하지 못하는 위험
일반적으로 거래 상대방의 상환, 결제의무의 불이행으로 인한 위험을 말한다.


토큰과 내재성

✔️ 토큰이 블록체인에 내재적인 디지털 아이템을 나타내는 경우

내재적 자산을 나타내는 토큰에는 추가적인 거래 상대방 위험이 없다. 블록체인 합의 규칙이 적용되고 개인키의 소유권(통제권)은 중개자 없이 자산의 소유권과 같다.
ex. 크립토 키티에 대한 키를 보유한다면 직접 크립토키티를 소유하고 있는 것이다.

✔️ 토큰이 외재적인(extrinsic)것을 나타내는 데 사용되는 경우

많은 토큰은 부동산, 투표권이 있는 회사 주식, 상표 및 금괴 같은 외재적인 것을 나타내는데 사용된다.
이러한 외재적 자산은 수탁자가 보유하거나, 외부 레지스트리에 기록되거나, 블록체인 외부의 법률 및 정책에 의해 통제되므로 추가적인 거래상대방 위험이 있다.

💡 블록체인 기반 토큰의 가장 중요한 파급 효과 중 하나는 외재적 자산을 내재적 자산으로 변환하여 거래상대방 위험을 제거할 수 있는 능력이다.


토큰 사용: 유틸리티 또는 지분

대다수의 프로젝트는 유틸리티 토큰 또는 지분 토큰 같은 두 가지 방법 중 하나로 토큰을 사용한다.

  • 유틸리티 토큰: 서비스, 애플리케이션 또는 자원에 접근이 요구되는 곳에 사용된다.
    공유 스토리지 같은 자원을 나타내는 토큰 혹은 소셜 미디어 네트워크 같은 서비스에 접근하는 토큰을 포함
  • 지분 토큰: 스타트업 같은 곳의 소유권에 대한 지분을 나타내는 토큰
    지분 토큰을 유틸리티 토큰으로 위장해서 국가의 규제를 회피하는 경우도 있으므로 주의해야 한다.

유틸리티 토큰: 누가 필요한가?

현재 토큰을 이해하고 사용하고자 하는 사람들은 아직 작은 암호화폐 시장의 일부분 뿐이다. 토큰 가치가 크지 않은 근본적인 이유는 매우 좁은 환경에서만 사용할 수 있기 때문이다. 제한된 유동성, 제한된 적용 가능성 및 높은 전환 비용은 토큰 가치를 단지 '토큰'으로서만의 가치를 떨어뜨린다.

➡️ 따라서 토큰 사용은 올바를 근거를 가지고 결정해야한다.
토큰을 사용하지 않으면 애플리케이션이 작동하지 않거나, 토큰이 근본적인 시장 장벽이나 접근 권한 문제를 해결한다면 토큰을 채택한다.
만일 유틸리티 토큰을 도입하는 유일한 이유가 자금을 빨리 조성할 수 있고 그것이 주식 공모가 아닌 것처럼 위장하기 위한 것이라면 그런 토큰은 도입하면 안된다.


이더리움 토큰

비탈릭 부테린은 이더리움 같은 범용적이고 프로그래밍 가능한 블록체인의 가장 명확하고 유요한 애플리케이션의 하나로 토큰을 제안했다.

💡 토큰은 이더와 다르다.
✅ 이더 전송은 이더리움 플랫폼의 본질적인 동작이지만 토큰을 보내거나 소유하는 것은 아니다. 즉, 이더리움 프로토콜은 토큰에 대해 알지 못한다.
✅ 이더리움 계정의 이더 잔액은 프로토콜 수준에서 처리되는 반면, 이더리움 계정의 토큰 잔액은 스마트 컨트랙트 수준에서 처리된다.
✅ 이더리움에서 새 토큰을 만들려면 소유권, 이전 및 접근 권한을 포함한 모든 것을 처리하는 새로운 스마트 컨트랙트를 만들어야한다.

ERC20 토큰 표준

첫 번째 표준은 2015년 11월 파비안 보겔스텔러가 ERC(Ethereum Request for Comment)로 발표하고 깃허브 이슈번호 20이 자동으로 할당된 ERC20 토큰이다.
✅ ECR20은 대체 가능한 토큰의 표준이다.
✅ 대다수의 토큰은 ERC20 표준을 기반으로 한다.
✅ ERC20 표준은 토큰을 구현하는 컨트랙트에 대한 공통 인터페이스를 정의하므로 모든 호환 가능한 토큰에 같은 방식으로 접근하고 사용할 수 있다.

🔴 ERC20 필수 함수와 이벤트

ERC20을 준수한 토큰 컨트랙트는 최소한 다음 함수 및 이벤트를 제공해야 한다.

  • totalSupply
    현재 존재하는 이 토큰의 전체 개수를 반환한다. ERC20 토큰에는 고정 또는 가변적인 공급량이 있을 수 있다.
  • balanceOf
    주소가 주어지면 해당 주소의 토큰 잔액을 반환한다.
  • transfer
    주소와 금액이 주어지면 해당 주소로 금액 만큼의 토큰을 전송한다. 전송을 실행하는 주소의 잔액에서 전송을 실행한다.
  • transferFrom
    보낸 사람, 받는 사람 및 금액이 주어지면 한 계정에서 다른 계정으로 토큰을 전송한다. approve와 함께 조합하여 사용한다.
  • approve
    수취인 주소와 금액이 주어지면 그 주소가 승인을 한 계정에서 최대 금액까지 여러 번 송금할 수 있도록 승인인다.
  • allowance
    소유자 주소와 지출자(sender)주소가 주어지면, 지출자가 출금할 수 있도록 소유자가 승인한 잔액을 리턴한다.
  • Transfer
    전송이 성공하면(transfer 혹은 transferFrom 호출) 이벤트가 트리거된다.
  • Approval
    approve를 성공적으로 호출하면 이벤트가 기록된다.

🔴 ERC20 선택적 함수

필수 함수 외에 다음과 같은 선택적 함수도 표준에 의해 정의된다.

  • name
    사람이 읽을 수 있는 토큰의 이름(ex. 미국 달러 )를 반환한다.
  • symbol
    사람이 읽을 수 있는 기호(ex. USD )를 반환한다.
  • decimals
    토큰의 양을 나눌 수 있는 소수 자릿수를 반환한다. 예를 들어, decimals가 2 이면 토큰 양을 100으로 나눠 표현한다.

🔴 솔리디티에서 ERC20 인터페이스 정의

🔴 ERC20 데이터 구조

ERC20 구현을 살펴보면 2개의 데이터 구조를 포함한다. (잔고 추적, 허용량 추적)

✔️ 첫 번째 데이터 매핑은 소유자별로 토큰 잔액을 내부 테이블로 구현하여 토큰 컨트랙트에서 토큰을 소유한 사람을 추적한다.
mapping(address => uint256) balances;

✔️ 두 번째 데이터 구조는 허용량의 데이터 매핑이다. ERC20 컨트랙트는 기본 키가 토큰 소유자의 주소이고, 지출자 주소와 허용 한도에 매핑되는 2차원 매핑으로 허용량을 추적한다.
mapping (address => mapping (address => uint256) public allowed;

🔴 ERC20 워크플로: 'transfer'와 'approve & transferFrom'

ERC20 토큰 표준에는 두 가지 transfer 함수가 있다.

✔️ transfer함수를 사용하는 단일 트랜잭션인 간단한 워크플로 : 지갑에서 다른 지갑으로 토큰을 보내는데 사용되는 워크플로

✔️ approvetransfrom을 사용하는 두단계 트랜잭션 워크플로 : 토큰 소유자가 제어를 다른 주소에 위임할 수 있게 해준다.

자체 ERC20 토큰 출시

트러플 프레임워크를 사용하여 자체 토큰을 만들고 실행해보자.

ERC20 토큰 문제

ERC20 토큰은 몇 가지 잠재적인 함정이 있다.

✅ 토큰 전송은 특정한 토큰 컨트랙트 상태 안에서 일어나고 수신자의 주소가 아닌 토큰 컨트랙트를 목적지로 한다. 즉, 트랜잭션이 토큰 수신자에게 실제로 보내지는 것이 아니라 받는 사람의 주소가 토큰 컨트랙트 자체의 맵에 추가된다. 따라서 ERC20 토큰을 지원하는 지갑조차도 사용자가 토큰 컨트랙트를 명시적으로 추가하지 않는 한 토큰 잔액을 인식하지 못한다.

✅ 이더는 send 함수에 의해 보내지고 컨트랙트의 payable 함수 또는 외부 소유 주소에 의해 수신되지만, 토큰은 ERC20 컨트랙트에만 존재하는 함수인 transfer 또는 approvetransferFrom을 사용하여 전송된다는 차이가 있다. (토큰은 이더와 같은 암호화폐처럼 작동하기 위한 것이지만 차이점이 존재한다.)

✅ 이더를 보내거나 이더리움 컨트랙트를 사용할 때는 가스 지급을 위한 이더가 필요하다. 토큰을 보내는 데도 이더가 필요하다. 트랜잭션의 가스는 토큰으로 지급할 수 없고, 토큰 컨트랙트는 가스를 지급할 수 없다. 토큰을 받을 때는 이더가 필요없었는데, 이 토큰을 외부로 보낼 때는 이더가 필요하게된다는 점은 혼란스러울 수 있다.

토큰은 자체 블록체인을 가지고 있는 암호화폐가 아니다.

이러한 문제들을 해결하기 위해 제안된 몇 가지 표준이 있다.

🔴 ERC223: 제안된 토큰 컨트랙트 인터페이스 표준

✅ 목적지 주소가 컨트랙트인지 아닌지여부를 감지함으로써 실수로 토큰을 컨트랙트로 전송하는 문제를 해결한다.
✅ 토큰을 전송하는 목적지가 컨트랙트인데, 그 컨트랙트에 토큰에 대한 지원이 없는 경우 전송이 실패한다.

🔴 ERC777: 제안된 토큰 컨트랙트 인터페이스 표준

🔴 ERC721: 대체 불가능한 토큰(증서) 표준

이 전까지의 토큰 표준은 토큰 유닛을 바꿔쓸 수 있는 대체 가능한 토큰에 대한 것이었고, ERC721 표준은 대체할 수 없는 토큰(증서 )에 대한 표준을 위한 것이다.

  • 증서 : 서명되어 배달된 법적 서류, 특히 재산 또는 법적 권리의 소유에 관한 것
    ERC721 표준은 증서에 의해 그 소유권이 고유하게 추적될 수 있는 것들을 대상으로 한다.

  • ERC20 과 ERC721의 차이
    ERC20은 각 소유자에 속한 잔액을 추적하고 소유자의 주소가 매핑의 기본키이다. 각 계정의 최종 잔액만 추적하고 토큰의 출처는 추적하지 않는다.
    ERC721은 각 증서 ID(256비트 식별자)와 소유권자를 추적하며 증서 ID가 매핑의 기본 키가 된다.


토큰 표준 사용

토큰 표준이란 무엇인가? 그 목적은 무엇인가?

✅ 토큰 표준은 구현을 위한 최소(minumum)사양이다. 즉, ERC20을 준수하려면 최소한 ERC20 표준에 명시된 함수와 동작을 구현해야 한다.
✅ 이러한 표준의 주요 목적은 컨트랙트 간의 상호운용성(interoperablility)을 장려하는 것이다. ERC20 표준을 따르는 컨트랙트를 배포하면 기존 지갑 사용자는 지갑을 업그레이드하거나 노력하지 않고도 토큰을 원활하게 트랜잭션할 수 있다.

이 표준을 사용해야 하는가?

개발자는 기존 표준을 사용해야 하는지 아니면 그것들이 설정하는 제한을 넘어서는 혁신을 이뤄야 하는지에 대한 딜레마에 직면한다.
기존 표준을 사용하면 해당 표준을 사용하도록 설계된 모든 시스템의 가치를 얻게 된다.
표준을 벗어나기로 한다면 모든 지원 인프라를 직접 구축하는 비용을 고려해야 하며 다른 표준을 구현하여 새로운 표준이 되도록 설득해야 한다.
따라서 신중히 고려해 선택해야한다.

토큰 인터페이스 표준 확장

앞서 설명한 토큰 표준은 기능이 제한된, 매우 최소한의 인터페이스를 제공한다. 많은 프로젝트가 애플리케이션에 필요한 기능을 지원하기 위해 확장된 구현을 만들었다.

🔴 확장된 기능

  • 소유자 제어(owner control)
    특정 주소 또는 주소 집합(다중서명체계), 블랙리스트, 허용 목록 작성, 복구 등과 같은 특수 기능을 제공하는 기능
  • 소각(burning)
    토큰을 고의로 파괴할 수 있는 주소로 전송하거나 잔액을 지우고 공급을 줄임으로써 의도적으로 토큰을 파괴하는 기능
  • 발행(minting)
    예측 가능한 비율로 또는 토큰 생성자의 승인을 통해 토큰 총 공급량을 추가하는 기능
  • 크라우드 펀딩(crowdfunding)
    경매, 시장 판매, 역 경매 등을 통해 판매용 토큰을 제공할 수 있는 기능
  • 캡(caps)
    총 공급량에 대해 미리 정의된 불변의 제한을 설정할 수 있는 기능(발행 기능의 반대)
  • 복구 백도어(recovery backdoors)
    자금을 복구하거나, 송금을 되돌리거나, 지정된 주소 또는 주소의 집합에 의해 활성화 될 수 있는 토큰을 소거하는 기능
  • 화이트리스트(whitelisting)
    토큰 전송 같은 작업을 특정 주소로 제한할 수 있는 기능
  • 블랙리스트(blacklisting)
    특정 주소를 허용하지 않음으로써 토큰 전송을 제한할 수 있는 기능

➡️ 추가 기능으로 토큰 표준을 확장하는 데는 혁신/위험과 상호운용성/보안 간의 절충이 필요하다.


토큰 및 ICO

토큰은 이더리움 같은 모든 스마트 컨트랙트 플랫폼에서 매우 중요한 구성요소가 될 가능성이 크다.

✔️ ICO(Initial Coin Offering) : 새로운 암호화폐를 만들기 위해 불특정 다수의 투자자들로부터 초기 개발 자금을 모집하고 그 대가로 코인을 나눠주는 것. ICO는 크라우드 펀딩의 일종으로 초기코인공개 또는 초기코인제공이라고 한다.

단기적으로 사기로 가득찬 토큰 ICO 버블로부터 장기적 비전과 이 기술의 영향을 분리하는 것이 필요하다.

profile
안녕하세요

0개의 댓글