본문 바로가기

블록체인_9기/⛓ BlockChain

67강_231010_Blockchain(Token과 Coin의 차이점, ERC20 & ERC721 토큰, Openzeppelin, ERC20을 Truffle로 배포하기 )

728x90

 

 

 


Coin과 Token의 차이점

암호화폐에서의 다양한 암호화폐들이 존재한다. 어떤 암호화폐는 코인(coin)이라고 불리기도, 토큰(token)이라고 불리기도 한다. 이 두 개념은 같은 의미를 가진 것일까? 토큰과 코인은 차이점이 존재한다. 두 화폐를 구별하는 가장 큰 차이점은 메인넷(mainnet)에 존재한다. 두 화폐의 차이점은 다음과 같다.


🤷‍♀️ 메인넷(Mainnet)?

블록체인 프로젝트를 실제 출시하여 운영하는 네트워크를 의미한다.

  • 기존 플랫폼에 속하지 않고 프로젝트를 수행할 수 있는 독립적인 플랫폼이다.
  • 메인넷을 통해 방향성이 뚜렷하고 커스터마이징이 가능한 자체 플랫폼을 개발하여 다양한 기술을 더욱 빠르게 적용할 수 있다.
  • 메인넷은 거래소와 개인 지갑 거래 트랜잭션, 암호화폐 지갑 생성 등의 역할을 수행한다.
  • 메인넷 보유 여부에 따라 '코인'과 '토큰'으로 구분하는 기준이 될 수 있다.

Coin

  • 자체 메인넷이 있고, 해당 네트워크 상에서 발행된다.
  • 다른 플랫폼에 종속되지 않고 자체 블록체인 네트워크인 메인넷 상에서 독립적인 생태계를 구성하고 있는 암호화폐이다.
  • 블록체인 네트워크에서 참여자가 서로의 데이터를 기록하고 공유하는 등의 네트워크 유지관리에 기여하면 보상으로 코인 채굴의 권한을 받아 코인을 생성할 수 있다.
    • 채굴과정을 통해 생성된 코인을 '플랫폼 코인(Platform Coin)'이라 말하며, '레이어 1(Layer One) 코인'이라 칭하기도 한다.
      • 플랫폼 코인(Platform Coin) : 다양한 서비스와 기능을 제공하는 블록체인 플랫폼에 사용되는 암포화폐를 말한다.
    • 리플(Ripple)처럼 다른 플랫폼에 종속되지 않은 독립적인 암호화폐도 코인에 속한다.

 

Token

  • 독립적인 메인넷이 존재하지 않고 이미 존재하는 네트워크를 기반으로 구축된다.
  • 모든 암호화폐가 자체 메인넷을 가지고 있는 것은 아니며, 대부분은 이더리움 같은 다른 플랫폼 위에서 작동하는 토큰의 형태를 띄고 있다.
  • 토큰은 다른 코인의 메인넷 위에서 개별적인 목적을 달성하기 위해 사용하는 암호화폐이다.
  • 토큰은 주로 개별 블록체인 프로젝트 내에서 특정 액션에 대한 보상이나, 자금을 조달하기 위한 수단 또는 요금을 지불하는 수단으로 사용된다.
  • 자체 메인넷을 구축하는 프로젝트의 코인보다 토큰의 수가 현저히 많다. 
  • 코인은 유틸리티 토큰거버넌스 토큰 등으로 분류할 수 있다. 최근 커뮤니티에서 큰 화제가 된 밈 코인(Meme-coin)도 명칭은 코인이지만, 개념적으로는 토큰에 속한다.
    • 유틸리티 토큰 : 독립적인 블록체인이 존재하지 않으며, 특정 플랫폼 상에서 스마트 컨트랙트로 생성 및 관리되는 암호화폐이다.
    • 거버넌스 토큰 : 탈중앙화로 운영되는 블록체인 생태계에서 시스템 개선안, 운영 방안 등에 대해 제의하고 투표하는데 사용하는 암호화폐이다.
    • 밈 코인 : 인터넷과 SNS에서 밈이나 농담에서 영감을 얻어 발행된 암호화폐이다. 기술력이나 로드맵보다 커뮤니티의 영향력으로 이슈가 되는것이 특징이다.

 

 

 


