以太坊ERC20協議以及發行自己代幣

什麼是 ERC20

以太坊ERC20協議以及發行自己代幣

ERC-20 標準是在2015年11月份推出的,使用這種規則的代幣,表現出一種通用的和可預測的方式。

簡單地說,任何 ERC-20 代幣都能立即兼容以太坊錢包(幾乎所有支持以太幣的錢包,包括Jaxx、MEW、imToken等,也支持 erc-20的代幣),由於交易所已經知道這些代幣是如何操作的,它們可以很容易地整合這些代幣。這就意味著,在很多情況下,這些代幣都是可以立即進行交易的。

標準化非常有利,也就意味著這些資產可以用於不同的平臺和項目,否則只能用在特定的場合。

代幣(Token)是區塊鏈中定義價值的方式,用於標定金融或數字資產。在以太坊上,代幣使用相同的標準,這樣代幣之間的兌換和DAPP支持就會變得容易。

標準規定了哪些內容

ERC20 是各個代幣的標準接口。ERC20 代幣僅僅是以太坊代幣的子集。為了充分兼容 ERC20,開發者需要將一組特定的函數(接口)集成到他們的智能合約中,以便在高層面能夠執行以下操作:

  • 獲得代幣總供應量
  • 獲得賬戶餘額
  • 轉讓代幣
  • 批准花費代幣

ERC20 讓以太坊區塊鏈上的其他智能合約和去中心化應用之間無縫交互。一些具有部分但非所有ERC20標準功能的代幣被認為是部分 ERC20兼容,這還要視其具體缺失的功能而定,但總體是它們仍然很容易與外部交互。

ERC20 標準

ERC20 標準定義了一個兼容協議, 需要實現的函數. 具體如下.

 contract ERC20Interface {
// 代幣名稱
string public constant name = "Token Name";
// 符號
string public constant symbol = "SYM";
// 小數點位數
uint8 public constant decimals = 18; // 18 is the most common number of decimal places
// 0.0000000000000000001 個代幣
// 法幣總量
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 approve(address spender, uint tokens) public returns (bool success);
// 實現代幣交易,轉賬
function transfer(address to, 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);
}

同時規定了三個必須定義的變量,分別是

  • 合約名稱
  • 合約代號
  • 合約進制
 string public constant name = "Token Name";
string public constant symbol = "SYM";
uint8 public constant decimals = 18; // 18 is the most common number of decimal places

ERC20 並不是完美的

ERC-20標準還有待完善。

  1. 其中一個障礙是,將令牌直接發送給令牌的智能合同將導致資金損失。這是因為一個令牌的合同只會跟蹤和分配資金。例如,當您從錢包中向另一個用戶發送令牌時,該錢包將調用令牌的合約來更新數據庫。所以如果您試圖將令牌直接傳輸到令牌的合約中,那麼由於該令牌的合約無法響應,所以金錢就“丟失”了。
  2. ERC20標準無法通過接收方合同處理傳入的交易。這是該令牌存在的最大問題,也是開發者一直希望改進的地方。ERC20令牌無法將令牌發送給一個與這些令牌不兼容的契約,也正因為這樣,部分資金存在丟失的風險。
  3. Reddit上的一篇文章指出,由於被髮送到“錯誤”的合同上,大約價值40萬美元的ERC20令牌被困,這對整個以太坊生態系統而言是一個巨大的威脅。幸運的是,ERC223令牌可以解決這一難題,前提是該令牌能夠獲得批准並被引入。

抽象

以下標準允許在智能合約中實施標記的標記API。 該標準提供了轉移token的基本功能,並允許token被批准,以便他們可以由另一個在線第三方使用。

動機

標準接口可以讓Ethereum上的任何令牌被其他應用程序重新使用:從錢包到分散式交換。

規則

Token

方法

注意:調用者必須處理返回false的returns (bool success).調用者絕對不能假設返回false的情況不存在。

name

返回這個令牌的名字,比如"MyToken".

可選 - 這種方法可以用來提高可用性,但接口和其他契約不能指望這些值存在。

function name() constant returns (string name)

symbol

返回令牌的符號,比如HIX.

可選 - 這種方法可以用來提高可用性,但接口和其他契約不能指望這些值存在。

