이전글
ERC-20 토큰
이번 글에서는 ERC-20 토큰에 대해 알아보겠습니다.
1. ERC-20 토큰
스마트 컨트랙트 기반 토큰은 이더리움의 스마트 컨트랙트를 통해 사용할 수 있는 암호화폐입니다. 솔리디티의 상태 변수와 함수를 이용하면 토큰을 만들 수 있습니다. 토큰에 대한 더 자세한 내용은 아래 글을 참고해 주세요.
토큰이 송수신될 수 있도록 적절하게 코드를 작성하면 다양한 방식으로 토큰을 만들 수 있습니다. 하지만 컨트랙트마다 사용한 함수나 변수가 모두 다를 경우 서로 다른 토큰 간의 호환이 어려워집니다. 따라서 이더리움 개발자들은 미리 토큰 표준을 정해놓고, 이 표준에 맞춰서 토큰을 생성하는 것을 권장하게 되었습니다.
ERC-20은 이러한 토큰 표준 중 하나로, 현재 가장 많이 쓰이고 있는 토큰 표준입니다. ERC-20은 다음과 같은 함수와 이벤트를 표준으로 정하고 있습니다.
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-20 기반의 토큰이 됩니다.
2. OpenZeppelin 활용
ERC-20 토큰을 생성하기 위해서 표준에 맞춰 모든 코드를 직접 작성하는 방법도 있지만, OpenZeppelin에서 제공하는 코드를 임포트 하여 보다 간편하게 토큰을 생성하는 방법도 있습니다.
다음과 같이 import로 관련 코드를 불러온 후, 토큰 컨트랙트에 ERC-20을 상속합니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract TESTToken is ERC20("Test", "TST") {
constructor(uint256 initialSupply) {
_mint(msg.sender, initialSupply);
}
}
코드 작성 이후 토큰의 초기 유통량과 함께 컨트랙트를 배포하면, Test라는 이름을 가진 토큰을 생성할 수 있습니다. 컨트랙트 배포 이후 다음과 같은 각종 함수들을 확인할 수 있습니다.
각 함수를 하나씩 살펴보겠습니다. totalSupply, symbol, name은 각각 전체 발행량, 토큰의 별명, 토큰의 이름을 반환합니다.
decimals의 경우 토큰의 단위 크기를 위한 값입니다. 예를 들어 1 TST를 다른 사람에게 전송할 경우 실제로는 1 * 10^18 TST가 전송됩니다. 이때의 18이 바로 decimals입니다. 만약 decimals가 16일 경우 1 * 10 ^ 16이 전송될 것입니다. decimals의 값 변경은 해당 함수를 오버라이딩하여 리턴 값을 조정하면 됩니다.
balnceOf는 특정 EOA의 토큰 잔액을 조회하기 위한 함수입니다. EOA의 주소를 입력하면 해당 EOA의 토큰 잔액을 확인할 수 있습니다. 토큰을 배포한 EOA가 초기 발행량을 모두 할당받도록 코드를 작성했기 때문에, 해당 EOA가 전체 발행량만큼의 토큰을 보유하고 있는 것을 확인할 수 있습니다.
transfer와 transferFrom은 토큰을 전송하기 위한 함수입니다. transfer은 토큰을 전송받을 주소와 전송할 개수만을 입력하여 토큰을 전송합니다.
transferFrom은 토큰을 전송한 주소도 입력합니다. transferFrom으로 토큰을 전송할 경우 미리 허용된 금액보다 적은 금액만 전송할 수 있습니다. 허용될 금액을 설정하고 싶다면 approve 함수를 이용하면 됩니다. 전송을 허용할 주소와 토큰 수량을 입력하여 함수를 호출하면, 허용될 금액이 설정됩니다.
increaseAllowance와 decreaseAllowance를 이용하면 허용된 토큰의 양을 증가시키거나 감소시킬 수 있습니다. 두 함수 모두 전송을 허용할 주소와 허용할 금액의 증가 또는 감소량을 입력합니다.
현재 허용된 금액이 얼마인지 알고 싶다면 allowance 함수를 사용하면 됩니다. 토큰을 전송할 주소와 전송받을 주소를 입력해 확인할 수 있습니다.
허용된 금액이 적절하게 적용되었다면, trasnferFrom을 통해 토큰을 전송할 수 있습니다. transfer와는 다르게 토큰을 받을 EOA가 함수를 호출해야 합니다.
최종 전송 결과를 balanceOf로 확인할 수 있습니다. 또한 허용량 역시 토큰을 전송한 만큼 줄어든 것을 확인할 수 있습니다.
지금까지 ERC-20 토큰에 대해 알아봤습니다. 감사합니다.
다음글
'이더리움 > 솔리디티' 카테고리의 다른 글
[솔리디티] 19. 메타마스크, 테스트넷 배포 (0) | 2023.08.27 |
---|---|
[솔리디티] 18. ERC-721 NFT (0) | 2023.08.18 |
[솔리디티] 16. import, 라이브러리 (0) | 2023.08.10 |
[솔리디티] 15. 인터페이스 (0) | 2023.08.09 |
[솔리디티] 14. 상속, 오버라이딩, 다중 상속 (0) | 2023.08.07 |