ERC20 Token

ERC20이더리움에서 대체 가능한 토큰에 대한 토큰 표준이다. 이더리움 창시자 중 한명인 Fabian Vogeisteller가 2015년에 제안하였고, 이더리움 블록체인에서 대체 가능한 토큰을 구축하기 위한 기술표준이다. 'ERC'는 'Ethereum Request for Comments'의 약자이며, '20'은 이 특정 제안에 할당된 번호로 토큰을 생성, 발행 및 배포하는 방법에 대한 일련의 규칙을 정의한다.

  • ERC20은 이더리움 네트워크에서 가장 표준이 되는 토큰이며 대체 가능한 토큰이다.
  • 가장 기본적인 상호 교환이 가능한 토큰의 기능을 정의한다.
  • 대체 가능한 토큰은 서로 구분할 수 없으며 언제든지 교환할 수 있다. 
  • 많은 토큰이 ERC20을 표준으로 사용하며, 이는 전체 이더리움 생태계의 원동력이 되어 네트워크에서 수십만 건의 계약을 구성한다.
  • 토큰 전송 및 잔액 조회 토큰의 소유자 등을 관리하기 위한 메서드와 이벤트가 정의되어 있는 토큰이다. 탈중앙화된 금융(Defi)등을 사용한다.

 


특징 1_표준화된 인터페이스

ERC20 토큰은 스마트 계약이 구현해야 하는 특정 함수 집합을 정의하는 표준이다. 무조건 정의대로 입력해야 하는 것은 아니지만 정의를 따라 함수 이름을 지정하면 개발자가 토큰을 생성하고 상호작용 하는데 도움을 줄 수 있다.  예시는 다음과 같다.

// 다른 주소(to)로 특정 양(value)의 토큰을 전송하는 함수
transfer(address to, uint256 value)

// 주어진 주소(owner)의 토큰 잔액을 반환하는 함수
balanceOf(address owner)

// 다른 주소(spender)에게 특정 양(value)의 토큰을 소비할 권한을 부여햐는 함수
approve(address spender, uint256 value)

 


특징 2_탈중앙화 금융(Defi)

Defi(Decentralized Finance)탈중앙화된 금융으로 인터넷을 사용할 수 있는 모든 사람에게 열려 있는 금융 서비스이다. 기존 금융서비스와 다르게 블록체인 기술을 사용하며, 중앙 기관 없이 탈중앙화된 환경에서 누구나 자유롭게 이용할 수 있는 금융서비스를 총칭한다.

다음은 전통적인 금융서비스와 디파이의 차이점이다.

구분 Defi 전통적인 금융서비스
자금 사용에 대한 권한 개인 금융서비스 회사
자금 사용 내용에 대한 조회 개인이 직접 조회하고 관리함 신뢰할만한 금융회사에 의탁함
자금 송금의 범위 및 시간 국내, 국외 제한없이 빠르게 송금이 가능 국내의 경우 빠르게 송금이 가능
해외의 경우 절차가 복잡하고 오랜 시간이 걸림
서비스 이용에 대한 자격 모든 사람들에게 열려 있음
국가, 인종 등의 차별이 없음
국가마다 상이함
모든 사람들에게 열려 있지 않음
투명성 모든 거래내역이 모든 이들에게 공개됨
서비스가 코드로 만들어져 있으며, 오픈소스로 공개되어 있음
사용자들에게 공개되어 있으며 서비스 회사간 정보를 공유함
오픈 소스 등으로 모든 이들에게 열려 있는 서비스는 아님
위험성 오픈소스이고 해킹의 위험이 존재함
아직은 초기시장이라 다양한 리스크에 노출되어 있음
국가에 따라서 상이함
해당 금융서비스 회사에 따라서 파산 시 일부 자금에 대해서 국가가 보장해주는 경우가 있음

 

