B L O C K C H A I N P L A T S
tạo Token ERC20 trên nền tảng Ethereum

Trong bài viết hôm nay, Blockchain Plats sẽ hướng dẫn bạn cách tạo Token ERC20 của riêng mình, có thể được sử dụng cho ICO và có thể được giao dịch trên Ethereum Blockchain.

1. Ethereum là gì?

Ethereum là một nền tảng mã nguồn mở dựa trên công nghệ blockchain cho phép các nhà phát triển để tạo ra và triển khai các ứng dụng phân tán .

Trong chuỗi khối Ethereum, Ether (ETH) là một mã thông báo tiền điện tử thúc đẩy mạng lưới khai thác để nâng cao sức mạnh tính toán. Ngoài vai trò là một loại tiền mã hóa có thể giao dịch , Ether còn được các nhà phát triển ứng dụng sử dụng để thanh toán phí giao dịch và các dịch vụ trong mạng Ethereum.

Tiêu chuẩn ERC20 là gì?

Token là tài sản kỹ thuật số hoặc chương trình dựa trên blockchain. Các token này phục vụ mục đích phân bổ giá trị cho chúng, chẳng hạn như kỳ phiếu, quyền tham gia lợi nhuận, dịch vụ hoặc đối tượng thực. Do đó, các token thường không bị nhầm lẫn với các loại tiền điện tử (ví dụ: Bitcoin hoặc Ether). Về cơ bản, các token được gọi là “Hợp đồng thông minh” , trong trường hợp của ERC20 được thực thi trên chuỗi khối Ethereum.

Giới thiệu tiêu chuẩn ERC20, Ethereum lần đầu tiên ban hành các thông số kỹ thuật cho token trên blockchain của nó vào năm 2015, trong đó “ERC” là viết tắt của “Ethereum Request for Comments” . Do đó ERC20 là một giao thức chuẩn mà xác định các tính chất và chức năng của một Ethereum blockchain thẻ .

So sánh Security token và Utility token

Nói chung, một token về cơ bản chỉ đơn giản là một đại diện kỹ thuật số của một điều gì đó tiềm năng . Ví dụ: token có thể đại diện cho cổ phiếu, trái phiếu, quyền chọn hoặc tài sản, v.v. Token cũng có thể đại diện cho quyền truy cập vào ứng dụng blockchain.

Utility token hay còn gọi là token tiện ích, là token có “công dụng” cụ thể trên blockchain hoặc một ứng dụng dựa trên đó. Utility token còn được gọi là “đồng tiền ứng dụng” vì chúng được thiết kế rõ ràng cho một ứng dụng hoặc chuỗi khối nhất định .

Vì lý do này, token tiện ích chỉ dành riêng cho việc sử dụng cụ thể như vậy và không phải là một công cụ đầu tư .

Mặt khác, Security token hay còn gọi là token bảo mật đại diện cho các khoản đầu tư, chẳng hạn như chứng khoán như cổ phiếu, trái phiếu, quỹ , v.v., bằng kỹ thuật số. Do đó, chứng khoán của các công ty, nhà quỹ hoặc quỹ bất động sản, được phát hành qua blockchain, được gọi là Security token..

2. Hướng dẫn tạo Token ERC20

Bước 1: Quyết định các thông tin về token

Để tạo token ERC20, bạn cần những điều sau:

– Tên token

– Biểu tượng của Token

– Số lượng token lưu hành

– Vị trí thập phân của token

Hầu hết các token có 18 chữ số thập phân, có nghĩa là bạn có thể có tối đa 0,0000000000000000001 token.

Bước 2: Tạo Smart Contract – Hợp đồng thông minh

