--- tags: Blockchain --- # 同質化代幣合約 -- EIP20 介紹 contributed by < [steven1lung](https://github.com/steven1lung) > ## EIP20 介紹 EIP 全名 Ethereum Improvement Proposals,這個專案是為了將 ethereum 的標準合約都集中起來說明,讓使用 ethereum 的客戶或是應用程式可以更輕鬆使用。 EIP20 就是一個標準的加密貨幣介面,可以允許一些智能合約透過 API 溝通。這個合約提供了基本貨幣功能,像是轉帳或是允許貨幣經過認證被使用在其他的鏈上的第三方程式。 ## EIP20 原始碼 ### 變數 #### `name` 這個變數就是加密貨幣的名稱,像是 Ethereum #### `symbol` 這個變數就是加密貨幣的簡稱,像是 ETH #### `decimals` 這個變數是加密貨幣的精準度,到時候設定貨幣發行數量時也要考慮到精準度。 ### 函式 #### Constructor ```solidity function EIP20( uint256 _initialAmount, string _tokenName, uint8 _decimalUnits, string _tokenSymbol ) public { balances[msg.sender] = _initialAmount; // Give the creator all initial tokens totalSupply = _initialAmount; // Update total supply name = _tokenName; // Set the name for display purposes decimals = _decimalUnits; // Amount of decimals for display purposes symbol = _tokenSymbol; // Set the symbol for display purposes } ``` 看到建構子將我們所給予的名稱、代號、精準度的參數就將值設定好了。 #### `transfer` ```solidity function transfer(address _to, uint256 _value) public returns (bool success) { require(balances[msg.sender] >= _value); balances[msg.sender] -= _value; balances[_to] += _value; emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars return true; } ``` 這就是當你購買加密貨幣時,會使用這個函式將貨幣轉到你的錢包地址裡。一開始先檢查貨幣地址的剩餘數量夠不夠,再將雙方的餘額數量設定好,就可以呼叫 `Transfer()` 將貨幣轉給購買者。 #### `transferFrom` ```solidity function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { uint256 allowance = allowed[_from][msg.sender]; require(balances[_from] >= _value && allowance >= _value); balances[_to] += _value; balances[_from] -= _value; if (allowance < MAX_UINT256) { allowed[_from][msg.sender] -= _value; } emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars return true; } ``` 這個函式就是在你要跟其他人交易貨幣時所使用的,像是其他人向你購買貨幣,就可以使用這個 `transferFrom` 函式。可以看到這個函式比上面的 `transfer` 多了一個 `address _from` 參數,表示要從這個 `_from` 的位址轉移貨幣給 `_to`,其他運作都跟上面一樣。 #### `balanceOf` ```solidity function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } ``` 這個函式就是回傳一個位址所擁有的貨幣數量,非常直覺。 #### `approve` ```solidity function approve(address _spender, uint256 _value) public returns (bool success) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars return true; } ``` 這個函式會允許某個錢包位址花費 `_value` 個貨幣,首先會設定好位址可以花費的數量,再呼叫 `Approval()`。 #### `allowance` ```solidity function allowance(address _owner, address _spender) public view returns (uint256 remaining) { return allowed[_owner][_spender]; } ``` 這個函式會回傳剛剛再 `approve` 所設定位址允許花費的貨幣數量。