최초의 Defi(디파이)는 비트코인이다. 앞선 표에 있는 자금 사용에 대한 권한, 조회, 범위 및 시간, 투명성의 특징들은 비트코인에 의해 생겨났다. 어떠한 중개인도 없이 신뢰할 수 있는 비트코인의 원장에 개인의 권한으로 기록하는 비트코인의 특징을 발전시킨 것이 이더리움이다.

이더리움은 비트코인의 특징을 모두 가지고 있으면서 조금 더 다양한 형태의 프로그램을 개발할 수 있도록 만들어졌다. 비트코인이 Defi의 시초라면, 이더리움으로 인해 본격적으로 Defi가 기존 금융서비스와 유사한 형태로 발전해 사용자에게 다양한 경험을 제공할 수 있도록 해준 것이다. 

따라서, 이더리움으로 인해 예금, 대출, 거래소, 파생상품 등의 금융서비스를 탈중앙화된 환경에서 스마트 컨트랙트에 의해 자율적으로 운용하고 사용자가 직접 자산을 관리할 수 있도록 하는 서비스Defi 서비스인 것이다.

ERC20은 Defi의 중요한 구성 요소 중 하나로, 사용자가 중앙기관의 개입 없이 다양한 금융활동을 수행하고 금융서비스를 활용할 수 있는 주요 자산으로 사용되기도 한다.

 

 

 


ERC721 Token

출처 : https://m.upbitcare.com/academy/education/nft/182

이전에 설명했던 대로 ERC(Ethereum Request for Comment)는 이더리움 블록체인 네트워크에서 발행되는 토큰의 표준의 의미한다. 일반적으로 이더리움 블록체인에서 스마트 컨트랙트에 사용되는 기술 표준은 ERC20이다. ERC20은 대체가능한 토큰에 대한 프로토콜이며, 여기서 '대체 가능'이라는 것은 1000원의 자폐와 다른 누군가가 가지고 있는 1000원의 지폐가 모두 구분없이 동일한 가치와 의미를 지닌다는 것을 의미한다.

반면, ERC721은 '대체불가능한' 특징을 지니고 있는 이더리움 상의 NFT 표준안이다. ERC20과 달리, 특정 생태계에서 거래 등에 사용되는 토큰이 아닌 게임, 미술품, 부동산 등의 특정 목적으로 주로 사용된다.

토큰의 소유권 이전(판매 및 경매), 토큰의 메타 데이터 조회 등의 메서드와 이벤트를 정의하기도 한다.

 

 

 


Openzeppelin

OpenZepplin은 솔리디티 기반의 스마트 컨트랙트를 개발하는 표준 프레임워크이다. 트러플(Truffle)과 유사하나, 트러플보다 기능이 다양한 프레임워크이다. 오픈제플린을 사용하면 보다 쉽게 ERC20 컨트랙트를 사용해 토큰을 발행할 수 있다. 다시말해, ERC20 컨트랙트를 직접 작성하는 것이 아닌, 오픈제플린에서 제공해주는 IERC20 컨트랙트를 사용해 토큰 발생이 가능하다는 뜻이다. 이더리움 네트워크 상에서 토큰을 발생할 때 인터페이스 자체가 규격화 되어있기 때문에 오픈제플린에서 이미 만들어 놓은 인터페이스를 가져다 사용하는 방식으로 생각하면 된다.

사용방법은 다음과 같다.

VSC 터미널오픈제플린을 설치한다.

npm i @openzeppelin/contracts

 

node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol 또는 IERC20.sol 경로를 찾아 인터페이스를 사용한다.

 

 

 


ERC20을 Truffle로 배포하기

 

Truffle 설치

ERC20을 Truffle을 사용하여 배포까지 작업을 진행해보려 한다. 작업을 진행하기 앞서, Truffle을 설치해준다.

# truffle 설치
npm i truffle

# truffle 폴더 구성 설치
npx truffle init

트러플 폴더구성을 설치하면, 해당 디렉토리에 아래와 같은 폴더와 파일이 생성된다.

 

