【Ethereum 智能合約開發筆記】編譯和部署合約的第一種姿勢:使用 Remix

之前有自己開發過 Ethereum 智能合約,但沒有好好紀錄開發的過程和碰到的問題,覺得滿可惜。這次想重新開始,從最傻的姿勢開始,一步步成長。

本篇希望將一個很簡單的代幣合約(只能發行和轉帳),部署在本地和測試網路上,並測試其功能。

教練,我”只”想學Solidity 這篇也是用 Remix 和 MetaMask 部署合約到測試網路,已經瞭解這篇應該可以直接 end。本篇是較詳細描述使用 Remix 的步驟及使用上可能碰到的問題


開發環境

不需要安裝,直接在任何瀏覽器開啟 Remix

Remix 是一個 Open SourceSolidity 智能合約開發環境,提供基本的編譯、部署至本地或測試網路、執行合約等功能。Solidity 是 Ethereum 官方設計和支援的程式語言,專門用於編寫智能合約。

Remix

取得代幣合約

代幣合約的範例很多,Ethereum 官網有提供一個最小可行的代幣合約(MINIMUM VIABLE TOKEN):

pragma solidity ^0.4.0;
contract MyToken {
/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;

/* Initializes contract with initial supply tokens to the creator of the contract */
function MyToken(uint256 initialSupply) public {
balanceOf[msg.sender] = initialSupply;
// Give the creator all initial tokens
}

/* Send coins */
function transfer(address _to, uint256 _value) public {
require(balanceOf[msg.sender] >= _value);
// Check if the sender has enough
        require(balanceOf[_to] + _value >= balanceOf[_to]); 
// Check for overflows
        balanceOf[msg.sender] -= _value;                    
// Subtract from the sender
        balanceOf[_to] += _value;                  
// Add the same to the recipient
}
}

這個 MyToken 合約真的很傻,只能做兩件事:

  • 創造代幣:發起合約時創造指定數量的代幣,代幣擁有者是發起合約的 Ethereum 帳戶
  • 轉移代幣:轉移指定數量的代幣到指定的 Ethereum 帳戶

至於一個完整的代幣合約,可參考ERC20 Token使用手冊


使用 Remix 編譯合約

1. 點選右上角 + 新增一個檔案

名稱任意只要副檔名是 “.sol”。

2. 複製合約內容到該檔案並編譯

Remix 預設會自動編譯,旁邊沒有跳出紅色的 ERROR 就代表編譯成功。

編譯合約成功

在本地部署合約

1. 設定網路

點選左邊上面的 run

Run

Environment 選擇 JavaScript VM 代表所有資料都是存在本地記憶體(功能類似 testrpc)。它會提供 5 個虛擬帳戶每個有 100 ETH,隨便選一個帳戶(要記住)。

Testing Account

2. 發送交易部署合約

選擇 MyToken。可以看到 create 按鈕。且已根據合約內容顯示必須填入 initialSupply(也就是要發行的代幣數量)。輸入一個數目並按 create,就會發送交易部署合約。

Create

合約部署成功後,可以看到合約的使用介面。Remix 會自動根據合約的內容,產生對應的合約使用介面。可以看到合約有兩個功能:balanceOf(查詢餘額)transfer(轉移代幣)

合約介面

底下可以看到 log(紀錄每一次的操作)。實際上部署合約是透過一個 Ethereum 交易完成,點 Details 可以看到該筆交易詳細資料。

Log

執行合約 — 查詢餘額

1. 選擇剛剛發起合約的帳戶

可點選帳戶右邊的圖示複製

2. 輸入帳戶

注意要用 “” 把帳戶包起來,範例:

"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"

3. 點擊 balanceOf

可以在旁邊看到執行結果,也就是目前這個帳戶的代幣餘額。

查詢餘額成功

錯誤情況

說明一下,因為資料傳送是用 JSON 格式,所以要加上 “”。如果忘記輸入 “” 就會在 log 看到錯誤:

JSON 參數格式錯誤

執行合約 — 轉移代幣

1. 選擇要轉出的帳戶

選擇剛剛發起合約的帳戶。

可點選帳戶右邊的圖示複製

2. 輸入要轉入的帳戶

選擇並複製另一個帳戶。在合約介面 transfer 後面的欄位,輸入轉入帳戶和要轉移的代幣數量。帳戶同樣用 “” 包起來,範例:

"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db", 10

3. 點擊 transfer

點擊 transfer,成功後會看到 log 更新。

交易執行成功 log

4. 確認餘額更新

再查詢轉入帳戶的餘額,就可以看到代幣餘額增加啦!

轉入帳戶餘額增加

錯誤情況

如果選擇要轉出的帳戶代幣餘額不足,這筆交易會失敗,就會在 log 看到錯誤。

交易執行失敗 log

在測試網路部署合約

1. 安裝 MetaMask

首先,要連到測試網路,就要安裝 MetaMask。他是瀏覽器端的 Ethereum 錢包,可以連結 Ethereum 主要和測試網路。安奘後需要建立 Ethereum 帳戶,教練,我”只”想學Solidity 這篇有詳細的步驟。

MetaMask
成功開啟後,應該會長這樣
記得選擇 Ropsten Test Net

2. 選擇測試網路

回到 Remix,這次 Environment 選擇 Injected Web3,Remix 會自動連結 MetaMask。

成功會看到和 MetaMask 相同帳戶和 Ether 餘額

3. 部署合約

接著用剛才同樣的方式,按 create 部署合約,就會看到 MetaMask 的彈出視窗。直接按 submit 發送交易。

用 MetaMask 發送交易

稍等一點時間(因為要等這個交易被確認),部署成功後合約的使用介面就會跑出來。

合約介面,當然是長一樣

就可以用同樣的方式使用合約啦!


總結

Remix 提供一個 Solidity 智能合約的開發環境,可以簡易的編譯、部署、執行甚至除錯,適合編程經驗不多的初學者。但無法做到版本控制、測試及和其他開發工具一起使用等,實際要開發 DApp 的話會比較不方便。下一篇會參考以下文章:

使用 Truffle3、Ganache、web3.js 來編譯和部署合約。