Dưới đây là một hợp đồng về cơ bản bạn có thể “Sao chép / Dán” để tạo token ERC20 của mình. Gửi đến TokenFactory (https://github.com/ConsenSys/Token-Factory) để biết mã nguồn.

pragma solidity ^0.4.4;

contract Token {

/// @return total amount of tokens
function totalSupply() constant returns (uint256 supply) {}

/// @param _owner The address from which the balance will be retrieved
/// @return The balance
function balanceOf(address _owner) constant returns (uint256 balance) {}

/// @notice send `_value` token to `_to` from `msg.sender`
/// @param _to The address of the recipient
/// @param _value The amount of token to be transferred
/// @return Whether the transfer was successful or not
function transfer(address _to, uint256 _value) returns (bool success) {}

/// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
/// @param _from The address of the sender
/// @param _to The address of the recipient
/// @param _value The amount of token to be transferred
/// @return Whether the transfer was successful or not
function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {}

/// @notice `msg.sender` approves `_addr` to spend `_value` tokens
/// @param _spender The address of the account able to transfer the tokens
/// @param _value The amount of wei to be approved for transfer
/// @return Whether the approval was successful or not
function approve(address _spender, uint256 _value) returns (bool success) {}

/// @param _owner The address of the account owning tokens
/// @param _spender The address of the account able to transfer the tokens
/// @return Amount of remaining tokens allowed to spent
function allowance(address _owner, address _spender) constant returns (uint256 remaining) {}

event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

contract StandardToken is Token {

function transfer(address _to, uint256 _value) returns (bool success) {
//Default assumes totalSupply can’t be over max (2^256 – 1).
//If your token leaves out totalSupply and can issue more tokens as time goes on, you need to check if it doesn’t wrap.
//Replace the if with this one instead.
//if (balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]) {
if (balances[msg.sender] >= _value && _value > 0) {
balances[msg.sender] -= _value;
balances[_to] += _value;
Transfer(msg.sender, _to, _value);
return true;
} else { return false; }
}

function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
//same as above. Replace this line with the following if you want to protect against wrapping uints.
//if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]) {
if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) {
balances[_to] += _value;
balances[_from] -= _value;
allowed[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
} else { return false; }
}

function balanceOf(address _owner) constant returns (uint256 balance) {
return balances[_owner];
}

function approve(address _spender, uint256 _value) returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}

function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
return allowed[_owner][_spender];
}

mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
uint256 public totalSupply;
}

//name this contract whatever you’d like
contract ERC20Token is StandardToken {

function () {
//if ether is sent to this address, send it back.
throw;
}

/* Public variables of the token */

/*
NOTE:
The following variables are OPTIONAL vanities. One does not have to include them.
They allow one to customise the token contract & in no way influences the core functionality.
Some wallets/interfaces might not even bother to look at this information.
*/
string public name; //fancy name: eg Simon Bucks
uint8 public decimals; //How many decimals to show. ie. There could 1000 base units with 3 decimals. Meaning 0.980 SBX = 980 base units. It’s like comparing 1 wei to 1 ether.
string public symbol; //An identifier: eg SBX
string public version = ‘H1.0’; //human 0.1 standard. Just an arbitrary versioning scheme.

//
// CHANGE THESE VALUES FOR YOUR TOKEN
//

//make sure this function name matches the contract name above. So if you’re token is called TutorialToken, make sure the //contract name above is also TutorialToken instead of ERC20Token

function ERC20Token(
) {
balances[msg.sender] = NUMBER_OF_TOKENS_HERE; // Give the creator all initial tokens (100000 for example)
totalSupply = NUMBER_OF_TOKENS_HERE; // Update total supply (100000 for example)
name = “NAME OF YOUR TOKEN HERE”; // Set the name for display purposes
decimals = 0; // Amount of decimals for display purposes
symbol = “SYM”; // Set the symbol for display purposes
}

/* Approves and then calls the receiving contract */
function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);

//call the receiveApproval function on the contract you want to be notified. This crafts the function signature manually so one doesn’t have to include a contract in here just for this.
//receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData)
//it is assumed that when does this that the call *should* succeed, otherwise one would use vanilla approve instead.
if(!_spender.call(bytes4(bytes32(sha3(“receiveApproval(address,uint256,address,bytes)”))), msg.sender, _value, this, _extraData)) { throw; }
return true;
}
}

Bạn có thể thay đổi giá trị mình muốn trong khu vực có dòng chữ “CHANGE THESE VARIABLES FOR YOUR TOKEN”. Dưới đây sẽ là một số thông tin bạn cần thay đổi:

– Tên token

– Biểu tượng token: Không nên có quá 4 ký tự

– Vị trí thập phân

– Số lượng token đang lưu hành

Một số điều cần ghi nhớ:

– Nguồn cung cấp mà bạn đặt cho token có tương quan với số lượng vị trí thập phân mà bạn đã đặt.

– Ví dụ: nếu bạn muốn một token có 0 chữ số thập phân để có 100 token, thì nguồn cung cấp sẽ là 100.

– Nhưng nếu bạn có token với 18 chữ số thập phân và bạn muốn 100 chữ số trong số đó, thì nguồn cung cấp sẽ là 100000000000000000000 (18 số không được thêm vào số lượng).

2.1 Bạn đặt số lượng token bạn nhận được với tư cách là người tạo hợp đồng.

Đó là dòng mã này:

balances[msg.sender] = NUMBER_OF_TOKENS_HERE; 

Bất cứ thứ gì bạn đặt ở đây sẽ được gửi đến ví ETH của bất kỳ nơi nào bạn triển khai hợp đồng.