솔리디티 코드 작성

contracts 폴더에 IERC20.sol파일과 ERC20.sol을 작성했다. IERC20.sol파일은 오픈제플린에서 제공주는 IERC20 컨트랙트가 어떤 형식으로 구성되어 있는지 알아보기 위해 직접 손으로 코드를 작성해보기로 한다. 

totalSupply 함수는 현재 발행된 토큰의 총량을 확인하는 함수이다. external 접근제한자로, 내부의 컨트랙트에서는 사용할 수 없으나 외부의 컨트랙트에서 호출되어 사용할 수 있는 함수로 설정되었다. view 상태제어자로, 수정이 불가한 읽기만 가능한 함수임을 지정하였고, 'returns(uint)'로 반환되는 값은 부호가 없는 정수형 변수로 반환할 수 있다.

balanceOf 함수는 특정 주소(account)의 토큰 잔액을 확인하는 함수이다. 매개변수로 받는 account는 address로 지갑의 주소 형식으로 값을 받는다. totalSupply 함수와 마찬가지로, 'external view returns(uint)'로 설정되어 컨트랙트 외부에서만 사용이 가능하며 읽기 전용 함수이다. 반환값은 부호가 없는 정수로 반환할 수 있다.

transfer 함수는 한 계정에서 가른 계정으로 토큰을 전송하는 함수이다. 매개변수 to는 토큰을 받은 대상의 주소를 address 형식으로 입력하고, amount는 전송할 토큰의 양을 uint 형식으로 전달한다. 'external returns(bool)'로 설정되어, 컨트랙트 외부에서만 사용이 가능하며, 반환값은 true/false로 전송이 성공하면 true를, 실패하면 false를 반환한다.

allowance 함수는 소유권을 위임받은 토큰을 관리하는 함수이다. 매개변수 owner는 원래 토큰의 소유자의 주소를 address 형식으로 입력하고, spender는 토큰을 전달받을 대리자의 주소를 address 형식으로 입력한다. 동작은 다음과 같은 예시로 진행된다.

{지갑주소 : 100개,200개가 들어있음}
{0x11111111 : 100, 0x1111111 :200}

{주소 : 사람한테 50보냄}

