雖然網路上有很多關於以太坊智能合約的文章介紹,不過看了許久總是有種一知半解的感覺,看來必須要動手做才行。
筆者照著這篇文章的步驟拿到了一些以太坊測試網路的乙太幣,要是真的乙太幣該有多好。
不過該文章的作者似乎還沒有寫接下來的教學,所以就直接來看ethereum官網的智能合約教學。
ERC-20是一套在乙太坊中以智能合約發行代幣的標準,簡單來說你必須在智能合約中定義代幣發行量、轉移、查詢等功能,除了ERC-20標準的定義當然也可以自己加些額外的功能。
官網的教學就給出了一個ERC-20代幣的範例程式,以solidity撰寫智能合約並且放入乙太坊中執行。
來看幾個合約中的功能:
定義了發行代幣的總量、代幣名稱、代幣符號,然後合約的創造者一開始持有所有的代幣。
/**
* Constrctor function
*
* Initializes contract with initial supply tokens to the creator of the contract
*/
function TokenERC20(
uint256 initialSupply,
string tokenName,
string tokenSymbol
) public {
totalSupply = initialSupply * 10 ** uint256(decimals); // Update total supply with the decimal amount
balanceOf[msg.sender] = totalSupply; // Give the creator all initial tokens
name = tokenName; // Set the name for display purposes
symbol = tokenSymbol; // Set the symbol for display purposes
}
將代幣從一個地址轉移到其他的地址,在轉移前也要確認餘額夠不夠、目標地址是否有效等等:
/**
* Internal transfer, only can be called by this contract
*/
function _transfer(address _from, address _to, uint _value) internal {
// Prevent transfer to 0x0 address. Use burn() instead
require(_to != 0x0);
// Check if the sender has enough
require(balanceOf[_from] >= _value);
// Check for overflows
require(balanceOf[_to] + _value > balanceOf[_to]);
// Save this for an assertion in the future
uint previousBalances = balanceOf[_from] + balanceOf[_to];
// Subtract from the sender
balanceOf[_from] -= _value;
// Add the same to the recipient
balanceOf[_to] += _value;
Transfer(_from, _to, _value);
// Asserts are used to use static analysis to find bugs in your code. They should never fail
assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
}
現在來執行這個符合ERC-20標準的智能合約來創造自己的代幣,就取叫lottery token吧。
合約被測試網路接受,現在筆者有100億的代幣了,可以看到同時乙太幣的數量減少了,這是因為執行合約和把合約收入區塊鏈需要花費一定數量的gas,gas是另一種乙太幣的計算單位,之所以要分兩種單位是為了避免乙太幣價格波動造成的影響。
現在對於乙太坊中的智能合約脈絡有點清晰了,我們可以在乙太坊上撰寫智能合約來定義一些事情,例如自己的代幣,而智能合約的執行需要消耗乙太幣,之後就來用報明牌代幣做點事吧,希望不會食言。
以太坊智能合約編程 Solidity — 新手教程 (第一章)
https://medium.com/taipei-ethereum-meetup/%E4%BB%A5%E5%A4%AA%E5%9D%8A%E6%99%BA%E8%83%BD%E5%90%88%E7%B4%84%E7%B7%A8%E7%A8%8B-solidity-%E6%96%B0%E6%89%8B%E6%95%99%E7%A8%8B-%E7%AC%AC%E4%B8%80%E7%AB%A0-2a0803a5ae04
ethereum token
https://www.ethereum.org/token
ERC20 Token Standard
https://theethereum.wiki/w/index.php/ERC20_Token_Standard
Solidity
https://solidity.readthedocs.io/en/develop/