早在2015 年以太坊網絡首次啟動時,就沒有任何代幣開發模板或指南。這意味著有各種各樣的令牌,每個令牌都是獨一無二的。為了使代幣更加統一,社區提出了ERC-20 標準。
在本文中,我將引導你完成創建你自己的 ERC-20 令牌的過程。
但讓我們退後一步……
什麼是代幣?
代幣用於與構建在不同區塊鏈之上的去中心化應用程序交互。代幣幾乎可以代表以太坊中的任何東西,包括:
彩票
金融資產,如公司股份
遊戲中角色的技能
像CAD 這樣的法定貨幣
在線平台中的聲譽點
一盎司銀
不要與只是支付方式的硬幣混淆,而代幣可以執行許多其他功能。
什麼是ERC-20 代幣?
ERC 代表Ethereum Request for Comment,20 是提案標識符號。ERC-20 令牌旨在通過標準化令牌創建來改進ETH 網絡。
ERC-20 代幣標準
ERC-20 包含一個基於以太坊的代幣必須遵循的規則列表。該標准定義了六個強制性功能和三個可選功能,以在你的智能合約中實施。
totalSupply: 此方法定義了流通中的代幣總數(代幣供應量)。一旦達到限制,智能合約將拒絕創建新的代幣。
balanceOf: 此方法返回錢包地址擁有的代幣數量。
transfer: 此方法 執行將指定數量的代幣 轉移到 指定地址。
transferFrom:從 指定地址 執行指定數量的代幣轉移
批准: 此方法驗證用戶是否可以在考慮總供應量的情況下提取一定數量的代幣。
允許: 此方法驗證用戶是否有足夠的餘額來向另一個用戶發送一定數量的代幣。
創建你自己的令牌
讓我們開始吧…
配置
如果你尚未使用Chrome 作為瀏覽器,則需要為該項目下載它。
使用Chrome 後,你需要 安裝Metamask 瀏覽器擴展程序。MetaMask 是一種用於與以太坊區塊鏈交互的軟件數字貨幣包。下載後,按照說明設置你的錢包帳戶。
3. 選擇呼叫測試網絡
在你的Metmask 帳戶中,從以太坊主網切換到Ropsten 測試網絡。Ropsten 測試網是真實主網網絡的精確副本,但它允許區塊鏈開發人員在不需要真實ETH 的情況下測試他們的工作。
4.獲取測試ETH
使用 Ropsten Ethereum Faucet 通過輸入你的錢包地址來獲取一些測試ETH(你可以從你的Metamask 擴展中復制並粘貼它),你只需要0.3 ETH。
5. 設置文件
前往 Ethereum Remix IDE 並創建一個新文件。將文件命名為YourTokenName.sol(如果不明顯,請將YourTokenName 替換為你的令牌名稱)
你應該留下一個看起來像這樣的空文件。現在你已準備就緒,可以開始編碼了
編碼
*任何缺少的行號表示一個空行
第1 行: //SPDX-License-Identifier: MIT
在第一行中,我們將許可規範設置為MIT(開源)。你可以在此處查看SPDX 許可選項的完整列表 。
第3 行: pragma solidity ^0.4.24;
接下來,我們聲明我們正在使用的Solidity 版本。指定這一點很重要,因為Solidity 不斷發展,所以舊代碼可能與新版本不兼容。
第5-26 行:
在這些行中,我們調用了 SafeMath 接口, 以便我們可以在合約中使用數學函數。SafeMath 可防止 在加、減、乘和除整數時發生溢出。 當算術運算嘗試創建超出可以用給定位數表示的範圍的數值時,就會發生溢出。
contract SafeMath {
function add(uint a, uint b) public pure returns (uint c) {
c = a + b;
require(c >= a);
}
function sub(uint a, uint b) public pure returns (uint c) {
require(bc = a — b;
}
function mul(uint a, uint b) public pure returns (uint c) {
c = a * b;
require(a == 0 || c / a == b);
}
function div(uint a, uint b) public pure returns (uint c) {
require(b > 0);
c = a / b;
}
}
對於每個關節炎操作,我們創建一個我們可以稍後調用的函數(例如,’function add’ 是一個用於加法的函數。)
第28 行:
這裡我們調用 ERC代幣Standard #20 Interface 來實現它的功能。
contract ERC20Interface {
第29 行:
function totalSupply() public constant returns (uint);
此函數返回存在的令牌數量。
第30 行:
function balanceOf(address owner) public constant returns (uint balance);
此函數返回帳戶的餘額。
第31 行:
function transfer(address to, uint tokens) public returns (bool success);
此函數將令牌從調用者轉移到不同的地址。
第32 行:
function transferFrom(address from, address to, uint tokens) public returns (bool success);
這個函數被消費者用來消費津貼。
第33 行:
function approve(address spender, uint tokens) public returns (bool success);
此功能函數創建一個餘量。
第34 行:
function allowance(address owner, address spender) public constant returns (uint remaining);
這個函數讓任何人都可以查詢一個地址 ( owner) 允許另一個地址 ( spender) 花費多少。
第36-38 行:
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed owner, address indexed spender, uint tokens);
}
當ERC-20 合約的狀態發生變化時,會發出這些事件。
第40-42 行:
contract ApproveAndCallFallBack {function getApproval(address from, uint256 tokens, address token, bytes data) public;}
這是一個合約功能,可在一次調用中獲得批准和執行功能。
第44-48 行:
contract代幣Name is ERC20Interface, SafeMath {
uint public _totalSupply;
string public name;
string public symbol;
uint8 public decimals;
現在我們開始我們的實際代幣合約。替換 TokenName 為你的令牌名稱。從那裡,你將看到我們定義了四個變量,第一個將跟踪總供應量,其他三個用於提高可讀性。
第50-51 行:
mapping(address => uint) private balances;
mapping(address => mapping(address => uint)) allowed;
這將創建兩個映射函數,使用戶能夠使用這些代幣。
第53-60 行:
constructor() public {
name = “Token Name”;
symbol = “Token Symbol”;
decimals =代幣Decimals;
_totalSupply =代幣Supply;
balances[钱包Address] = _totalSupply;
emit Transfer(address(0),錢包Address, _totalSupply);
}
在這裡,我們正在初始化構造函數,為我們的代幣設置符號、名稱、小數和總供應值,然後聲明代幣的總供應量等於你錢包中該代幣的餘額。
你可以在此處自定義令牌。
替換 Token Name 為你的令牌名稱
替換 Token Symbol 為你的代幣符號(可以是任意三個大寫字母組合,例如ABC)
替換 Token Decimals 為整數值。這將決定用戶如何劃分你的代幣。標準是18,但是,如果你想保持簡單,那麼你可以將值設為0,這意味著你的代幣不可整除。
替換 Token Supply 為整數值。這將決定流通中的代幣總量。請注意,總供應值必須有額外的零,具體取決於你的小數;例如,如果你的 Token Decimals 值是2 並且你想要100 個令牌,那麼你將輸入10000
替換 錢包Address 為你的MetaMask 錢包地址(你可以直接從瀏覽器的MetaMask 擴展中復制並粘貼此地址)
第62-64 行:
function totalSupply() public constant returns (uint) {
return _totalSupply – balances[address(0)];
}
此功能將管理我們代幣的總供應量。
第66-68 行:
function balanceOf(address owner) public constant returns (uint balance) {
return balances[owner];
}
此功能將檢查錢包地址的餘額。
第70-75 行:
function transfer(address to, uint tokens) public returns (bool success) {
balances[msg.sender] = sub(balances[msg.sender], tokens);
balances[to] = add(balances[to], tokens);
emit Transfer(msg.sender, to, tokens);
return true;
}
此函數將執行從發件人帳戶到另一個帳戶的代幣轉移。
第77-83 行:
function transferFrom(address from, address to, uint tokens) public returns (bool success) {
balances[from] = sub(balances[from], tokens);
allowed[from][msg.sender] = sub(allowed[from][msg.sender], tokens);
balances[to] = add(balances[to], tokens);
emit Transfer(from, to, tokens);
return true;
}
此功能是消費者調用以花費津貼的功能。它需要兩個操作:轉移花費的金額並減少該金額的津貼。
第85-89 行:
function approve(address spender, uint tokens) public returns (bool success) {
allowed[msg.sender][spender] = tokens;
emit Approval(msg.sender, spender, tokens);
return true;
}
此函數將檢查總供應量是否具有需要分配給用戶的代幣數量。
第91-93 行:
function allowance(address owner, address spender) public constant returns (uint remaining) {
return allowed[owner][spender];
}
此功能將允許任何人檢查用戶是否有足夠的餘額來執行向另一個用戶的轉賬。
第95-100 行:
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).getApproval(msg.sender, tokens, this, data);
return true;
}
該函數將執行購買和消費代幣的交易。
第102-105 行:
function () public payable {
revert();
}
}
此功能可防止賬戶直接將ETH 發送到合約,以及防止用戶在忘記提及函數名稱的交易上花費gas。
單擊 此處 在Github 上查看完整代碼。
部署
現在我們已經完成了對令牌的編碼,是時候編譯文件並部署它了在編譯之前,請確保你的MetaMask 帳戶設置為Ropsten 測試網絡。
首先轉到Solidity 編譯器
接下來,確保你選擇了正確的編譯器(0.4.26+commit.4563c3fc)。
然後點擊“編譯”。一旦你的文件被編譯,你應該在Solidity Compiler 圖標上看到一個綠色的複選標記。
編譯文件後,單擊左側的“部署和運行事務”按鈕。
將環境設置為註入的Web3。
將合約設置為YourTokenName。
點擊“部署”。
點擊Deploy 後,你的MetaMask 擴展將打開並要求你支付gas 費用來部署合約,但不要擔心,我們將使用我們之前從Ropsten Faucet 獲得的測試ETH。點擊確認。
單擊確認後,等待幾秒鐘以創建令牌。然後擴展代碼底部的終端並單擊“塊”以顯示更多詳細信息。
在區塊詳情中,找到你的合約地址(它會在“from”之後:)並複制它。
然後,進入你的MetaMask 擴展並點擊“資產”,然後點擊“導入代幣”並粘貼你的合約地址。然後,單擊“添加自定義令牌”,然後單擊“導入令牌”,大功告成
恭喜,你成功創建了自己的加密貨幣代幣