간단한 방법으로 ERC20 토큰을 만드는 방법

게시 됨: 2022-03-11

이 기사의 목표는 가능한 한 짧은 시간에 ERC20 토큰을 생성하는 방법을 보여주는 것입니다.

기본 사항부터 시작하겠습니다 . ERC20 토큰이란 무엇입니까?

최근 몇 년 동안 ERC20 토큰 사양은 이더리움 토큰의 사실상 표준이 되었습니다. 즉, 오늘날 대부분의 이더리움 계약은 ERC20을 준수합니다. 이 기사에서는 자신만의 이더리움 토큰을 만드는 방법을 자세히 설명하지만 시작하기 전에 ERC20 표준을 자세히 살펴보겠습니다.

ERC20 토큰 일러스트레이션

ERC20 토큰이 매력적이고 성공적인 이유는 무엇입니까? 몇 가지 요인이 작용합니다.

  1. 이 튜토리얼에서 볼 수 있듯이 ERC20 토큰은 간단하고 배포하기 쉽습니다.
  2. ERC20 표준은 블록체인 기반 시장과 암호화폐 지갑이 관리하는 토큰 범위와 통신하기 위해 표준화된 단일 명령 세트가 필요하기 때문에 중요한 문제를 해결합니다. 여기에는 다른 토큰 간의 상호 작용 규칙과 토큰 구매 규칙이 포함됩니다.
  3. Ethereum 토큰 표준화를 제공하는 최초의 인기 사양이었습니다. 절대 최초 는 아니지만 그 인기 덕분에 순식간에 업계 표준이 되었습니다.

다른 이더리움 토큰과 마찬가지로 ERC20 토큰은 스마트 계약으로 구현되며 이더리움 가상 머신(EVM)에서 분산 방식으로 실행됩니다.

Solidity: 스마트 계약 프로그래밍 언어

Ethereum 스마트 계약은 Solidity로 작성됩니다. 대체 언어가 있지만 이 목적으로 사용하는 사람은 거의 없습니다. Solidity는 JavaScript와 유사하므로 JavaScript 또는 Java 및 기타 C 유사 언어에 대한 지식이 있는 경우 사용할 수 있을 만큼 Solidity를 실제로 마스터하기 전에도 Solidity의 코드 조각을 파악하는 데 문제가 없습니다. 그것.

바로 여기서 간단한 ERC20 계약 생성을 시작할 수 있어야 하므로 재미가 시작됩니다. 이것은 이 기사에서 1시간 이내에 ERC20 토큰을 작성하고 배포하는 방법을 보여줄 만큼 간단한 작업입니다.

이 데모에서 생성할 토큰은 너무 많은 종소리와 휘파람 없이 베어본 ERC20 구현이 될 것입니다. 그러나 실제 세계에서 유사하게 간단한 토큰을 많이 보았고 꽤 잘하는 경향이 있습니다.

ERC20 토큰 표준 개요

ERC20이란 무엇입니까?

간단히 말해서, ERC20 표준은 다른 계약, 지갑 또는 시장과의 통합을 허용하기 위해 모든 ERC20 토큰에 의해 구현될 기능 세트를 정의합니다. 이 기능 세트는 다소 짧고 기본적입니다.

 function totalSupply() public view returns (uint256); function balanceOf(address tokenOwner) public view returns (uint); function allowance(address tokenOwner, address spender) public view returns (uint); function transfer(address to, uint tokens) public returns (bool); function approve(address spender, uint tokens) public returns (bool); function transferFrom(address from, address to, uint tokens) public returns (bool);

ERC20 기능을 사용하면 암호 지갑 앱과 같은 외부 사용자가 사용자의 잔액을 찾고 적절한 권한이 있는 한 사용자에서 다른 사용자에게 자금을 이체할 수 있습니다.

스마트 계약은 특별히 정의된 두 가지 이벤트를 정의합니다.

 event Approval(address indexed tokenOwner, address indexed spender, uint tokens); event Transfer(address indexed from, address indexed to, uint tokens);

이러한 이벤트는 사용자에게 계정에서 토큰을 인출할 수 있는 권한이 부여되고 토큰이 실제로 전송된 후에 호출되거나 내보내 집니다.