Nhưng bây giờ chỉ cần đặt điều này bằng với nguồn cung cấp để bạn nhận được tất cả các token. Nếu bạn muốn nâng cao hơn với logic token, bạn có thể đặt nó bằng các quy tắc khác nhau, chẳng hạn như những người sáng lập khác nhau trong các dự án của bạn sẽ nhận được số tiền khác nhau hoặc tương tự như vậy.

Khi bạn đã có tất cả các biến, bây giờ là lúc triển khai nó vào blockchain và kiểm tra nó.

Bước 3: Kiểm tra token trên TestNet

Tiếp theo, chúng ta sẽ triển khai hợp đồng với Mạng TestNet (mạng thử nghiệm) để xem nó có hoạt động không.

Trước tiên, hãy tải MetaMask . Họ có một giao diện dễ sử dụng để kiểm tra điều này.

Khi bạn đã cài đặt xong MetaMask, hãy đảm bảo rằng bạn đã đăng nhập và thiết lập trên mạng thử nghiệm Ropsten. Nếu bạn nhấp vào ở trên cùng bên trái nơi có thông báo ‘Mạng Ethereum chính’, bạn có thể thay đổi nó thành Ropsten.

Để xác nhận, cửa sổ MetaMask của bạn sẽ giống như sau:

Tạo Token ERC20

Ví này sẽ là ‘Chủ sở hữu’ của hợp đồng, vì vậy đừng làm mất ví này! Nếu bạn muốn nó không phải là Metamask, bạn cũng có thể sử dụng Mist hoặc MyEtherWallet để tạo hợp đồng. Tôi khuyên bạn nên sử dụng MM để đơn giản và bạn luôn có thể xuất khóa riêng của mình sang MyEtherWallet để sử dụng sau này.

Bây giờ hãy đến với Solidity Remix Compiler – Trình biên dịch Solidity Remix – đó là một trình biên dịch trực tuyến cho phép bạn xuất bản Hợp đồng thông minh lên blockchain.

Copy/Paste mã nguồn của hợp đồng bạn vừa sửa đổi vào cửa sổ chính. Nó sẽ trông giống như sau:

Tạo Token ERC20

Bây giờ, hãy chuyển đến cài đặt ở bên phải và chọn phiên bản trình biên dịch phát hành mới nhất, cũng như bỏ chọn Enable Optimization.

Vì vậy, nó sẽ trông giống như sau:

Tạo token Erc20

Lưu ý về phiên bản Solidity hiện tại trong trình biên dịch. Chúng ta sẽ cần nó sau để xác minh nguồn hợp đồng.

Bây giờ quay lại tab Contract và nhấn ‘Create’ dưới Tên của token mà bạn đã tạo. Tiếp theo,  bạn nhấn ‘Create’ trong ‘TutorialToken’.

Tạo token ERC20Điều gì sẽ xảy ra là MetaMask sẽ bật lên yêu cầu bạn nhấn ‘Submit’ để thanh toán cho giao dịch.

Hãy nhớ rằng, đây là mạng thử nghiệm Ropsten, vì vậy nó không phải là Ether thực. Bạn có thể kiểm tra lại để đảm bảo rằng bạn đang ở trên mạng thử nghiệm trong MetaMask trước khi nhấn gửi chỉ để chắc chắn.

Khi bạn nhấn Send, nó sẽ thông báo “Contract Pending” trong MetaMask. Khi nó đã sẵn sàng, hãy nhấp vào ‘Date’ và nó sẽ hiển thị giao dịch trong EtherScan. Như thế này:

Tạo token ERC20Nếu bạn nhấp vào Date, nó sẽ hiển thị màn hình sau:

Tạo token ERC20

Nếu quá trình này hoạt động, bây giờ đã đến lúc xác minh mã nguồn.

Nếu không, bạn sẽ muốn quay lại mã và sửa đổi nguồn để nó hoạt động.

3.1 Xem token tùy chỉnh

Bây giờ hãy xem liệu nó có thực sự tạo ra các token và gửi chúng cho tôi hay không.

Tạo token ERC20

Sao chép Contract Address – Địa chỉ hợp đồng được liệt kê trong Transaction Information – thông tin Giao dịch (xem ảnh chụp màn hình ở trên).

Trong trường hợp này, đối với tôi, đó là 0x5xxxxxxxxxxxxxxxx.

Tôi sẽ thêm nó vào tab ‘Tokens’ của MetaMask:

Tạo token ERC20

Khi tôi nhấp vào nút “+”, tôi có thể dán nó vào đó và nó sẽ tự động chèn thông tin của token, như sau:

Tạo token ERC20

Hãy nhấn ‘Add’.

Như vậy 100 token mà tôi đã tạo – nó đã hoạt động!

Bây giờ tôi có thể gửi token này đó hoặc bán chúng trên thị trường nếu tôi quyết định làm như vậy.

Tạo token ERC20