{0x11111111 : {0x111111112: 50}

approve 함수는 특정 대리자(spender)에게 토큰의 소유권을 위임하는 함수이다. 매개변수 spender는 토큰을 전달받을 계정의 주소를 address 형식으로 입력한다. amount는 소유권을 전달할 토큰의 양을 uint 형식으로 입력하고, 반환값을 bool형식으로 성공하면 true 값을 반환한다.

transferFrom 함수는 대리자(spender)가 토큰(amount)을 원래 소유자 대신 다른 계정(to)으로 전송할 때 사용하는 함수이다. 매개변수 spender는 토큰을 보낼 권한을 가질 대리자를 address 형식으로 입력한다. to는 토큰을 전송할 대상의 주소를 입력하고, amount는 전송할 토큰의 양을 uint 형식으로 입력한다. 반환값은 bool값으로 전송이 성공 시 true 값을 반환한다. 

 


솔리디티 이벤트(event)

스마트 컨트랙트에서 특정 조건이 충족될 때 로그를 생성하는데 사용하는 이벤트는 블록체인에 로그로 저장되며, 외부 어플리케이션에서 이 로그를 감지하여 특정 작업을 수행할 수 있다. 

이벤트는 'event' 키워드를 사용해 정의한다. 이벤트의 이름은 개발자가 별도로 지정한다. 이벤트는 인수를 가질 수 있으며, 아래의 예시에서는 두 가지의 인수를 가진다. address 형식의 '_from'과 uint 형식의 '_value'의 인수를 가지며, indexed 키워드를 사용해 '_from'을 색인화할 수 있다. 색인화된 인수는 블록체인 탐색기에서 검색 및 필터링에 사용될 수 있다. 

// 솔리디티 이벤트 사용 예시
event MyEvent(address indexed _from, uint _value);

Transfer 이벤트는 토큰 전송 함수인 transfer 함수가 실행될 때 작동하는 함수이다. 보내는 계정의 주소(from)와 받는 계정의 주소(to), 전송된 토큰의 양(value)을 나타낸다. 

Approval 이벤트 토큰의 소유권을 위임하는 approve 함수기 실행될 때 작동하는 함수이다. 토큰의 소유자(owner)가 대리자(spender)에게 얼마만큼의 토큰(value)을 위임했는지 추적하기 위해 사용한다. 

// 라이센스 작성
// SPDX-License-Identifier: MIT
// 버전정보 작성
pragma solidity ^0.8.19;

// 오픈제플린에서 제공하는 ERC20 인터페이스
interface IERC20 {

  // public 보다 external 이 gas 가 저렴해서 사용한다(절약가능)
  // public 은 함수의 변수를 메모리에 복사하고 사용해서 메모리의 용량읠 사용함 
  // but external은 복사를하지 않고 내부에서 복사를 해서 메모리에 값을 사용하느냐 
  // or CALLDATA를 직접 읽어서 사용하느냐의 차이

  // 토큰의 현재 총 발행량을 조회할 수 있는 함수
  function totalSupply() external view returns(uint);

  // 전달받은 매개변수(계정 주소) 토큰의 잔액을 조회하는 함수 
  function balanceOf(address account) external view returns(uint);

  // 계정에서 토큰을 다른 계정으로 전달하는 함수
  function transfer(address to, uint amount) external returns(bool);

  // 소유권을 위임받은 토큰을 관리하는 공간 : 얼마나 위임을 받았는지
  function allowance(address owner, address spender) external returns(uint);

  // 소유권을 제3자에게 위임하는 함수
  function approve(address spender, uint amount) external returns (bool);
  
  // 소유권을 관리하는 토큰을 보내는 함수, 위임받은 소유권이 있는지 확인을 하고 보내는 함수
  function transferFrom(address spender, address to, uint amount) external returns (bool);


  // Transfer 함수를 실행했을때 이벤트 함수를 실행해서, 발생하는 이벤트를 트랜잭션 로그에 확인 해볼 수 있다
  event Transfer(address form, address to, uint value);

  // approve 함수가 실행됐을때, 이벤트 함수도 실행해서 로그를 확인해볼수있다
  // 누가 누구한테 얼마 보냈는지 확인
  event Approval(address owner, address spender, uint value);
}

 

 

ERC20.sol 파일을 작성해 토큰의 발행, 전송, 권한 위임, 소각의 기능을 제공하는 함수를 작성한다. 

import 구문으로 IERC20 인터페이스를 IERC20.sol에서 가져와 사용한다. 'is' 키워드를 사용해 IERC20 인터페이스를 상속하고 해당 인터페이스의 함수와 이벤트를 구현한다. 

ERC 토큰의 규약을 상태변수로 선언한다. 각 상태 변수는 다음과 같은 역할과 접근자를 가진다.

  • name : 토큰의 이름(풀 네임)을 가지는 상태변수이다. 
    • 예) 'Ethereum', 'Bitcoin' 등
  • symbol : 토큰의 심볼(토큰의 단위)를 표현하는 상태변수이다.
    • 예) 'ETH', 'BTC' 등
  • decimals : 토큰의 소수점 자릿수를 나타내는 상태변수이다.
    • ERC20 토큰은 기본적으로 18자리의 소수점을 사용한다.
  • totalSupply : 토큰의 총 발행량을 나타낸다. override 키워드를 사용하여 인터페이스에서 선언한 함수를 상속받아 사용한다.
    • override로 상속받아, IERC20 인터페이스에서 선언한 함수명, 매개변수 및 반환값의 타입 등이 동일하게 적용된다.
  • owner : 스마트 컨트랙트 배포자의 주소를 나타내는 상태변수이다. 
    • private 키워드로, 해당 컨트랙트 내에서만 사용될 수 있다.

 

 

 

 

 

 

 

 

 

 

728x90