當前位置︰首頁 ? 區塊鏈 ? 正文

本文的目標是演示如何在短時間內創建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代幣

現在我們已經概述了基礎知識並解釋了創建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語言庫,旨在解決黑客已經破解智能合約的方式︰整數溢出攻擊。在這種攻擊中,黑客通過傳遞將使相關整數超過其最大值的參數來強制智能合約使用不正確的數值。

相關閱讀︰

這一技術突破或將影響整個隱私安全領域

根據區塊鏈技術角度理解去中心化

1155與眾不同?

上一篇︰區塊鏈技術解析之什麼是區塊鏈BaaS?
下一篇︰BITHD(比特護盾)詳細使用教程

猜你喜歡


Mixer(混幣)應用分析

Mixer(混幣)應用分析

交易隱私是零知識證明的一個應用方向。除了通過公鏈或者側鏈實現交易的發送方/接收方以及金額隱藏外,Mixer,江 ...

區塊鏈密碼學和量子威脅

區塊鏈密碼學和量子威脅

自古以來,人們就普遍需要以一種只能被目標接收者看到的方式來傳遞信息。加密的文本和消息被用于從軍事應用到外交和商業的各種領域。經過幾個世紀 ...

二維碼