Cách tạo và deploy một token ERC-20?

Mạng Ethereum ra mắt vào năm 2015 đã tạo ra nhiều tiếng vang lớn trong cộng đồng developer tạo ra rất nhiều token trên mạng Ethereum. Ban đầu, không có bất kỳ mẫu hoặc hướng dẫn nào để phát triển token. Điều này dẫn đến tạo ra nhiều loại token khác nhau. Để mang lại sự đa dạng này, cộng đồng đã đưa ra tiêu chuẩn ERC-20 để làm cho tất cả các token ít nhiều theo một tiêu chuẩn nhất định.

Tiêu chuẩn token ERC-20 là gì?

ERC là viết tắt của Ethereum Request for Comment, và 20 là số nhận dạng đề xuất. ERC-20 được thiết kế để cải thiện mạng ETH.

ERC-20 là một trong những ERC quan trọng nhất. ERC-20 là một tiêu chuẩn kỹ thuật để viết các smart contract trên mạng chuỗi khối Ethereum, được sử dụng để triển khai token. ERC-20 chứa một bộ quy tắc mà tất cả các token dựa trên Ethereum phải tuân theo.

ERC-20 định nghĩa token là tài sản dựa trên chuỗi khối có thể được gửi/nhận. Token chuẩn ERC-20 tương tự như Bitcoin và Litecoin ở nhiều khía cạnh. Tuy nhiên, sự khác biệt đáng kể nhất là thay vì chạy trên mạng chuỗi khối của riêng họ, các đồng tiền ERC-20 chạy trên mạng chuỗi khối của Ethereum và sử dụng gas làm phí giao dịch.

Token hay Smart Contract không chỉ chịu trách nhiệm tạo token mà còn xử lý các giao dịch và theo dõi số dư của từng chủ sở hữu token. Để nhận được một số token, bạn phải gửi một số ít ETH đến smart contract của token để đổi lấy các token được phân bổ.

ERC-20 là tiêu chuẩn hoặc hướng dẫn để tạo token mới. Tiêu chuẩn xác định sáu chức năng bắt buộc mà một smart contract nên thực hiện và ba chức năng tùy chọn.

Để bắt đầu, bạn có thể đặt tên, ký hiệu cho token của mình và đề cập đến mức độ có thể chia của mã thông báo của bạn bằng cách chỉ định số thập phân. ERC chỉ định một tập hợp các chức năng bắt buộc, phức tạp hơn một chút và được liệt kê bên dưới:

  • totalSupply: Một phương pháp xác định tổng nguồn cung cấp token, Khi đạt đến giới hạn này, hợp đồng thông minh sẽ từ chối tạo token mới.
  • balanceOf: Phương thức trả về số lượng token mà một địa chỉ ví có.
  • transfer: Một phương thức lấy một số lượng token nhất định từ tổng nguồn cung cấp và cung cấp cho người dùng.
  • transferFrom: Một loại phương thức chuyển khác được sử dụng để chuyển token giữa những người dùng.
  • appprove: Phương pháp này xác minh xem smart contract có được phép phân bổ một lượng token nhất định cho người dùng hay không, xem xét tổng nguồn cung.
  • allowance: Phương thức này hoàn toàn giống với phương thức approve ngoại trừ việc nó kiểm tra xem một người dùng có đủ số dư để gửi một lượng token nhất định cho người khác hay không.

Nếu bạn biết về lập trình Hướng đối tượng, bạn có thể so sánh ERC-20 với Interface. Nếu bạn muốn token là token chuẩn ERC-20, thì bạn phải triển khai Interface ERC-20 và điều đó buộc bạn phải triển khai 6 phương pháp này.

Cách tạo token ERC20

Bây giờ chúng ta đã biết token chuẩn ERC-20 là gì và cách chúng hoạt động, và bâu giờ chúng ta có thể tạo và deploy token của riêng mình.

Chúng ta sẽ deploy contract của mình lên mạng Ropsten. Để bắt đầu, bạn sẽ cần tiện ích mở rộng trình duyệt Metamask để tạo ví ETH và một số ETH test mà bạn có thể nhận được bằng cách truy cập vào Ropsten faucet. Bạn sẽ cần chọn Mạng thử nghiệm Ropsten trên ví Metamask và sao chép-dán địa chỉ ví vào text field, sau đó nhấp vào Send me Ether test.

