手把手在以太坊 Rinkeby 測試網路部署 ERC20 智能合約,並轉送 ERC20 Token。
0、參考:
(1)OpenZeppelin ERC20 源碼分析:
https://yuanxuxu.com/2018/06/27/openzeppelin-erc20-code-analysis/
(2)ERC20 Token 使用手冊:
https://medium.com/taipei-ethereum-meetup/erc20-token%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8A-3d7871c58bea
(3)生產環境手把手部署 ERC20 智能合約
https://www.cnblogs.com/xiaoxiaoleo/p/9146031.html
(4)手把手教你發行自己的以太坊 ERC20 Token:
https://www.jianshu.com/p/e6ca8122a3a3
1、安裝 MetaMask Chrome 套件,並取得一組以太坊 Ethereum 私鑰及地址,請先參考下列文章說明:
https://steemit.com/rinkeby/@oneleo/metamask-chrome-ethereum
https://steemkr.com/rinkeby/@oneleo/metamask-chrome-ethereum
2、免費取得以太坊 Ethereum Rinkeby 測試網路的以太幣,請參考下列文章說明:
https://steemit.com/rinkeby/@oneleo/ethereum-rinkeby
https://steemkr.com/rinkeby/@oneleo/ethereum-rinkeby
3、開始建立屬於自己的 ERC20 Token。
本處使用的 OpenZeppelin 是主打安全及受到和社群審查的智能合約專案,可用來建立安全的智能合約,本處則使用此專案的 ERC20 智能合約來建立安全的 ERC20 Token。
(1)至 https://github.com/OpenZeppelin/openzeppelin-solidity 點選【Clone or download】下載 OpenZeppelin 專案。
(2)將 openzeppelin-solidity 專案解壓縮(此處以解壓縮至「%USERPROFILE%\Downloads\SmartContract」目錄為例)。
(3)在開啟 Remix 線上編譯環境前,請先確認 Chrome 瀏覽器右上角的 MetaMask 是否已選到以太坊【Rinkeby Test Net】,且是指到地址為「0x131746C3CaB2C6525DCCb1854458CdeE8199098F」的【Account 1】。
(4)開啟 https://remix.ethereum.org 線上編輯環境,並點選左上角【Add Local file to the Browser Storage Explorer】鈕將下列 OpenZeppelin 專案檔案匯入:
a、%USERPROFILE%\Downloads\SmartContract\contracts\examples\SimpleToken.sol
b、%USERPROFILE%\Downloads\SmartContractIn\contracts\token\ERC20\StandardToken.sol
c、%USERPROFILE%\Downloads\SmartContractIn\contracts\token\ERC20\BasicToken.sol
d、%USERPROFILE%\Downloads\SmartContractIn\contracts\token\ERC20\ERC20.sol
e、%USERPROFILE%\Downloads\SmartContractIn\contracts\token\ERC20\ERC20Basic.sol
f、%USERPROFILE%\Downloads\SmartContractIn\contracts\math\SafeMath.sol
(5)將六個檔案匯入至 Remix 畫面如下:
(6)此時因為每一個檔案在 Remix 編譯環境均在同一個「browser」目錄底下,故要進行修正,首先修改 BasicToken.sol 檔第 3 列(修改 import 位址):
pragma solidity ^0.4.24;
import "./ERC20Basic.sol";
import "./SafeMath.sol";
// …(下略)
(7)同樣,修改 SimpleToken.sol 第 4 列(修改 import 位址);以及可順便更改第 15 列(自行定義的 Token 名稱)、第 16 列(自行定義的 Token 縮寫):
註:為方便教學,這邊均採預設的 SimpleToken 及 SIM 縮寫。
註:Decimals 則是此 Token 允許的小數點位數,這邊均採預設的 18 位數。
pragma solidity ^0.4.24;
import "./StandardToken.sol";
/**
* @title SimpleToken
* @dev Very simple ERC20 Token example, where all tokens are pre-assigned to the creator.
* Note they can later distribute these tokens as they wish using `transfer` and other
* `StandardToken` functions.
*/
contract SimpleToken is StandardToken {
string public constant name = "SimpleToken"; // solium-disable-line uppercase
string public constant symbol = "SIM"; // solium-disable-line uppercase
uint8 public constant decimals = 18; // solium-disable-line uppercase
uint256 public constant INITIAL_SUPPLY = 10000 * (10 ** uint256(decimals));
// …(下略)
(8)以上修改完成後,右側點選【SimpleToken】,再點選右上角【Start to compile】,並且在右側出現六個 BasicToken、ERC20、ERC20Basic、SafeMath、SimpleToken、StandardToken 綠色編譯成功的資訊。
註:若無法點選【SimpleToken】,則可嘗試直接點選【Start to compile】來嘗試編譯。
(9)點選右上角【Run】標籤,並按照以下數值設置:
「Enviroment」=【Inject web3】
「Account」=【0x131746C3CaB2C6525DCCb1854458CdeE8199098F】(會自動偵測目前 MetaMask 指到的 Account 1 帳號錢包)
「Gas limit」=【3000000】(使用預設的數值即可)
→ 接著點選要部署到以太坊 Rinkeby 測試網路的【SimpleToken】檔案 → 再來點選【Deploy】開始部署。
(10)因為部署智能合約需要支付手續費,此時會自動跳出 MetaMask 支付以太幣通知,因為之前已取得數枚測試用以太幣,所以直接點選【SUBMIT】支付。
(11)部署成功後可看到 Remix 編譯器下方會顯示部署成功訊息,此時先點選右側下方「SimpleToken at 0x906637756CD20f232d9CB85D45A28d1143292bad」的【複製】鈕將此 ERC20 Token 的地址複製起來。
(12)接著點選 Chrome 瀏覽器右上角的【MetaMask】→ 點選「Account 1」下方的【TOKENS】→ 點選【ADD TOKEN】。
(13)然後按照以下輸入數值:
「Token Contract Address」=【0x906637756cd20f232d9cb85d45a28d1143292bad】(即為剛才複製的 ERC20 智能合約地址)
「Token Symbol」=【SIM】(會自動填入)
「Decimals of Precision」=【18】(預設即可)→ 點選【Add】
(14)此時就可以在 MetaMask 上看到「Account 1」帳號底下已經有10000.000 顆 SIM ERC20 Token 入帳了。
4、下一步就是要將以太坊 Rinkeby 測試網路的 SIM ERC20 Token 轉到其他帳戶底下(這邊為方便起見,是將 SIM Token 轉到自己的 Account 1 地址下)。
(1)至 MyEtherWallet https://www.myetherwallet.com/ 平台點選右上方【Rinkeby (etherscan.io)】指定以太坊 Rinkeby 測試網路。
(2)接著點選上方【Send Ether & Tokens】→ 點選左側【MetaMask / Mist】。
(2)在點選「Connect to MetaMask」前,請先確認 Chrome 瀏覽器右上角的【MetaMask】是選到以太坊【Rinkeby Test Net】,且是指到地址為「0x131746C3CaB2C6525DCCb1854458CdeE8199098F」的【Account 1】。
(3)點選【Connect to MetaMask】後 MyEtherWallet 會和目前的 MetaMask 帳號連動,並進到錢包主控台,我們直接點選右下角的【Add Custom Token】。
(4)此時會要求我們輸入 SIM ERC20 Token 智能合約的地址,假設我們已忘記此 ERC20 智能合約的地址了,所以點選瀏覽器右上角的【MetaMask】是選到以太坊【Rinkeby Test Net】→ 再點選「Account 1」右邊的【…】→ 再點選【View account on Etherscan】開啟錢包瀏覽器。
(5)可以看到此帳號之前建立 ERC20 智能合約的轉帳項目 → 點選那一筆轉帳項目右方的【Contract Creation】鈕。
(6)就可以看到這條 ERC20 智能合約的地址了(本處智能合約地址為:0x906637756CD20f232d9CB85D45A28d1143292bad)。
(7)回到 MyEtherWallet 畫面,並依序輸入以下資訊:
「Token Contract Address」=【0x906637756CD20f232d9CB85D45A28d1143292bad】(即為剛才看到的 ERC20 智能合約地址)
「Token Symbol」=【SIM】(當時在編譯 ERC20 智能合約時指定的 Token Symbol 名稱,這邊為 SIM)
「Decimals」=【18】(當時在編譯 ERC20 智能合約時指定的 Decimals 位數,這邊為 18)
→ 輸入完成後點選【Save】。
(8)新增完成後,即可在「Amount to Send」右側點選到【SIM】ERC20 Token 了。
(9)接下來要將此 SIM Token 轉出,為方便起見,這邊轉出的帳戶為自己的帳戶,請依照以下輸入:
「To Address」=【0x131746C3CaB2C6525DCCb1854458CdeE8199098F】
「Amount to Send」=【5000】【SIM】
「Gas Limit」=【42000】(因為轉 ETC20 Token 需要傳送較多資料,故提高手續費以增加轉帳成功機率)
→ 點選【Generate Transaction】→ 點選【Send Transaction】。
(10)接下來會出現確認明細,只需要確認最下方的訊息即可 → 點選【Yes, I am sure! Make transaction.】。
最下方的訊息為:「You are about to send 5000 SIM to address 0x131746C3CaB2C6525DCCb1854458CdeE8199098F」
註:為什麼上方的「To Address」的地址會和下方顯示的地址不同?
→ 因為 ERC20 智能合約的特性,轉帳時是針對「此智能合約的地址」來轉帳,而「多少」ERC20 Token、以及要轉到哪一個「地址」等等資訊,實際上是轉換成「16 進制」碼後打包到「Data」欄位中送出。
(10)因為轉 ERC20 Token 也需要支付手續費,此時會自動跳出 MetaMask 支付以太幣通知,直接點選【SUBMIT】支付。
(11)確認 SIM Token 是否有成功轉出,點選瀏覽器右上角的【MetaMask】→ 選到以太坊【Rinkeby Test Net】→ 再點選「Account 1」右邊的【…】→ 點選【View account on Etherscan】鈕。
(12)可以看到剛才的交易已完成 → 再來點選【Token Transfers】。
(13)這邊就可以看到剛才的 SIM ERC20 Token 確實有成功轉出,但是是因為是轉回到自己的地址,所以點選「Token Balances:」右邊的【View ($0.00)】可以看到 SIM Token 仍然是 10,000 顆。
Donate ADA:
DdzFFzCqrhsup2Q4nnhKJJZ5BRuPkYUSPqDJn72t2dtHtVqsz5kQQmopMQR16Sv9qS5NC4w8Kv5P8XrDH2n2FD2akxtrntjc8hbgAmTz
Congratulations @oneleo! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :
Award for the number of posts published
Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word
STOP
Do not miss the last post from @steemitboard:
SteemitBoard World Cup Contest - The results, the winners and the prizes
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Congratulations @oneleo! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :
Award for the number of upvotes received
Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word
STOP
Do not miss the last post from @steemitboard:
SteemitBoard World Cup Contest - The results, the winners and the prizes
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit