ERC란 Ethereum Request for Comments의 약자로, 이더리움 생태계에서 표준화된 스마트 계약을 개발하기 위한 제안서입니다.
ERC-20은 이더리움에서 가장 유명하고 대표적인 ERC로, ‘대체 가능한 토큰’을 만드는 데 사용되는 기술 표준입니다. ERC-20은 이더리움 스마트 계약을 기반으로 한 토큰의 기본 규격을 정의하는 표준화된 프로토콜입니다. 토큰 스탠다드 중 가장 많이 사용되는 스탠다드 중 하나이며 이더리움 블록체인 상에서 토큰을 구현하는 방법에 대한 표준을 정의합니다. Aave, Uniswap, Tether 등 ERC-20 토큰은 수천 개 이상으로 많은 토큰들이 발행되고 있습니다.
스마트 계약은 컴퓨터 프로그래밍이 자동으로 계약 조건을 실행하는 프로그램입니다. 이는 계약의 조건과 규정을 코드로 작성하여 블록체인에 배포하고, 블록체인 네트워크 상에서 실행됩니다. 스마트 계약은 중앙 집권적인 기관이나 중개자 없이 자동으로 실행되어 신뢰성과 투명성을 제공합니다.
ERC-20의 필요성은 이더리움 블록체인에서 토큰을 표준화하고 상호 운용성을 확보하기 위함입니다. 아래는 ERC-20의 필요성을 설명하는 몇 가지 이유입니다.
ERC-20은 토큰은 이더리움 스마트 계약과 쉽게 통합될 수 있습니다. 이는 스마트 계약이나 다른 ERC-20 토큰을 상호 작용하는 데 편리함을 제공합니다.
대다수의 암호화폐 거래소와 지갑은 ERC-20 토큰을 지원합니다. 따라서 ERC-20 토큰은 더 넓은 생태계에서 거래 및 보관이 가능하며 사용자들이 쉽게 이용할 수 있습니다.
많은 프로젝트들은 ERC-20을 기반으로 자신의 토큰을 만들어 ICO나 토큰 발행을 진행합니다. ERC-20의 표준화는 이러한 프로세스를 단순화하고 투자자 간의 토큰 이동을 원활하게 합니다.
ERC-20 표준을 사용하면 토큰 개발에 필요한 기능을 미리 정의해 놓았기 때문에 개발자들은 새로운 토큰을 만들 때 표준 함수 및 이벤트를 사용하여 생산성을 향상시킬 수 있습니다.
이러한 이유로 ERC-20은 이더리움 생태계에서 가장 널리 사용되는 토큰 표준 중 하나로 자리매김하게 되었습니다.
아래는 기본적인 ERC-20 토큰 스마트 계약의 솔리디티 코드입니다. ERC-20은 이더리움 스마트 계약에서 토큰을 정의하는 표준 규약 중 하나로, 토큰의 기본적인 기능을 제공합니다.
totalSupply
: 해당 스마트 컨트랙트 기반 ERC-20 토큰의 총발행량 확인
balanceOf
: owner가 가지고 있는 토큰의 보유량 확인
transfer
: 토큰을 전송
approve
: spender에게 value 만큼의 토큰을 일출할 권리를 부여. 이 함수를 이용할 때는 반드시 Approval 이벤트 함수를 호출해야 함
allowance
: owner가 spender에게 양도 설정한 토큰의 양을 확인
transferFrom
: spender가 거래 가능하도록 양도 받은 토큰을 전송
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract ERC20Token {
// 토큰의 이름, 심볼, 총 공급량을 저장하는 변수
string public name;
string public symbol;
uint256 public totalSupply;
// 각 주소별 잔고를 저장하는 매핑
mapping(address => uint256) public balanceOf;
// 주소별 다른 주소에 대한 승인량을 저장하는 매핑
mapping(address => mapping(address => uint256)) public allowance;
// 토큰 전송 시 발생하는 이벤트
event Transfer(address indexed from, address indexed to, uint256 value);
// 특정 주소에 대한 승인 시 발생하는 이벤트
event Approval(address indexed owner, address indexed spender, uint256 value);
// 생성자: 토큰의 이름, 심볼, 초기 공급량 설정
constructor(string memory _name, string memory _symbol, uint256 _initialSupply) {
name = _name;
symbol = _symbol;
totalSupply = _initialSupply;
balanceOf[msg.sender] = _initialSupply;
}
// 주소로 토큰을 전송하는 함수
function transfer(address _to, uint256 _value) external returns (bool) {
require(_to != address(0), "Transfer to the zero address");
require(balanceOf[msg.sender] >= _value, "Insufficient balance");
// 전송 수행
balanceOf[msg.sender] -= _value;
balanceOf[_to] += _value;
// Transfer 이벤트 발생
emit Transfer(msg.sender, _to, _value);
return true;
}
// 다른 주소에 대한 승인을 설정하는 함수
function approve(address _spender, uint256 _value) external returns (bool) {
// 승인량 설정
allowance[msg.sender][_spender] = _value;
// Approval 이벤트 발생
emit Approval(msg.sender, _spender, _value);
return true;
}
// 특정 주소로부터 다른 주소로 토큰을 전송하는 함수
function transferFrom(address _from, address _to, uint256 _value) external returns (bool) {
require(_from != address(0), "Transfer from the zero address");
require(_to != address(0), "Transfer to the zero address");
require(balanceOf[_from] >= _value, "Insufficient balance");
require(allowance[_from][msg.sender] >= _value, "Insufficient allowance");
// 전송 수행
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
allowance[_from][msg.sender] -= _value;
// Transfer 이벤트 발생
emit Transfer(_from, _to, _value);
return true;
}
}
ERC-721은 이더리움 블록체인에서 대체 할 수 없거나 고유한 토큰을 작성하는 방법을 설명하는 무료 공개 표준입니다. 다른 개발자가 따르기로 동의한 템플릿 또는 형식. 코드 작성이 더 쉽고 예측 가능하며 재사용이 가능하기 때문에 개발자는 동일한 표준을 따릅니다. 이러한 표준은 완전히 자발적이지만 널리 사용되는 표준을 따르는 것은 다음을 포함한 다양한 응용 프로그램과의 호환성을 의미합니다.
아래는 간단한 ERC-721 토큰을 구현한 스마트 계약의 예시 코드입니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyNFT is ERC721, Ownable {
// ERC-721 토큰의 생성자
constructor() ERC721("MyNFT", "MNFT") {}
// 주어진 주소에 새로운 토큰을 생성하고 할당
function mint(address to, uint256 tokenId) external onlyOwner {
// _safeMint 함수를 사용하여 안전하게 토큰 생성 및 할당
_safeMint(to, tokenId);
}
}
이 코드는 OpenZeppelin 라이브러리를 사용하여 ERC-721 토큰을 구현하고 있습니다. 코드의 주요 구성 요소는 다음과 같습니다:
ERC721
를 상속받아 ERC-721 토큰을 정의합니다.Ownable
을 상속받아 소유자 관련 기능을 사용할 수 있습니다.constructor
에서 토큰의 이름(MyNFT)과 심볼(MNFT)을 설정합니다.mint
함수는 토큰을 생성하고 특정 주소에 할당하는 함수입니다.onlyOwner
제한자를 사용하여 오직 계약의 소유자만이 이 함수를 호출할 수 있습니다._safeMint
함수를 사용하여 안전하게 토큰을 생성하고 전송합니다.이 코드를 사용하면 ERC-721 토큰을 생성하고, 특정 주소에 특정 ID의 토큰을 할당할 수 있습니다. 이러한 토큰은 고유한 식별자를 가지며, 소유자가 소유하고 다른 주소 간에 전송될 수 있습니다.
ERC-1155는 다중 자산 토큰 표준으로, 이더리움 스마트 계약에서 여러 종류의 토큰을 관리할 수 있도록 하는 표준입니다. ERC-1155는 ERC-20 및 ERC-721의 특징을 통합하면서도 가스 비용을 최적화하는 방식으로 설계되었습니다.
ERC-1155 코드는 다양한 구현체가 있을 수 있습니다. 아래는 간단한 ERC-1155 스마트 계약의 예시 코드입니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyERC1155Token is ERC1155, Ownable {
// 토큰 ID에 따른 토큰 잔고
mapping(uint256 => uint256) private _tokenBalances;
// 토큰 ID에 따른 URI
mapping(uint256 => string) private _tokenURIs;
// 새로운 토큰 생성 시 발생하는 이벤트
event Minted(address indexed account, uint256 tokenId, uint256 amount);
// 토큰 URI 변경 시 발생하는 이벤트
event URIUpdated(uint256 tokenId, string newURI);
// 생성자
constructor() ERC1155("https://myapi.com/api/token/{id}.json") {
// 컨트랙트 소유자에게 초기 어떤 토큰을 발행하고자 할 때 사용
mint(msg.sender, 1, 100);
}
// 특정 토큰을 새로 발행하는 함수
function mint(address account, uint256 tokenId, uint256 amount) public onlyOwner {
_mint(account, tokenId, amount, "");
_tokenBalances[tokenId] += amount;
emit Minted(account, tokenId, amount);
}
// 특정 토큰의 URI를 변경하는 함수
function updateURI(uint256 tokenId, string memory newURI) public onlyOwner {
_tokenURIs[tokenId] = newURI;
emit URIUpdated(tokenId, newURI);
}
// ERC1155의 URI 함수를 오버라이드하여 토큰별로 URI를 제공
function uri(uint256 tokenId) public view override returns (string memory) {
return _tokenURIs[tokenId];
}
}
이 코드는 OpenZeppelin 라이브러리를 사용하고 있으며, 토큰을 발행하고 URI를 관리하는 간단한 ERC-1155 스마트 계약을 보여줍니다. 컨트랙트 소유자만이 새로운 토큰을 발행하거나 URI를 업데이트할 수 있습니다.
지금까지 이더리움 표준 토큰 ERC에 대해서 알아봤습니다. 이더리움 표준에 대한 지속적인 학습과 적응은 블록체인 생태계를 이해하고 참여하는 데 있어 필수적인 요소가 됩니다. 이 기술들이 제공하는 기회를 최대한 활용해서 효율적인 디지털 자산 생태계를 만들어 나가보세요.