Truy cập Ethereum Remix IDE và tạo một tệp Solidity, chẳng hạn – token.sol

Dán đoạn mã sau vào tập lệnh Solidity mới của bạn:

pragma solidity ^0.4.24;
//Safe Math Interface
contract SafeMath {
function safeAdd(uint a, uint b) public pure returns (uint c) {
    c = a + b;
    require(c >= a);
}

function safeSub(uint a, uint b) public pure returns (uint c) {
    require(b <= a);
    c = a - b;
}

function safeMul(uint a, uint b) public pure returns (uint c) {
    c = a * b;
    require(a == 0 || c / a == b);
}

function safeDiv(uint a, uint b) public pure returns (uint c) {
    require(b > 0);
    c = a / b;
}
}
//ERC Token Standard #20 Interface

contract ERC20Interface {
function totalSupply() public constant returns (uint);
function balanceOf(address tokenOwner) public constant returns (uint balance);
function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
function transfer(address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
function transferFrom(address from, address to, uint tokens) public returns (bool success);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
//Contract function to receive approval and execute function in one call

contract ApproveAndCallFallBack {
function receiveApproval(address from, uint256 tokens, address token, bytes data) public;
}

//Actual token contract

contract QKCToken is ERC20Interface, SafeMath {
string public symbol;
string public name;
uint8 public decimals;
uint public _totalSupply;
mapping(address => uint) balances;
mapping(address => mapping(address => uint)) allowed;

constructor() public {
    symbol = "QKC";
    name = "QuikNode Coin";
    decimals = 2;
    _totalSupply = 100000;
    balances[YOUR_METAMASK_WALLET_ADDRESS] = _totalSupply;
    emit Transfer(address(0), YOUR_METAMASK_WALLET_ADDRESS, _totalSupply);
}

function totalSupply() public constant returns (uint) {
    return _totalSupply  - balances[address(0)];
}

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

function transfer(address to, uint tokens) public returns (bool success) {
    balances[msg.sender] = safeSub(balances[msg.sender], tokens);
    balances[to] = safeAdd(balances[to], tokens);
    emit Transfer(msg.sender, to, tokens);
    return true;
}

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

function transferFrom(address from, address to, uint tokens) public returns (bool success) {
    balances[from] = safeSub(balances[from], tokens);
    allowed[from][msg.sender] = safeSub(allowed[from][msg.sender], tokens);
    balances[to] = safeAdd(balances[to], tokens);
    emit Transfer(from, to, tokens);
    return true;
}

function allowance(address tokenOwner, address spender) public constant returns (uint remaining) {
    return allowed[tokenOwner][spender];
}

function approveAndCall(address spender, uint tokens, bytes data) public returns (bool success) {
    allowed[msg.sender][spender] = tokens;
    emit Approval(msg.sender, spender, tokens);
    ApproveAndCallFallBack(spender).receiveApproval(msg.sender, tokens, this, data);
    return true;
}

function () public payable {
    revert();
}
}

Thay thế biểu tượng và tên token:
symbol = “QKC”;
name= “QuikNode Coin”;

Compile smart contract và deploy nó bằng cách sử dụng Web3 được inject (đảm bảo chọn Ropsten testnet trên Metamask trước khi compile contract). Phê duyệt giao dịch từ metamask.

Lưu ý: Chúng ta cần deploy contract chính của token, chọn tên contract tương ứng dưới section contract trước khi deploy contract(QKCToken).

Nếu bạn thấy một thông báo lỗi trước khi deployment “This contract may be abstract”, đảm bảo bạn chọn contract phù hợp dưới Contract tab. Xác thực transaction trong Metamask.

Screenshot of Metamask transaction confirmation

Hoàn thành, token bây giờ đã được deploy trên mạng Ethereum testnet Ropsten.

Để lấy token trong Metamask, tới ” Deployed Contracts” section trong Remix và copy địa chỉ contract đã deploy sử dụng button copy gần tên contract.

Mở Metamast và click trên Add Token button, chọn Custom Token và paste địa chỉ contract trong trường đầu tiên. Metamask sẽ fetch Token Symbol và tự động decimals của Token.

Click trên next và token sẽ được thêm vào ví của bạn, nó sẽ khả thi dưới assets section trong Metamask.

Kết luận

Chúc mừng bạn đã tạo thành công token/coin của riêng mình trên mạng Ethereum! Đọc thêm về tiêu chuẩn ERC-20 tại đây.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *