七行代碼發行 Token ,一圓曾經的ICO美夢
2017年區塊鏈迎來 ICO 狂潮高峰, 數百種各式各樣的幣傾巢而出,其中甚至還有撞名的。有不少區塊鏈集資成功,但從今年下半年回過頭看,還有價值的可能不到 10%。
2018年不少交易所也發行了自己的去中心化貨幣,比如台灣的 BitoPro 為例,算是趕上ICO的尾巴,不過規模較小,再加上功能有限,除了交易所內的功能可以使用到,而有優惠之外,吸引力真的不高。所以看起來也是搖搖欲墜,18年真的是冰河期。而因為 ICO狂潮,也帶動了 ERC20 Token,然後開始 ICO的套路在 Token 上似乎也做了進化,DApp 帶個遊戲,再加上激勵制度,看起來變得相當斯文,吃相也不那麼難看。
2017年11月 MakerDAO 推出的穩定幣 DAI ,使 DeFi 延續了區塊鏈的熱度,在2018 及 2019 年,以 Dai 為基礎的各種借貸、交易所、資產管理等服務,逐漸上線,如果說DeFi 在2018年是起步, 2019年 是累積能量,那2020年應該可以邁入成長期開始爆發。
原本已經寫好的 ERC20 Token 合約,具備基礎的 ERC20 標準功能之後,還沒有 Debug ,就發現 OpenZappelin 已經有寫好標準的 ERC20 合約。初步看了一下,原來是我重新造了輪子。但是,雖然OpenZappelin 的 ERC20 Token 合約是符合安全審查的,但還是缺乏一些進階的功能。在增加功能之前,我們就先來看看這個ERC20標準合約,要如何部署,發行屬於我們自己的 Token 。這裡用的都是最簡單的方式,只需具備:
- Chrome 瀏覽器
- MetaMask 錢包
瀏覽器只需要標準的瀏覽器就可以了,edge 跟 firefox 也都可以。錢包只要使用能連上 Ropsten 測試網路的 ERC20 相容錢包即可,使用 MetaMask 是因為可以直接切換網路,又掛在 chrome 上很方便。
先上代碼再說明。
pragma solidity ^0.6.0; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol"; contract ADCToken is ERC20 { constructor(uint256 initialSupply) public ERC20("AndyCoin", "ADC") { _mint(msg.sender, initialSupply * (10 ** uint256(decimals()))); } }
就這7行代碼,就可以發行標準的 ERC20 Token 然後使用 MataMask 錢包來收發代幣。
打開 Chrome ,進入 https://remix.ethereum.org/ ,我們使用 Remix 來編譯,錢包記得切換到 Ropsten 測試網路。
在 Remix 裡面建立新檔案,把代碼貼上後直接編譯完成。
對照下圖的行號,說明代碼。
第3行,調用 OpenZappelin 的 ERC20 Token 合約。
第5行,ADCToken 是合約名稱, 繼承自 ERC20 ,良好習慣的命名是與檔名相同。例外是同一個檔案內有兩個以上合約。
第6行,AndyCoin 是我們要創建的 Token 名稱 name , ADC 是 Token 代號 symbol
第7行,代幣數量,預設小數點後面是18個零,所以 10**18 就是 1個代幣,而我們用 10 ** uint256(decimals())) 的意思,就是用預設值來計算。這裡是坑,小心勿踩。
然後按照上圖,左邊
ENVIROMENT 選 Injected Web3 ,意思是注入 Web3 的使用方式,這是最簡單的,你不用準備其他的編譯環境。
ACCOUNT 貼上要部署此合約的錢包地址,建議在這裡使用子錢包。最好符合錢包的安全使用規則。
CONTRACT 選擇已編譯完成的合約,我們這裡是 ADCToken ,檔名是 AndyCoin (此例檔名跟合約名不同)
DEPLOY 拉開後出現 INITIALSUPPLY ,這是合約建構子的參數名稱,是 Token 的初始供應量,由於合約沒有實現其他造幣的方法,因此這裡也等於總量。我們先少少的發行10億個幣就好。此坑小心輕踩。
輸入完成後,黃色按鈕 trasaction 。
然後錢包需要確認這筆交易,如下圖
這裡標出所需花費的 gas ,這個值會跟在 mainchain 上部署一樣。
確認之後,回到 Remix ,如下圖右下部份。
看到右下區域的 console
第二行綠色的文字,鏈接可以直接點開,會另開視窗到 etherscan ,可以即實看到這筆交易被確認的情況。
第三行是交易已經確認上鏈了。
下圖是確認完上鏈之後, Remix 左邊出現剛剛部署的合約欄位。
Deployed Contracts 下拉,可以看到部署的合約。選到 ADCTOKEN , 可以先按右邊的複製鍵,把合約地址複製下來。許多地方都會用到此合約地址,比如在錢包內新增代幣時也會用到。
黃色的按鈕,是需要 gas 的操作,藍色的按鈕是不需要 gas 的操作。
我們點開 name, symbol, totalSupply 三個,如下圖
三個欄位都正確沒毛病,totalSupply 是10億個代幣,後面跟上 18個零,因為 decimals 的項設值是18,我們沒有更改。
打開 MetaMask 發現代幣已到帳,因為 OpenZappelin 的 ERC20 實現,是會把初始供應量全部發給合約的創建者。如下圖。
然後我們用 Remix 操作合約,發10萬個幣給另一個錢包帳號。這裡操作時,我們已經先把帳號複製下來,沒有切換錢包,請注意沒有切換錢包。如下圖。
按下 transaction ,一樣要在錢包上確認。
如果沒有出現確認,就先等一下。等到出現確認並且按下之後,再切換成另一個接收代幣的帳號。下圖是切換到接收的錢包,下方沒有 ADC 代幣。
沒有出現 ADC 代幣,我們手動加上。
按加入代幣之後,如下圖。
在代幣合同位址的欄位,貼上合約地址,如下圖。
會自動出現代幣代號及小數點精度, symbol 跟 decimal 。
按下一頁。
然後按如入代幣。如下圖。
然後再按回到上一頁,在左上角的向左箭頭。回到錢包主頁
看到已經出現 ADC Token , 數量 10000 個,沒毛病。再回到剛剛的帳號,看看剩多少 ADC 。如下圖。
ADC 代幣剩下 9億9千9百9十萬個。沒問題。
如果你想的話,也可以用錢包直接發,不需要從 Remix 操作合約來發代幣。一般我們也是直接從錢包發就可以了。
到目前為止,我們使用 OpenZappelin 的 ERC20 合約發行了 ADC Token ,看起來也很順利,但我們卻不了解裡面的結構,也就是 ERC20 代幣合約的內容是什麼,然後 OpenZappelin 又做了些什麼事。
下一篇文章我們來看看 ERC20.sol 裡面做了些什麼,看看高手是如何寫合約,看這種符合安全審核的程式,對我們這種新手來說很重要。可以透過高品質的代碼,學習到各種避免出現問題的寫法,盡量模仿高手的優點。