function symbol() constant returns (string symbol)

decimals

返回token使用的小數點後幾位, 比如 8,表示分配token數量為100000000

可選 - 這種方法可以用來提高可用性,但接口和其他契約不能指望這些值存在。

function decimals() constant returns (uint8 decimals)

totalSupply

返回token的總供應量。

function totalSupply() constant returns (uint256 totalSupply)

balanceOf

返回地址是_owner的賬戶的賬戶餘額。

function balanceOf(address _owner) constant returns (uint256 balance)

transfer

轉移_value的token數量到的地址_to,並且必須觸發Transfer事件。 如果_from帳戶餘額沒有足夠的令牌來支出,該函數應該被throw。

創建新令牌的令牌合同應該在創建令牌時將_from地址設置為0x0觸發傳輸事件。

注意 0值的傳輸必須被視為正常傳輸並觸發傳輸事件。

function transfer(address _to, uint256 _value) returns (bool success)

transferFrom

從地址_from發送數量為_value的token到地址_to,必須觸發Transfer事件。

transferFrom方法用於提取工作流,允許合同代您轉移token。這可以用於例如允許合約代您轉讓代幣和/或以子貨幣收取費用。除了_from帳戶已經通過某種機制故意地授權消息的發送者之外,該函數應該throw。

注意 0值的傳輸必須被視為正常傳輸並觸發傳輸事件。

function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

approve

允許_spender多次取回您的帳戶,最高達_value金額。 如果再次調用此函數,它將以_value覆蓋當前的餘量。

注意:為了阻止向量攻擊,客戶端需要確認以這樣的方式創建用戶接口,即將它們設置為0,然後將其設置為同一個花費者的另一個值。雖然合同本身不應該強制執行,允許向後兼容以前部署的合同兼容性

function approve(address _spender, uint256 _value) returns (bool success)

allowance

返回_spender仍然被允許從_owner提取的金額

function allowance(address _owner, address _spender) constant returns (uint256 remaining)

Events

Transfer

當token被轉移(包括0值),必須被觸發。

event Transfer(address indexed _from, address indexed _to, uint256 _value)

Approval

當任何成功調用approve(address _spender, uint256 _value)後,必須被觸發。

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

發行代幣demo

代碼

