以太坊的命令行客戶端挺多,不同語言的實現(xiàn),有python的pyethapp,有c++的cpp-ethereum,還有我們這里要說的go語言實現(xiàn)的geth。
geth是官方客戶端,也是目前最流行的以太坊命令行客戶端。還有適合普通用戶使用的圖形化客戶端,Ethereum Wallet 和 Mist。
上一節(jié)中我們的智能合約是部署在javascript模擬的區(qū)塊鏈節(jié)點中。我們現(xiàn)在準備把它部署到真正的以太坊節(jié)點上,當然我們是部署在開發(fā)環(huán)境中,正式環(huán)境的部署是需要花費以太幣的。
安裝go語言環(huán)境
官方下載頁面 https://golang.org/dl/
官方安裝說明 https://golang.org/doc/install
也可以網(wǎng)上搜索下go語言安裝,安裝完成后測試下
$ go version
正常的話,會返回go的版本號,類似這樣
go version go1.9.3 darwin/amd64
安裝geth
有很多安裝方式,官方安裝說明 https://ethereum.github.io/go-ethereum/install
這里使用源碼安裝方式
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make geth
編譯完成后找到可執(zhí)行文件 geth (或者 geth.exe windows下),文件在源碼目錄下 /build/bin/ 。這個文件是可以單獨執(zhí)行的,不需要任何其它文件的依賴,你可以隨意將它拷貝到其它目錄,或者將它添加到你的PATH環(huán)境變量中。
啟動geth
geth可以有很多不同的啟動方式,可以連接以太坊主網(wǎng)絡、以太坊測試網(wǎng)絡,或者搭建以太坊私有鏈,這些啟動方式我們以后再談到,現(xiàn)在我們啟動以太坊開發(fā)環(huán)境。
geth --ipcpath <test-chain-directory>/geth.ipc --datadir <test-chain-directory> --dev console
geth --datadir <data directory> --dev --rpc --rpccorsdomain "*" console
參數(shù)說明
--datadir 數(shù)據(jù)庫和秘鑰存儲路徑
--dev 開發(fā)環(huán)境,采用權(quán)威證明(PoA),開發(fā)帳號有預存金額,自動封裝交易數(shù)據(jù)到區(qū)塊鏈
--rpc 開啟HTTP-RPC服務,默認8545端口
--rpccorsdomain 允許連接到rpc的url匹配模式 *代表任意
console 啟動一個交互式的JavaScript環(huán)境
``
控制臺命令
> web3.eth.accounts
["0xe698356a50e71bade22e1a324d5c815f0631df2c"]
> user1 = web3.eth.accounts[0]
"0xe698356a50e71bade22e1a324d5c815f0631df2c"
> user1_balance = web3.eth.getBalance(user1)
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+77
> web3.fromWei(user1_balance,'ether')
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+59
解釋下這幾個命令:
-
web3.eth.accounts獲取當前節(jié)點控制的帳號列表,這里可以看到已經(jīng)有一個帳號了,這是--dev參數(shù)幫我們創(chuàng)建的帳號。 -
web3.eth.getBalance(user1)獲取帳號余額,我們看到返回了一個很大的數(shù)字,77次方的一個值。這也是--dev參數(shù)幫我們給這個帳號預存的余額,方便我們做測試。 -
web3.fromWei(user1_balance,'ether')把這個余額做單位轉(zhuǎn)換。以太幣有一套貨幣單位,最大的是ether,最小的是wei,1ether = 10^18wei。我們查詢余額默認給出的是wei為單位的表示,這里是把單位轉(zhuǎn)換成ether為單位的表示。
這里使用的web3對象,是以太坊開發(fā)的一套javascript庫,目的是讓應用程序能夠與以太坊節(jié)點進行通信。注意,這里有兩層,geth啟動了一個以太坊節(jié)點,console參數(shù)開啟了一個javascript的控制臺,這個控制臺注入了web3.js這個庫,以使我們可以通過web3對象與以太坊節(jié)點做交互。
web3命令的完整文檔 https://github.com/ethereum/wiki/wiki/JavaScript-API
以太幣單位說明 http://ethdocs.org/en/latest/ether.html
remix與geth綁定
啟動完成geth后,我們需要將我們的remix IDE與geth綁定。remix的安裝和使用前面有介紹。
在右側(cè)功能項中 Run -> Environment 選擇 Web3 Provider,使用默認的連接地址。

綁定完成后,現(xiàn)在我們的Account 列表中就是我們剛剛在控制臺中查詢到的帳號,后面還有很長一個數(shù)值,是它的余額。
在remix的命令行終端中輸入命令

這里與我們之前的控制臺是一樣的。我們看到現(xiàn)在塊高(blockNumber)是0。
部署代幣合約
現(xiàn)在與我們之前的合約部署是一樣的,點擊Create就可以了。部署完成后我們再次查詢
> web3.eth.blockNumber
1
現(xiàn)在塊高已經(jīng)是1了,就是說我們剛剛的代幣合約已經(jīng)寫入?yún)^(qū)塊鏈了。
在remix下做方法調(diào)用
現(xiàn)在我們需要再創(chuàng)建一個帳號用來做測試
> web3.personal.newAccount("123456")
"0xc710711af7f890ecef56bb38bde1eade2e5d0ab8"
注意,這個命令在remix的控制臺不能使用,提示personal_newAccount方法不存在,我猜應該是web3的版本問題。所以我是在命令行窗口下進行的。
transfer "0xc710...ab8",2000 這里地址我省略了,實際調(diào)用需要完整地址。調(diào)用完成后我們在控制臺再查詢塊高,現(xiàn)在是2了。同時我們發(fā)現(xiàn)所有藍色按鈕(只讀)的方法,是不會增加塊高的,只有紅色按鈕(有寫入操作)的方法會增加塊高度。