표준 ERC20 기능 외에도 많은 ERC20 토큰에는 추가 필드가 있으며 일부는 실제로 서면으로 작성되지 않은 경우 ERC20 표준의 사실상 일부가 되었습니다. 다음은 그러한 필드의 몇 가지 예입니다.

 string public constant name; string public constant symbol; uint8 public constant decimals;

다음은 ERC20 및 Solidity 명명법에 관한 몇 가지 사항입니다.

  • public 함수는 계약 자체 외부에서 액세스할 수 있습니다.
  • view 는 기본적으로 상수를 의미합니다. 즉, 계약의 내부 상태는 함수에 의해 변경되지 않습니다.
  • event 는 클라이언트(예: 애플리케이션 프론트엔드)가 계약 내 특정 상황에 대해 알림을 받을 수 있도록 하는 Solidity의 방법입니다.

필수 Java/JavaScript 기술을 이미 보유하고 있다면 대부분의 Solidity 언어 구성이 명확해야 합니다.

Solidity에서 ERC20 토큰 작성

견고함의 ERC20 토큰

이제 기본 사항을 설명하고 ERC20 토큰을 생성하는 데 필요한 사항을 설명했으므로 몇 가지 논리 작성을 시작할 때입니다.

먼저 두 개의 매핑 개체를 정의해야 합니다. 이것은 연관 또는 키/값 배열에 대한 Solidity 개념입니다.

 mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed;

mapping(address => uint256) 표현식은 키가 address 유형(계정 주소를 표시하는 데 사용되는 숫자)이고 값이 uint256 유형(일반적으로 토큰 잔액을 저장하는 데 사용되는 256비트 정수)인 연관 배열을 정의합니다.

첫 번째 매핑 개체인 balances 는 각 소유자 계정의 토큰 잔액을 보유합니다.

두 번째 매핑 개체인 allowed 에는 각 계정에 허용된 출금 금액과 함께 해당 계정에서 출금하도록 승인된 모든 계정이 포함됩니다.

보시다시피, 허용된 매핑의 값 필드는 그 자체로 계정 주소를 승인된 인출 금액에 매핑하는 매핑입니다.

다른 모든 계약 필드와 함께 이러한 매핑은 블록체인에 저장 되고 마이닝 되어 모든 네트워크 사용자 노드에 변경 사항이 전파됩니다.

블록체인 스토리지는 비싸고 계약 사용자는 어떤 식으로든 비용을 지불해야 합니다. 따라서 항상 스토리지 크기를 최소화하고 블록체인에 쓰기 위해 노력해야 합니다.

이제 필요한 데이터 구조가 준비되었으므로 실제로 ERC20 로직을 적절한 함수에 작성하기 시작할 수 있습니다.

ICO 토큰 수 설정

ICO 토큰의 수는 어떻게 설정합니까? 글쎄, ICO 토큰의 최대 수를 설정하는 방법에는 여러 가지가 있으며 이 문제는 그 자체로 긴 토론의 가치가 있을 수 있습니다.

ECR20 튜토리얼의 필요에 따라 가장 간단한 접근 방식을 사용할 것입니다. 계약 생성 시 총 토큰 양을 설정하고 처음에 모든 토큰을 "계약 소유자", 즉 스마트 계약을 배포한 계정에 할당합니다.

 uint256 totalSupply_; constructor(uint256 total) public { totalSupply_ = total; balances[msg.sender] = _totalSupply; }

생성자는 컨트랙트가 배포된 직후 이더리움이 자동으로 호출하는 특수 기능입니다. 일반적으로 계약의 배포 계정에서 전달한 매개변수를 사용하여 토큰의 상태를 초기화하는 데 사용됩니다.

msg 는 이더리움 자체에 의해 선언되고 채워지는 전역 변수입니다. 계약 이행을 위한 중요한 데이터를 담고 있습니다. 여기에서 사용하는 필드: msg.sender 는 현재 계약 기능을 실행하는 이더리움 계정을 포함합니다.

배포 계정만 계약의 생성자를 입력할 수 있습니다. 계약이 시작되면 이 기능은 사용 가능한 토큰을 '계약 소유자' 계정에 할당합니다.

총 토큰 공급 받기

 function totalSupply() public view returns (uint256) { return totalSupply_; }

이 함수는 소유자에 관계없이 이 계약에 의해 할당된 모든 토큰의 수를 반환합니다.

소유자의 토큰 잔액 가져오기

 function balanceOf(address tokenOwner) public view returns (uint) { return balances[tokenOwner]; }