pragma solidity ^0.4.20;
interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) external; }
contract TokenERC20 {
string public name;

string public symbol;
uint8 public decimals = 18; // decimals 可以有的小數點個數,最小的代幣單位。18 是建議的默認值
uint256 public totalSupply;
// 用mapping保存每個地址對應的餘額
mapping (address => uint256) public balanceOf;
// 存儲對賬號的控制
mapping (address => mapping (address => uint256)) public allowance;
// 事件,用來通知客戶端交易發生
event Transfer(address indexed from, address indexed to, uint256 value);
// 事件,用來通知客戶端代幣被消費
event Burn(address indexed from, uint256 value);
/**
* 初始化構造
*/
constructor(uint256 initialSupply, string tokenName, string tokenSymbol) public {
totalSupply = initialSupply * 10 ** uint256(decimals); // 供應的份額,份額跟最小的代幣單位有關,份額 = 幣數 * 10 ** decimals。
balanceOf[msg.sender] = totalSupply; // 創建者擁有所有的代幣
name = tokenName; // 代幣名稱
symbol = tokenSymbol; // 代幣符號
}
/**
* 代幣交易轉移的內部實現
*/
function _transfer(address _from, address _to, uint _value) internal {
// 確保目標地址不為0x0,因為0x0地址代表銷燬
require(_to != 0x0);
// 檢查發送者餘額
require(balanceOf[_from] >= _value);
// 確保轉移為正數個
require(balanceOf[_to] + _value > balanceOf[_to]);
// 以下用來檢查交易,
uint previousBalances = balanceOf[_from] + balanceOf[_to];
// Subtract from the sender

balanceOf[_from] -= _value;
// Add the same to the recipient
balanceOf[_to] += _value;
emit Transfer(_from, _to, _value);
// 用assert來檢查代碼邏輯。
assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
}
/**
* 代幣交易轉移
* 從創建交易者賬號發送`_value`個代幣到 `_to`賬號
*
* @param _to 接收者地址
* @param _value 轉移數額
*/
function transfer(address _to, uint256 _value) public {
_transfer(msg.sender, _to, _value);
}
/**
* 賬號之間代幣交易轉移
* @param _from 發送者地址
* @param _to 接收者地址
* @param _value 轉移數額
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(_value <= allowance[_from][msg.sender]); // Check allowance
allowance[_from][msg.sender] -= _value;
_transfer(_from, _to, _value);
return true;
}
/**
* 設置某個地址(合約)可以交易者名義花費的代幣數。
*
* 允許發送者`_spender` 花費不多於 `_value` 個代幣
*
* @param _spender The address authorized to spend
* @param _value the max amount they can spend
*/
function approve(address _spender, uint256 _value) public
returns (bool success) {
allowance[msg.sender][_spender] = _value;

return true;
}
/**
* 設置允許一個地址(合約)以交易者名義可最多花費的代幣數。
*
* @param _spender 被授權的地址(合約)
* @param _value 最大可花費代幣數
* @param _extraData 發送給合約的附加數據
*/
function approveAndCall(address _spender, uint256 _value, bytes _extraData)
public
returns (bool success) {
tokenRecipient spender = tokenRecipient(_spender);
if (approve(_spender, _value)) {
spender.receiveApproval(msg.sender, _value, this, _extraData);
return true;
}
}
/**
* 銷燬創建者賬戶中指定個代幣
*/
function burn(uint256 _value) public returns (bool success) {
require(balanceOf[msg.sender] >= _value); // Check if the sender has enough
balanceOf[msg.sender] -= _value; // Subtract from the sender
totalSupply -= _value; // Updates totalSupply
emit Burn(msg.sender, _value);
return true;
}
/**
* 銷燬用戶賬戶中指定個代幣
*
* Remove `_value` tokens from the system irreversibly on behalf of `_from`.
*
* @param _from the address of the sender
* @param _value the amount of money to burn
*/
function burnFrom(address _from, uint256 _value) public returns (bool success) {
require(balanceOf[_from] >= _value); // Check if the targeted balance is enough
require(_value <= allowance[_from][msg.sender]); // Check allowance
balanceOf[_from] -= _value; // Subtract from the targeted balance
allowance[_from][msg.sender] -= _value; // Subtract from the sender's allowance
totalSupply -= _value; // Update totalSupply

emit Burn(_from, _value);
return true;
}
}

在remix中編譯運行上面的上面的智能合約,鍵入參數,配合metamask插件,

以太坊ERC20協議以及發行自己代幣

在METAMASK中查看自己的代幣:

以太坊ERC20協議以及發行自己代幣

ERC223要解決的首要問題是什麼?

自從引入ERC20令牌標準以來,幾乎所有的基於以太坊的令牌都成功的接受了這個新標準。然而其自身的缺點需要及時解決,這便是ERC223令牌誕生的原因。

防止丟失

ERC223令牌標準將向現有的ERC20標準引入一個新功能,以防止意外轉移的發生。ERC223令牌標準可以防止令牌在以太坊網絡上丟失。

困難的轉換

假設 ERC223 令牌標準能夠取代ERC20成為新的標準,現有令牌的發行方需要做一些艱難的決定。因為,從現實情況來看,不管用何種方式,從ERC20轉換到ERC223是不可能的,同樣的,所有ERC20令牌都需要在ERC223標準下重新部署。這也意味著任何交易平臺的上市都需要更新他們的信息和地址。這是一個艱苦的過程,這也就意味著,在未來很少有現有的令牌被有效地轉換為ERC223。

正如Alex van de Sande在Reddit上指出的那樣,“更方便”的過程可能是創建新的令牌,它們是通過持有舊令牌的合同支持的。這可能是大多數項目最合理的選擇,但只有時間才能確定哪些選項將被實施。

24小時全網監控、大數據自動判斷行情、多種交易策略不懼熊市、追蹤止盈不錯過暴漲、智能防暴跌自動暫停、真正穩定高頻交易。最快0.005秒就能夠完成一單試一下,你會發現火石AI自動交易機器人軟件的所有好處。您需要可聯繫他們v助理xuan17770896207,進行註冊並諮詢和建議。


分享到:


相關文章: