之前有自己開發(fā)過 Ethereum 智能合約,但沒有好好紀錄開發(fā)的過程和碰到的問題,覺得滿可惜。這次想重新開始,從最傻的姿勢開始,一步步成長。本篇希望將一個很簡單的代幣合約(只能發(fā)行和轉(zhuǎn)帳),部署在本地和測試網(wǎng)路上,并測試其功能。本篇是較詳細描述使用 Remix 的步驟及使用上可能碰到的問題。
開發(fā)環(huán)境
不需要安裝,直接在任何瀏覽器開啟 Remix。
Remix 是一個 Open Source 的 Solidity 智能合約開發(fā)環(huán)境,提供基本的編譯、部署至本地或測試網(wǎng)路、執(zhí)行合約等功能。Solidity 是 Ethereum 官方設計和支援的程式語言,專門用于編寫智能合約。
取得代幣合約
代幣合約的范例很多,Ethereum 官網(wǎng)有提供一個最小可行的代幣合約(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 合約真的很傻,只能做兩件事:
- 創(chuàng)造代幣:發(fā)起合約時創(chuàng)造指定數(shù)量的代幣,代幣擁有者是發(fā)起合約的 Ethereum 帳戶
- 轉(zhuǎn)移代幣:轉(zhuǎn)移指定數(shù)量的代幣到指定的 Ethereum 帳戶
使用 Remix 編譯合約
1. 點選右上角 + 新增一個檔案
名稱任意只要副檔名是 ".sol"。
2. 復制合約內(nèi)容到該檔案并編譯
Remix 預設會自動編譯,旁邊沒有跳出紅色的 ERROR 就代表編譯成功。
在本地部署合約
1. 設定網(wǎng)路
點選左邊上面的 run。
Environment 選擇 JavaScript VM 代表所有資料都是存在本地記憶體(功能類似 testrpc)。它會提供 5 個虛擬帳戶每個有 100 ETH,隨便選一個帳戶(要記住)。
2. 發(fā)送交易部署合約
選擇 MyToken。可以看到 create 按鈕。且已根據(jù)合約內(nèi)容顯示必須填入 initialSupply
(也就是要發(fā)行的代幣數(shù)量)。輸入一個數(shù)目并按 create,就會發(fā)送交易部署合約。
合約部署成功后,可以看到合約的使用介面。Remix 會自動根據(jù)合約的內(nèi)容,產(chǎn)生對應的合約使用介面。可以看到合約有兩個功能:balanceOf(查詢余額) 和 transfer(轉(zhuǎn)移代幣)。
底下可以看到 log(紀錄每一次的操作)。實際上部署合約是透過一個 Ethereum 交易完成,點 Details 可以看到該筆交易詳細資料。
執(zhí)行合約 - 查詢余額
1. 選擇剛剛發(fā)起合約的帳戶
2. 輸入帳戶
注意要用 "" 把帳戶包起來,范例:
"0xca35b7d915458ef540ade6068dfe2f44e8fa733c"
3. 點擊 balanceOf
可以在旁邊看到執(zhí)行結(jié)果,也就是目前這個帳戶的代幣余額。
錯誤情況
說明一下,因為資料傳送是用 JSON 格式,所以要加上 ""。如果忘記輸入 "" 就會在 log 看到錯誤:
執(zhí)行合約 - 轉(zhuǎn)移代幣
1. 選擇要轉(zhuǎn)出的帳戶
選擇剛剛發(fā)起合約的帳戶。
2. 輸入要轉(zhuǎn)入的帳戶
選擇并復制另一個帳戶。在合約介面 transfer 后面的欄位,輸入轉(zhuǎn)入帳戶和要轉(zhuǎn)移的代幣數(shù)量。帳戶同樣用 "" 包起來,范例:
"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db", 10
3. 點擊 transfer
點擊 transfer,成功后會看到 log 更新。
4. 確認余額更新
再查詢轉(zhuǎn)入帳戶的余額,就可以看到代幣余額增加啦!
錯誤情況
如果選擇要轉(zhuǎn)出的帳戶代幣余額不足,這筆交易會失敗,就會在 log 看到錯誤。
在測試網(wǎng)路部署合約
1. 安裝 MetaMask
首先,要連到測試網(wǎng)路,就要安裝 MetaMask。他是瀏覽器端的 Ethereum 錢包,可以連結(jié) Ethereum 主要和測試網(wǎng)路。安奘后需要建立 Ethereum 帳戶,教練,我”只”想學Solidity 這篇有詳細的步驟。
2. 選擇測試網(wǎng)路
回到 Remix,這次 Environment 選擇 Injected Web3,Remix 會自動連結(jié) MetaMask。
3. 部署合約
接著用剛才同樣的方式,按 create 部署合約,就會看到 MetaMask 的彈出視窗。直接按 submit 發(fā)送交易。
稍等一點時間(因為要等這個交易被確認),部署成功后合約的使用介面就會跑出來。
就可以用同樣的方式使用合約啦!
總結(jié)
Remix 提供一個 Solidity 智能合約的開發(fā)環(huán)境,可以簡易的編譯、部署、執(zhí)行甚至除錯,適合編程經(jīng)驗不多的初學者。但無法做到版本控制、測試及和其他開發(fā)工具一起使用等,實際要開發(fā) DApp 的話會比較不方便。下一篇會參考以下文章:
使用 Truffle3、Ganache、web3.js 來編譯和部署合約。