balanceOf 는 소유자 주소로 식별되는 계정의 현재 토큰 잔액을 반환합니다.

다른 계정으로 토큰 전송

 function transfer(address receiver, uint numTokens) public returns (bool) { require(numTokens <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender] — numTokens; balances[receiver] = balances[receiver] + numTokens; emit Transfer(msg.sender, receiver, numTokens); return true; }

이름에서 알 수 있듯이 transfer 함수는 소유자의 잔액에서 다른 사용자 또는 receiver 의 잔액으로 numTokens 토큰 양을 이동하는 데 사용됩니다. 양도하는 소유자는 msg.sender , 즉 기능을 실행하는 사람이며, 이는 토큰 소유자만 다른 사람에게 토큰을 양도할 수 있음을 의미합니다.

술어를 주장하는 Solidity의 방법은 require 입니다. 이 경우 이체 계좌에 이체를 실행할 수 있는 충분한 잔액이 있습니다. require 문이 실패하면 트랜잭션은 블록체인에 기록된 변경 사항 없이 즉시 롤백됩니다.

종료 직전에 이 함수는 등록된 리스너가 완료에 반응할 수 있도록 ERC20 이벤트 Transfer 를 발생시킵니다.

토큰 인출 위임 승인

이 기능은 토큰 시장 시나리오에서 가장 자주 사용됩니다.

 function approve(address delegate, uint numTokens) public returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true; }

approve 이 하는 일은 소유자(예: msg.sender )가 위임 계정(아마도 마켓플레이스 자체)을 승인하여 자신의 계정에서 토큰을 인출하고 다른 계정으로 전송할 수 있도록 하는 것입니다.

보시다시피 이 기능은 소유자가 시장에서 토큰을 제공하는 시나리오에 사용됩니다. 이를 통해 시장은 사전 승인을 기다리지 않고 거래를 완료할 수 있습니다.

실행이 끝나면 이 함수는 Approval 이벤트를 발생시킵니다.

출금 승인된 토큰 수 얻기

 function allowance(address owner, address delegate) public view returns (uint) { return allowed[owner][delegate]; }

이 함수는 approve 함수에 설정된 대로 소유자가 현재 승인한 토큰 수를 특정 대리인에게 반환합니다.

대리인에 의한 토큰 전송

transferFrom 함수는 이전에 논의한 approve 함수의 피어입니다. 출금이 승인된 대리인이 소유자 자금을 제3자 계정으로 이체할 수 있습니다.

 function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) { require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner] — numTokens; allowed[owner][msg.sender] = allowed[from][msg.sender] — numTokens; balances[buyer] = balances[buyer] + numTokens; Transfer(owner, buyer, numTokens); return true; }

함수 시작 시 두 개의 require 문은 트랜잭션이 합법적인지 확인하는 것입니다. 즉, 소유자가 전송할 토큰이 충분하고 위임자가 (적어도) numTokens 를 철회할 수 있는 승인을 받았습니다.

numTokens 금액을 소유자에서 구매자로 전송하는 것 외에도 이 기능은 대리인의 수당에서 numTokens 를 뺍니다. 이를 통해 기본적으로 주어진 수당이 있는 대리인이 이를 여러 개의 별도 인출로 나눌 수 있으며 이는 일반적인 시장 행동입니다.

여기서 멈추고 유효한 ERC20 구현을 가질 수 있습니다. 그러나 우리는 산업 강도 토큰을 원하기 때문에 한 단계 더 나아가고 싶습니다. 이것은 우리가 우리의 코드를 좀 더 안전하게 만들 것을 요구하지만, 비록 기본은 아닐지라도 토큰을 상대적으로 단순하게 유지할 수는 있을 것입니다.

SafeMath Solidity 라이브러리

SafeMath 는 해커가 계약을 위반하는 것으로 알려진 한 가지 방법인 정수 오버플로 공격을 처리하기 위한 Solidity 라이브러리입니다. 이러한 공격에서 해커는 관련 정수가 최대값을 넘어서는 매개변수를 전달하여 계약이 잘못된 숫자 값을 사용하도록 합니다.

Solidity의 Safemath 라이브러리: 일러스트레이션

SafeMath 는 산술 작업을 수행하기 전에 오버플로를 테스트하여 이를 방지하므로 오버플로 공격의 위험이 제거됩니다. 라이브러리가 너무 작아서 계약 크기에 대한 영향이 최소화되어 성능이 발생하지 않고 스토리지 비용에 대한 불이익이 거의 없습니다.

