在以太坊上發行自己的貨幣

以太坊平台最歡迎根常用的功能之一是我們能夠發行我們自己的代幣。 我們在以太坊上發行的代幣都是ERC-20 標準,這個標準與以太幣的標準相同。 這意味著我們發行的任何代幣都能夠與任何使用以太幣的錢包、交易所等相容。

創建ERC-20 Interface的智能合約

這裡的開發環境我們將使用Remix IDE(http://remix.ethereum.org/)。首先我們建立一個名為jasonToken.sol的檔案(檔案可以自行命名)。

請加入以下代碼

pragma solidity ^0.5.0;

// This is the interface that must be implemented for an ERC-20 compliant token.
contract ERC20Interface {

function totalSupply() public view returns (uint);


function balanceOf(address tokenOwner) public view returns (uint balance);


function allowance(address tokenOwner, address spender) public view returns (uint remaining);


function transfer(address to, uint tokens) public returns (bool success);


function approve(address spender, 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);
} // ERC20Interface

在這個Interface的智能合約實現我們發行ERC-20標準的代幣。任何ERC-20代碼必須包含以下函數。而這些必要的函數有:

  • totlaSupply — 返回建立代幣的總供應量
  • balanceOf — 返回送出地址(錢包)內的餘額
  • transfer — 讓智能合約的擁有者可以送出代幣給其他人
  • transferFrom — 這是用於自動轉帳到一個指定的地址(錢包)
  • approve — 這是根據代幣的總供應量來檢查交易,以確保沒有代幣沒有多也沒有少。
  • allownace —如果送出錢包內的錢不夠則取消該筆交易

創建能進行數學運算的智能合約

接下來在 ERC20 Interface 代碼下方加上一個名為 SafeMath的 智能合約代碼。 SafeMath 是一個含有"加減乘除"函數的智能合約。 這些函數通過加上overflow check包裝了 Solidity 的算術運算。 Solidity 中的算術運算會包含了overflow。 而這很容易導致bugs,因為開發人員通常認為overflow會導致錯誤,這是一個在高階開發語言會有的標準動作。 而SafeMath在遇到overflow時則會恢復(restore)交易來還原這個錯誤行為。 使用這個SafeMath library可以消除一整類錯誤,因為它可以消除未經檢查的數學運算。

contract SafeMath {
// 加法
function safeAdd(uint a, uint b) public pure returns (uint c) {
c = a + b;
require(c >= a);
} // safeAdd

// 減法
function safeSub(uint a, uint b) public pure returns (uint c) {
require(b <= a);
c = a - b;
} // safeSub

// 乘法
function safeMul(uint a, uint b) public pure returns (uint c)
{
c = a * b;
require(a == 0 || c / a == b);
} // safeMul

// 除法
function safeDiv(uint a, uint b) public pure returns (uint c)
{
require(b > 0);
c = a / b;
} // safeDiv
} // SafeMath

創建發行代幣的智能合約

現在為我們的代幣智能合約加上代碼。 這個智能合約實現了 ERC20 Interface 合約中所有必要的函數功能,並使用了 SafeMath 合約中的算術運算。我們將發行一個有五百萬顆名為JasonToken的代幣。

contract JasonToken is ERC20Interface, SafeMath {
// Local Variables
// The token name
string public name;

// The token symbol (3 characters)
string public symbol;

// The token's precision (number of decimal places)
uint8 public decimals;

// The total supply of the new token
uint256 public _totalSupply;

// Mappings for account balances and allowed
mapping(address => uint) balances;
mapping(address => mapping(address => uint)) allowed;

// The constructor for our Smart Contract.
// This function runs ONCE during deployment.
constructor() public
{
name = "JasonToken";
symbol = "Jas";
decimals = 1;
_totalSupply = 50000000;

balances[msg.sender] = _totalSupply;
emit Transfer(address(0), msg.sender, _totalSupply);
} // constructor

// Returns the total supply of the token created.
function totalSupply() public view returns (uint)
{
return _totalSupply - balances[address(0)];
} // totalSupply

// Returns the token balance for the supplied address.
function balanceOf(address tokenOwner) public view returns (uint balance)
{
return balances[tokenOwner];
} // balanceOf

// This function will cancel a transction if the user does not have sufficient balance.
function allowance (address tokenOwner, address spender) public view returns (uint remaining)
{
return allowed[tokenOwner][spender];
} // allowance

// This function checks the transaction against the total supply of tokens to make sure that there are none missing or extra.
function approve(address spender, uint tokens) public returns (bool success)
{
allowed[msg.sender][spender] = tokens;
emit Approval(msg.sender, spender, tokens);
return true;
} // approve

// Allows the contract owner to give tokens to other users.
function transfer(address to, uint tokens) public returns (bool success)
{
balances[msg.sender] = safeSub(balances[msg.sender], tokens);
balances[to] = safeAdd(balances[to], tokens);

emit Transfer(msg.sender, to, tokens);
return true;
} // transfer

// This function is used to support automated transfers to a specific account.
function transferFrom (address from, address to, uint tokens) public returns (bool success)
{
balances[from] = safeSub(balances[from], tokens);
allowed[from][msg.sender] = safeSub(allowed[from][msg.sender], tokens);
balances[to] = safeAdd(balances[to], tokens);

emit Transfer(from, to, tokens);
return true;
} // transferFrom

} // JasonToken

編譯並佈署合約

設定Remix的佈署環境到Injected Provider — MetaMask(如下圖)

我們會使用MetaMask使用Goerli test network佈署我們的智能合約來發行代筆。確認我們選擇正確的網路與帳號,並且該帳號有足夠的以太幣進行佈署(如下圖)。

確認沒問題後我們就可以進行佈署,在哪之前我們需要確認使否佈署到正確的發行貨幣的智能合約(如下圖)。如果在佈署過程中我們看到錯誤的訊息是: “This contract may be abstract, not implement an abstract parent’s methods completely or not invoke an inherited contract’s constructor correctly”。哪麼就是選錯合約了。

我們可以在MetaMask的Activity觀察到合約佈署的狀況。並點選View on block explorer(也就是EtherScan)觀察更詳細的資訊。

上圖中我們可以看到合約佈署成功(同樣也能在MetaMask中看到)。

確認合約佈署的細節

至此,我們的合約已部署,我們的代幣已創建,新發行的代幣存在於我們的錢包中。 我們可以通過在 Etherscan 的合約建立交易(如上圖)中點擊“From”地址來確認這一點。 這將顯示連接到我們的 Metamask 錢包的所有交易。

將代幣加到我們的MetaMask錢包

接下來就可以發送我們自己的代幣給以太坊的錢包。

--

--

運用"雲端服務"加速企業的數位轉型願景
運用"雲端服務"加速企業的數位轉型願景

Written by 運用"雲端服務"加速企業的數位轉型願景

我們協助您駕馭名為"雲端運算"的怪獸,馴服它為您所用。諮詢請來信jason.kao@suros.com.tw. https://facebook.com/jason.kao.for.cloud

No responses yet