Bước 4. Xác minh mã nguồn

Điều này sẽ quan trọng vì nhiều lý do, chủ yếu là xác minh tính hợp lệ của token của bạn với công chúng.

Về mặt kỹ thuật, bạn có thể không xác minh mã nguồn, tuy nhiên, để cong khai minh bạch tôi nghĩ điều này là cần thiết.

Khi bạn đang ở trên màn hình Transactiontừ bước trước, hãy nhấp vào nơi có nội dung [Contract xxxxxx Created] trong trường Field: Đó là Hợp đồng mà chúng ta vừa xuất bản.

Tạo token ERC20

Sau đó nhấp vào tab “Contract Code”.

Tạo token ERC20

Nhấn Verify and Publish. Điều đó sẽ đưa bạn đến màn hình này:

Tạo token ERC20

Đây là nơi bạn CẦN có các cài đặt phù hợp.

Địa chỉ Contract Address sẽ được điền vào.

Đối với Contract name – Tên hợp đồng, hãy đảm bảo đặt tên của chức năng mà bạn đã sửa đổi cho token  của mình. Mặc định trong mã tôi đã cung cấp cho bạn là ERC20Token, nhưng nếu bạn đã đổi tên nó, hãy đảm bảo bạn đặt điều đó.

Tôi đã đổi tên thành ‘TutorialToken’ trong bài viết này.

Đối với Trình biên dịch – Compiler, hãy chọn SAME bạn đã sử dụng trong Solidity Compiler. Nếu không, bạn sẽ không thể xác minh mã nguồn của mình!

Đảm bảo rằng OPtimization cũng bị tắt.

Sau đó Copy/Paster mã từ trình biên dịch ngay vào trường Contract Code

Nhấn Submit

Nếu bạn làm đúng các bước, bạn sẽ nhận được một thứ như sau:

Tạo token ERC20

Điều đó có nghĩa là nó đã được xác minh.

Nếu bạn truy cập trang địa Contrat Address, bạn sẽ thấy “Contract Source’ cho biết Yes rằng nó đã được Xác minh

Nếu không, hãy kiểm tra lại các bước của bạn hoặc đưa ra nhận xét trong chuỗi này và chúng tôi sẽ xem điều gì đã xảy ra.

Bước 5. Triển khai trên mạng chính Mainnet

Bây giờ mọi thứ đã hoạt động, đã đến lúc triển khai nó trên MainNet và cho phép người khác sử dụng nó.

Chỉ cần thực hiện bước 3 & 4, nhưng thay vì được kết nối với Mạng thử nghiệm Ropsten, bạn muốn được kết nối với Mạng chính. Đảm bảo rằng tài khoản MetaMask của bạn đang ở chế độ Mainnet.

Tạo token ERC20

Bạn sẽ cần tài trợ hợp đồng của mình bằng Ether thực để thực hiện việc này. Điều này có thể tốn khoảng 30$

Bước 6. Xác minh nó trên Etherscan

Bước này không bắt buộc, nhưng nó làm tăng thêm tính hợp lệ của token nếu bạn được họ xác minh.

Bạn có thể thấy cách mã thông báo của tôi được xác minh bằng cách nó có biểu tượng và nó không có dòng chữ “UNVERIFIED” bên cạnh.

Để thực hiện việc này, bạn cần phải truy cập Trang liên hệ với chúng tôi của Etherscan ) và gửi cho họ một e-mail với thông tin sau:

– Đảm bảo rằng mã nguồn hợp đồng mã thông báo của bạn đã được xác minh

– Cung cấp cho chúng tôi URL trang web chính thức của bạn:

– Địa chỉ Hợp đồng:

– Link tải logo biểu tượng 28x28png:

Vì vậy, có, bạn sẽ cần phải có một trang web với mục đích đã nêu của token

Họ sẽ liên hệ lại với bạn và cho bạn biết liệu họ có xác minh điều đó hay không. Hãy nhớ rằng, Etherscan là một dịch vụ tập trung, vì vậy rất có thể họ sẽ không xác minh token của bạn nếu họ cho rằng nó không xứng đáng.

Bây giờ bạn có token trên ETH MainNet mà người khác có thể sử dụng. Bây giờ nó đã sẵn sàng để gửi và nhận.

Chúc bạn thành công.

>> Xem thêm: Hướng dẫn chi tiết cách tạo hợp đồng thông minh (smart contract) trên Ethereum

Bài viết liên quan

Leave a Comment

Là một nhà phát triển có nhiều kinh nghiệm, Blockchain Plats thúc đẩy sự thành công của các doanh nghiệp thông qua các giải pháp tài chính, ứng dụng Blockchain và tiền điện tử sáng tạo, bảo mật và minh bạch

Liên hệ