1. 程式人生 > >【以太坊開發】geth的使用入門

【以太坊開發】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中編譯一個智慧合約

  1. contract test {  
  2.     function multiply(uint a) returns(uint d) {  
  3.         return a * 7;   
  4.     }   
  5. }  
在geth中執行如下:

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的操作,輸出符合預期。合約執行成功。