스크립토 6기 하진원입니다.
스크립토 방학 스터디로 마스터링 이더리움 공부하고 있습니다.
토큰이란 기호, 상징이란 뜻으로 특수한 사용처에서 가치를 갖는 특수 용도의 동전과 같은 물건을 지칭한다. 일반적인 예시로는 게임에서 사용되는 토큰이 있다.
물리적 토큰은 제한된 사용처에서 의미를 갖고 쉽게 교환될 수 없는다는 특징을 가져 가치가 크지 않다.
블록체인을 통해 토큰을 구현하게 된다면 이런 제한이 없어지며 완전히 재정의된다. 다양한 용도로 다양한 장소에서 사용이 가능해지며 거래도 가능해져 더 이상 가치가 작을 이유가 없어진다.
단일 토큰이 여러가지 기능을 가질 수 있으며
- 화폐
사적인 거래로 가치가 결정되는 화폐로 사용될 수 있다.- 자원
공유 환경에서 획득한, 생산된 자원을 나타낼 수 있다.- 자산
자산의 소유권을 나타낼 수 있다. 예로 금, 부동산, 기름 등이 있다.- 접근
접근 권한을 나타낼 수 있다. 예로 웹사이트와 같은 디지털, 호텔과 렌트카 같은 물리적인 것에 대해 접근 권한 부여가 가능하다.- 지분
디지털 조직 / 법인의 지분을 나타낼 수 있다.- 투표
시스템에서 투표권을 나타낼 수 있다.- 수집
디지털 / 물리적인 수집물을 나타낼 수 있다. 예로 NFT(cryptopunks), 그림등이 있다.- 신원
디지털 / 법적 신원을 나타낼 수 있다.- 증명
기관이나 평판 시스템에 의한 사실 증명서 / 인증서 발급 가능.
예시로 학위, 재학 증명서 등이 있다.- 유틸리티
서비스에 접근하거나 사용료 지불하는데 사용 가능하다.
토큰이 대체 가능하기 위해서는 단일 단위를 값, 기능 차이 없이 다른 토큰으로 대체가 가능해야 한다. 일반적인 화폐로 사용되는 토큰은 그런 역할을 한다 할 수 있다.
토큰이 대체 불가능하기 위해서는(NFT) 과거 출처를 관리하지 못하여야 하고 상호 교환이 불가능해야 한다. NFT의 예시로는 그림, 부동산의 소유권을 나타내는 토큰등이 있다.
거래상대방 위험이란 트랜잭션에서 상대방이 자신의 의무를 이행하지 못하는 위험이다.
자산을 토큰화할때는 거래상대방 위험을 고려하여야 한다. 자산 수탁자가 판매, 구매 당사자가 아닌 경우에도 트랜잭션 수행의 당사자가 되기 때문에 거래상대방 위험에 놓이게 된다.
토큰은 그 자체로 의미를 가지는 경우(내재적 가치)가 있으며 다른 가치 있는 것을 나타내는데 사용되는 경우(외재적 가치)가 있다.
유념할 것은 외재적 가치를 가지는 토큰은 토큰의 합의 규칙과 별개의 규칙으로 관리된다.
프로젝트에서 토큰은 모금을 위해 유틸리티 토큰과 지분 토큰을 사용한다.
하지만 국가의 규제와 맞닫는 부분이 있기 때문에 이가 계속 허용될 지는 두고 보아야 한다.
또한 유틸리티 토큰이 스타트업에 매력적인 방법이지만 필요한지 여부를 고민하여 도입하여야 한다.
토큰이 사용하여야 하는 이유가 필연적이라면 사용해야겠지만 그렇지 않다면 굳이 사용할 이유가 없을 것이다.
이더리움 외에도 많은 토큰이 있고 유명한 비트코인은 그 자체가 토큰이다. 그러나 이더리움에서 제시한 토큰 표준은 토큰의 발전에 기여하였다.
토큰은 이더와 혼동하면 안된다. 토큰과 이더의 차이점은 어떤 수준에서 처리되는지에서 비롯된다.
이더는 이더리움 플랫폼의 본질적인 동작인, 프로토콜에서 처리되는 것임에 반면 토큰은 스마트 컨트랙트 수준에서 처리되고 따라서 토큰을 만들기 위해서는 스마트 컨트랙트를 만들어 처리하여야 한다. 토큰을 만드는 스마트 컨트랙트는 표준을 따르는 것이 바람직하다.
ERC20은 NFT의 표준으로 토큰을 구현하는 컨트랙트에 대한 공통 인터페이스를 정의한다. 따라서 모든 호환 가능한 토큰에 같은 방식으로 접근, 사용이 가능하다.
표준은 최소한의 인터페이스일 뿐 다른 기능을 위해 만들어진 구현을 사용하거나 만들 수도 있다.
- totalSupply
토큰의 전체 개수 리턴- balanceOf
주어진 주소의 토큰 잔액 반환- transfer
주소와 금액이 주어지면 그 주소로 토큰을 전송- transferFrom
보낸사람, 받는 사람, 금액이 주어지면 한 계정에서 다른 계정으로 토큰 전송. approve와 사용- approve
수취인 주소와 금액이 주어지면 그 주소가 승인을 한 계정에서 최대 금액까지 여러 번 송금할 수 있도록 승인한다.- allowance
소유자 주소와 지출자 주소가 주어지면 지출자가 출금할 수 있도록 소유자가 승인한 잔액을 리턴한다.- Transfer
전송이 성공하면 이벤트가 트리거된다.- Approval
approve를 성공적으로 호출하면 이벤트가 기록된다.
- name
토큰의 이름 반환- symbol
기호(예:USD) 반환- decimals
토큰 양을 나눌 수 있는 소수 자릿수 반환.
솔리디티에서는 데이터 매핑으로 다음 2개의 데이터 구조를 구현한다.
- 잔고 추적
소유자별로 토큰 잔액을 내부 테이블로 구현하여 토큰을 소유한 사람을 추적할 수 있다.mapping(address => uint256) balances;
- 허용량 추적
ERC20 토큰을 사용하면 토큰 소유자가 권한을 위임자에게 위임할 수 있는데 이때 한도를 설정할 수 있다.mapping (address => mapping (address => uint256)) public allowed;
- transfer 함수
지갑에서 다른 지갑으로 토큰을 보낼 때 사용된다.- approve 후 transferFrom 사용
토큰 소유자가 제어를 다른 주소에 위임할 수 있게 해준다. 일반적으로는 토큰 배포 컨트랙트에 위임하는데 사용된다.
이 방법을 위해서는 2개의 트랜잭션이 필요하다.
첫번째는 토큰 소유자가 컨트랙트에 위임을 하는 approve를 호출하는 트랜잭션이다.
두번째는 컨트랙트가 사용자와 transferFrom를 통해 거래하는 트랜잭션이다.
ERC20은 컨센시스 EIP20와 오픈제플린 표준토큰을 사용하는 구현이 있다.
ERC223
목적지 주소가 컨트랙트인지 아닌지 여부를 감지할 수 있게 한다.
tokenFallback 함수를 통해 토큰을 지원하지 않는 컨트랙트로 전송하는 문제를 해결한다.
ERC777
- send 함수를 통해 토큰 전송
- tokensToSend 통해 전송할 토큰 선택 가능
- tokensReceived 함수 호출하여 수신자가 토큰을 수신한 사실을 컨트랙트&주소에 통지 가능
- 후크(hooks)
후크란 토큰이 보내지면 호출되는 컨트랜트 내의 함수로 이를 통해 계정과 컨트랙트가 토큰을 수신하는것에 따라 반응할 수 있다.(출처 : OpenZeppelin Docs)
ERC721
NFT토큰에 대한 표준이다. NFT 토큰은 게임 아이템, 디지털 수집물 같은 고유한 아이템 부터 실물에 대한 소유권을 추적하기 위한 용도등으로 사용된다.
ERC20과의 차이는 소유자가 매핑의 기본 키인 반면 ERC721는 증서ID와 소유권자가 매핑의 기본 키라는 것이다.mapping (uint256 => address) private deedOwner;
토큰 표준은 구현을 위해 최소한으로 지켜야 할 것으로 컨트랙트 간의 상호운용성을 추구한다.
표준은 특정 방법을 제시하여 혁신을 가로막기도 하지만 경험적으로 제시된 것이기 때문에 대부분 유효한 방법이다. 또한 표준을 벗어난다면 상호운용성을 포기해야 하며 기존에 구축된 인프라를 사용할 수 없다. 따라서 이를 고려하여 표준을 따를 것인지 고려해야 한다.