如何以簡單的方式建立ERC20代幣

買賣虛擬貨幣
本文的目標是演示如何在短時間內建立ERC20代幣。讓我們從基礎開始,首先提出一個問題:什麼是ERC20代幣?近年來,ERC20代幣標準已成為以太坊代幣的事實標準。換句話說,今天大多數以太坊合約都符合ERC20標準。本文將詳細介紹如何建立自己的以太坊代幣,但在我們開始教學之前,先讓我們仔細弄懂什麼是ERC20標準。
是什麼讓ERC20代幣如此具有吸引力並取得成功?有幾個因素在起作用:1.正如您將在本教程中看到的那樣,ERC20代幣簡單易用。
2.ERC20標準解決了一個重大問題,因為基於區塊鏈的市場和加密錢包需要一組標準化的命令來與他們管理的代幣系列進行通訊。這包括不同代幣之間的互動規則,以及代幣購買規則。3.這是第一個提供以太坊代幣標準化的流行標準。它絕不是第一個,但由於它的受歡迎程度高,它很快成為行業標準。與其他以太坊代幣一樣,ERC20代幣使用的是智慧合約,並以去中心化的方式在以太坊虛擬機器(EVM)上執行。Solidity:智慧合約程式語言以太坊智慧合約是用Solidity編寫的。雖然有其他語言,但幾乎沒有人將它們用於代幣編輯。Solidity類似於JavaScript,所以如果你對JavaScript,甚至Java和其他類C語言都有一定的瞭解,那麼你應該毫不費力地找出Solidity中的一段程式碼,甚至在你使用之前就完全掌握Solidity。下面的內容有興趣的可以認真閱讀一下了,因為您應該可以根據以下內容立即開始建立簡單的ERC20智慧合約。這是一項簡單的任務,非常簡單,本文將演示如何在一小時內編寫和部署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,基本上意味著不變,即智慧合約的內部狀態不會被功能改變·An event是Solidity允許客戶(例如您的應用程式前端)在智慧合約中的特定事件得到通知的方式如果您已經擁有必要的Java / JavaScript技能,那麼大多數Solidity語言結構應該是清晰的。在Solidity中編寫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函式用於將numTokens代幣數量從所有者的餘額移動到另一個使用者的餘額,或者receiver。轉移所有者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函式,我們之前已經討論過。它允許被批准提取的代表將所有者資金轉移到第三方帳戶。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語言庫,旨在解決駭客已經破解智慧合約的方式:整數溢位攻擊。在這種攻擊中,駭客透過傳遞將使相關整數超過其最大值的引數來強制智慧合約使用不正確的數值。
SafeMath透過在執行算術操作之前測試溢位來防止這種情況,從而消除了溢位攻擊的危險。該庫非常小,對智慧合約規模的影響很小,不會產生任何效能和很少的儲存成本懲罰。我們將SafeMath新增到我們的程式碼中:library SafeMath { // Only relevant functionsfunction 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;
}}SafeMath使用assert語句來驗證傳遞引數的正確性。如果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,所以我們也會這樣做。以太坊智慧合約部署
現在是將我們的智慧合約部署到區塊鏈的時候了。部署後,我們的智慧合約將轉移到參與網路的所有節點。對智慧合約所做的任何和所有更改都將傳播到所有參與節點。以太坊開發人員通常使用諸如Truffle之類的部署工具。即使是Truffle對於本文的有限需求也是過度的,而一個名為Remix的簡單線上工具就足夠了。要使用它時,您需要在瀏覽器和Rinkeby(以太坊測試網路)帳戶上安裝MetaMask外掛,其中至少包含一些Rinkeby Ether。這些步驟相對簡單,因此我們不會詳細介紹。如果您沒有,請訪問MetaMask和Rinkeby獲取下載連結並獲取明確的安裝和使用說明。現在我們已經有了所有構建塊,我們將轉向Remix並將上面的程式碼(包括pragma行和SafeMath庫)貼上到線上編輯器中。然後,我們將跳到右側的第二個選項卡“ Run ”並單擊“ Deploy”。將出現MetaMask彈出視窗,要求我們確認交易。當然,我們會批准它。
綠框:確保你在Rinkeby上藍框:設定您的總代幣供應量紅框:部署!恭喜!您剛剛部署了第一個ERC20令牌,就像真正的以太坊專業人士一樣。正如所承諾的那樣,令牌簡單輕巧,功能齊全,符合ERC20標準,並透過MathSafe進行保護。它已準備好在區塊鏈中購買,支付和轉移。這就是智慧合約全部的內容嗎?
不,只是一小部分,因為我們只是做了一個表面簡短的演示,僅涉及智慧合約開發的一個方面。智慧合約比實際看上去的還複雜,具體取決於您的業務邏輯,使用者互動的建模,是否允許代幣鑄造和燒錄,您在智慧合約中引入的生命週期變更,以及管理級別功能的需求,這通常伴隨著管理員授權的一組功能,等等。儘管如此,如果你可以複製我們在這裡所做的事情,那麼這是擴充套件你的知識並在必要時轉向更復雜智慧合約的堅實基礎。智慧合約是在以太坊虛擬機器上執行的一段程式碼。以太坊智慧合約是不可變的,可以傳送或接收乙太網和資料。簡而言之,ERC20代幣是實施ERC20標準的智慧合約。這些智慧合約處理的操作包括獲取代幣的總供應和餘額,以及用於轉移它們的方法。以太坊開發目前在Solidity中進行,Solidity是一種受JavaScript,Python和C ++啟發的面向智慧合約的程式語言。
原文:https://www.toptal.com/ethereum/create-erc20-token-tutorial

翻譯:考拉

更多區塊鏈資訊:www.qukuaiwang.com.cn/news

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;