【以太坊開發】geth的使用入門
geth的全稱是go-ethereum,是一個以太坊客戶端,用go語言編寫,應該是目前最常用的客戶端。當然以太坊客戶端還有用C++,Ruby,Python,Java等其他多種語言編寫的,不同型別的客戶端是為了滿足不同的需求場景。今天我們主要來介紹geth(發音同guess )的使用。
對於我們開發來說,比較普遍有兩種方式開啟geth控制檯,以開發方式登入和私鏈方式登入。這兩種方式是完全不同的,兩者的賬戶也是不共用的,其中以開發方式登入相對比較簡單,以私鏈方式登入還需要進行額外的配置,我會在後面的部落格進行介紹。
(1)開啟終端Terminal,執行以下命令,以開發方式啟動geth
geth --datadir “c:/ethdev” --dev
這會在當前根目錄下建立一個ethdev資料夾,當然這個資料夾的名稱你可以自己取,我們暫且不管這個資料夾是幹嘛用的,後面會進行介紹。
(2)geth啟動成功後,重新開一個終端,執行以下命令,開啟geth控制檯:
geth --dev console 2>>file_to_log_output
該命令會開啟geth控制檯,同時在目錄下生成一個叫做file_to_log_output的日誌檔案,等下我們會來檢視這個日誌檔案。
(3)檢視當前有哪些賬戶
eth.accounts
.
可見當前沒有任何賬戶。
(4)建立一個新賬戶
personal.newAccount(‘密碼')
我們這裡建立兩個賬戶。再使用eth.accounts檢視賬戶:
就發現有兩個賬戶了。
(5)可以把賬戶賦值給某一個變數,同時查詢賬戶中的餘額
可以看到兩個賬戶中的以太幣都是0.因為我們還沒有啟動挖礦。
(6)上面提到過日誌檔案,我們再重開一個終端,我們使用以下命令開啟日誌:
tail -f file_to_log_output
我們把這個終端介面放在一邊,等下在geth控制檯中有任何操作時,都可以來這邊看看日誌。
(7)在geth控制檯中啟動挖礦:
miner.start()
來觀察日誌輸出:
可以看到在日誌介面中已經顯示在挖礦了。
(8)停止挖礦
miner.stop()
此時也可以看到日誌介面輸出也停止了。
(9)此時我們再來檢視兩個賬戶的賬戶餘額
由此可見,挖礦所得的以太幣預設是傳入第一個賬戶的。
(10)user1向user2轉移以太幣
eth.sendTransaction({from: user1,to: user2,value: web3.toWei(3,"ether")})
提示我們賬號是鎖定的,所以我們需要解鎖賬戶。
解鎖賬戶後,轉移操作就成功了。打印出來的是本次交易的地址。
(11)再次檢視以太幣轉移後的user2賬戶餘額
。
但是發現user2的賬戶還是為0.這是因為沒有礦工來挖礦處理。根據區塊鏈的概念,我們知道,每次交易的確認,其實都是需要挖礦的,也就是被其他礦工共識確認,然後才能加入區塊鏈的賬本中。
好,我們執行“miner.start()”開始挖礦,
.
然後就發現賬戶user2有3個以太幣了。轉賬操作成功。
(12)下面我們來實現下在geth中編譯一個智慧合約
- contract test {
- function multiply(uint a) returns(uint d) {
- return a * 7;
- }
- }
source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
然後編譯該合約:
contract = eth.compile.solidity(source).test
編譯後的結果如下:
code:就是合約編譯後的位元組碼檔案,在以太坊虛擬機器EVM上執行的就是這個位元組碼;
abiDefinition:其實就是合約的二進位制介面,可用來外部呼叫;
其他的一些引數也都是可以見名知意了。
abi=[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"type":"function"}]
然後是訪問abi介面:
MyContract=eth.contract(abi)
然後獲得合約的例項:
myContract=MyContract.new({from:user1,data:contract.code})
如果提示你沒有解鎖的話,只要解鎖即可。
呼叫函式傳遞引數
。
函式做了乘以7的操作,輸出符合預期。合約執行成功。