코드에 SafeMath 를 추가해 보겠습니다.

 library SafeMath { // Only relevant functions function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a — b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } }

SafeMathassert 문을 사용하여 전달된 매개변수의 정확성을 확인합니다. assert 이 실패하면 기능 실행이 즉시 중지되고 모든 블록체인 변경 사항이 롤백됩니다.

다음으로 Solidity 컴파일러에 라이브러리를 소개하는 다음 명령문을 추가해 보겠습니다.

using SafeMath for uint256;

그런 다음 처음에 사용한 순진한 산술을 SafeMath 함수로 바꿉니다.

 balances[msg.sender] = balances[msg.sender].sub(numTokens); balances[receiver] = balances[receiver].add(numTokens); balances[buyer] = balances[buyer].add(numTokens); balances[owner] = balances[owner].sub(numTokens);

모두 함께 포장

Solidity에서 스마트 계약의 기능과 이벤트는 "블록체인 클래스"로 자동 변환할 수 있는 계약 이라는 엔티티로 래핑됩니다. 아래는 코드 요지를 포함하여 생성한 ERC20 호환 계약입니다. 이름 및 기호 필드는 임의로 변경할 수 있습니다. 대부분의 토큰은 십진수 값을 18로 유지하므로 동일한 작업을 수행합니다.

이더리움 계약 배포

우리의 계약을 블록체인에 배포할 시간이 되었습니다. 배포 후 우리의 계약은 네트워크에 참여하는 모든 노드로 이전됩니다. 계약에 대한 모든 변경 사항은 참여하는 모든 노드에 전파됩니다.

Ethereum 개발자는 일반적으로 Truffle과 같은 배포 도구를 사용합니다. Truffle도 이 기사의 제한된 요구 사항에 과도하며 Remix라는 간단한 온라인 도구로 충분합니다.

이를 사용하려면 브라우저에 MetaMask 플러그인을 설치하고 Rinkeby Ether가 포함된 Rinkeby(이더리움 테스트 네트워크) 계정을 설치해야 합니다. 이것들은 비교적 간단한 단계이므로 자세히 설명하지 않겠습니다.

둘 중 하나가 없는 경우 MetaMask 및 Rinkeby로 이동하여 다운로드 링크를 확인하고 명확한 설치 및 사용 지침을 얻으십시오.

이제 모든 구성 요소가 준비되었으므로 Remix로 이동하여 pragma 라인과 SafeMath 라이브러리를 포함하여 위의 코드를 온라인 편집기에 붙여넣습니다.

그런 다음 오른쪽의 두 번째 탭인 " Run "으로 이동하여 " Deploy "를 클릭합니다. 거래 확인을 요청하는 MetaMask 팝업이 나타납니다. 물론 승인하겠습니다.

이미지 대체 텍스트

  • 녹색 상자: Rinkeby에 있는지 확인하십시오.
  • 파란색 상자: 총 토큰 공급 설정
  • 빨간 상자: 전개!

요지 : https://gist.github.com/giladHaimov/8e81dbde10c9aeff69a1d683ed6870be#file-basicerc20-sol

축하 해요! 진정한 이더리움 전문가처럼 첫 번째 ERC20 토큰을 배포했습니다. 약속한 대로 토큰은 간단하고 가벼우면서도 완벽하게 작동하며 ERC20 표준을 준수하며 MathSafe로 보호됩니다. 블록체인 전체에서 구매, 지불 및 전송할 준비가 되었습니다.

그것이 스마트 계약의 전부입니까?

우리의 간단한 데모는 표면을 거의 긁지 않고 스마트 계약 개발의 한 측면만 다루기 때문에 가깝지 않습니다.

스마트 계약은 비즈니스 로직, 사용자 상호 작용 모델링, 토큰 발행 및 소각 허용 여부, 계약에 도입하는 수명 주기 변경, 일반적으로 함께 제공되는 관리자 수준 기능의 필요성에 따라 훨씬 더 복잡할 수 있습니다. 관리 권한이 부여된 기능 세트 등. 당신은 사진을 얻을.

그래도 여기에서 수행한 작업을 복제할 수 있다면 지식을 확장하고 필요할 때 더 복잡한 계약으로 넘어갈 수 있는 견고한 기반이 됩니다.