이 포스트는 ERC-20 토큰 설명과 ERC-20 ,
Ethereum/이더리움 - 스마트 컨트랙트로 토큰 발행하기 ,
스마트 컨트랙트와 ERC-20 개발
를 참조하여 요약한 글입니다.
이더리움은, 자체 블록체인을 기반으로 다양한 탈중앙화된 어플리케이션(DApp)이 작동할 수 있도록 고안된 하나의 플랫폼
.
DApp은 이러한 이더리움 플랫폼 상에서 스마트계약을 이용해 쉽고 빠르게 토큰을 발행할 수 있다.
이더리움 안에서는 이더(ETH)
가 사용되고,
이더리움 블록체인 상의 각각의 솔루션에 맞는 토큰을 발행한다.
이때의 토큰은 독자적인 토큰이 아닌 이더리움 생태계에서 호환 및 사용이 가능하다 !
단순한 예를 들자면,
안드로이드 및 iOS가 하나의 플랫폼(이더리움
) 역할을 하고, 그 위에 존재하는 수많은 앱(디앱
)이 있다.
이때 각각 앱을 사용하며 발생하는 "포인트"를 통합해서 사용하는 것은 불가능하다.
하지만 이더리움 플랫폼에서는 각각의 디앱이 발행한 토큰
을 통합하여 현금화하는 것이 가능하다.
디앱 내에서의 토큰 교환은 물론,
또 다른 이더리움 플랫폼을 기반으로 한 디앱의 토큰과 교환 가능하다.
이것이 가능한 것은 이더리움의 프로그래밍 표준인ERC-20 토큰 표준
이 있기 때문!
스마트 컨트랙트 토큰의 인터페이스 표준을 정의해둔 것이다.
Solidity(솔리디티)에도 TypeScript와 마찬가지로 interface가 존재한다.
하나의 컨트랙트가 또 다른 컨트랙트와 상호작용하기 위해 interface가 사용된다.
interface는 자식 컨트랙트를 위한 하나의 틀이라고 볼 수 있다.
이해하기 쉽게 타입 스크립트로 예를 들어보자.
타입 스크립트에서 interface
를 사용해 객체의 형태를 지정할 수 있다.
따라서 interface
는 객체의 모양을 본뜬 내용이라고 볼 수 있으며,
공통된 형태의 토큰(객체)을 만들기 위해서 이러한 interface를 미리 지정해뒀다고 생각하면 된다.
interface balance {
address: string;
amount: number;
}
interface token {
name: string;
symbol: string;
balances: balance[]; // Solidity에서는 mapping
}
solidity로 토큰 생성 코드를 작성할 때,
이것처럼 interface와 같은 규격이 존재해서 그 규격에 맞게 코드를 작성하는 것이다.
규격에 맞게 solidity 코드를 작성하면 이것이 토큰이 된다.
이더리움 네트워크 상의 스마트 컨트랙트 안에 상태변수로 name, symbol, balances 등이 있다면 특정 화면(메타마스크 등)에서는 토큰이라고 화면에 보여주게끔 지정해 놓았기 때문이다.
(다른 변수명으로 바꿔도 동작은 하지만, 스마트 컨트랙트 내용을 전달했을 때 메타마스크에서 토큰이라고 인지하지 못할 것이다)
스마트 컨트랙트를 사용해 토큰을 만들기 위해서는 반드시 정해진 규격을 따라야한다.
밸런스(balances)에 대한 자세한 내용은 블록체인(Block Chain) - 트랜잭션(Transaction) 포스트에서
ERC(Ethereum Request for Comments)
는,
이더리움 상의 프로그래밍 표준
을 개괄적으로 설명하는 기술 문서.
위에서 설명했듯이, 표준은 아래와 같이 정의되어있다.
function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
ERC는 애플리케이션과 콘트랙트가 보다 쉽게 상호작용하는 규약을 만드는 것을 목표로 한다.
개발자들은 전반적인 사항을 따르면 되며, 복잡한 시스템을 개발하지 않아도 된다.
이들은 업계 전반에서 이미 사용되고 있는 기반 위에서 개발을 진행하면 된다.
필요한 이더리움과 호환성이 있는 모든 요구 사항을 충족시키는 표준은 ERC-20
으로 간주된다.
ERC-20 토큰은 이더리움과 교환 가능하며 이더리움 지갑으로 전송이 가능하다.
다양한 디앱에 흩어진 ERC_20 표준 호환 토큰은 나중에 통합되어 한 번에 이더로 모두 바꾸어 현금화할 수 있다.
ERC-20 토큰은 스마트 계약
의 속성을 지원해야만 한다.
따라서 DApp은 이더리움 블록체인 플랫폼을 활용해 자신의 비즈니스를 구현하고,
자금모집 및 거래체계, 플랫폼 사용료를 이더리움으로 지불하는 체계를 가지고 토큰을 발행하는 곳 많다.
ERC-20 토큰이 생성되면, ERC-20 표준을 지원하는 서비스 및 소프트웨어(소프트웨어 지갑, 하드웨어 지갑, 거래소 등)와 자동으로 호환된다.
totalSupply ()
함수: 총발행량을 말하며, 총발행량은 토큰이 총 몇 개나 있는지 알려주고 생성되어 순황에 사용할 수 있는 토큰 수를 지정한다.
transfer()
함수 : 송금을 말하며, 이 함수를 통해 토큰을 총 발행 주소에서 개인 계정으로 송금할 수 있다. 초기 토큰 배포를 지정된 지갑으로 실행한다. 이 함수는 ICO 토큰이 일반적으로 ERC-20 토큰이다.
balanceOf ()
함수 : 잔액을 말하며, 계정에 있는 토큰을 반환하고, 모든 지갑의 토큰 균형을 추적한다.
transferFrom ()
함수 : 사용자는 송금 기능을 사용하여 측정 토큰을 사용자가 전송하고 교환한 수 있다. 이 함수는 지갑 주소, 수령인, 송금액을 얻은 중개인처럼 작동한 다음 거래를 수행한다.
approve ()
함수 : 승인 기능은 사람들이 위조 토큰을 만드는 것을 방지한다. 토큰의 총 발행 양을 확인해 트랜잭션을 허용하거나 거부하고, 최대 토큰 수를 유지 관리하고 어떤 지갑에 어떤 토큰이 있는지 추적한다.
allowance ()
함수 : 허용 기능으로 누군가가 시스템을 속이고 본인이 소유한 것보다 더 많은 토큰을 보내고자 하는 상황일 때, 허용 기능 덕분에 사용자들은 자신들이 가진 것보다 더 많은 토큰을 보낼 수 없다. 거래가 이루어지면 취소된다. 모든 트랜잭션은 트랜잭션이 실행되기 전에 유효한지 이중으로 확인된다.
ERC-721
은 개발자들이나 복수의 소유자들 사이에서 공유될 수 없는 토큰,NFT(Non-Fungible Token)
을 개발할 수 있게 한다.
개별적인 각각의 NFT를 위한 기능과 상태를 포함하게 해준다.
ERC-721
은 본질적으로 토큰이 디앱 내에서 공유될 수 있고, 미래 NFT 생성에 영향을 미칠 수 있는 수집물이 되도록 한다.
NFT는 무제한으로 공급이 가능하다. 하지만 NFT의 가치가 떨어지지 않게 하려고 대부분의 디앱 프로젝트는 전체 공급량을 제한한다.