第三課 如何實現以太坊最簡智慧合約“Hello World”的執行

筆名輝哥發表於2018-11-15

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行

【本文目標】 完成以太坊最簡智慧合約“Hello World”的編寫和執行

【技術收穫】 跟隨本文實踐,你將可以有以下收穫:

  1. 啟動GETH以太坊錢包環境
  2. 準備賬戶
  3. 建立賬戶
  4. 給新賬戶轉賬
  5. 解鎖賬戶
  6. 編寫合約程式碼
  7. 部署合約
  8. 執行合約

【實操課程列表】 第一課 如何在WINDOWS環境下搭建以太坊開發環境

第二課 如何實現以太坊最簡智慧合約“Hello World”的執行

第四課 以太坊開發框架Truffle從入門到實戰

第六課 技術小白如何開發一個DAPP區塊鏈應用(以寵物商店為例)

第七課 技術小白如何在45分鐘內發行通證(TOKEN)並上線交易

第八課 如何除錯以太坊官網的智慧合約眾籌案例

【說明】未列出的課程為知識普及的非實操類課程,所有區塊鏈文章參考“區塊鏈入口”專欄。

1. 啟動GETH以太坊錢包環境

如果你對於以太坊智慧合約開發還沒有概念(本文會假設你已經知道這些概念),建議先閱讀入門篇。 就先學習任何程式語言一樣,入門的第一個程式都是Hello World。今天我們來一步一步從搭建以太坊智慧合約開發環境開始,講解智慧合約的Hello World如何編寫。

【說明】強烈建議新手使用Browser-Solidity來進行開發。

Browser-Solidity是一個基於瀏覽器的Solidity,就可以不用安裝Solidity,本文的Hello World教程也將基於Browser-Solidity來進行。如果你想自己安裝請參考Solidity安裝指引

geth是一個以太坊客戶端,現在利用geth啟動一個以太坊(開發者)網路節點。

geth --datadir testNet --dev console 2>> test.log
複製程式碼

執行命名後,會進入geth控制檯,這時游標停在一個向右的箭頭處,像這樣:

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行
命令引數說明: –dev 啟用開發者網路(模式),開發者網路會使用POA共識,預設預分配一個開發者賬戶並且會自動開啟挖礦。 –datadir 後面的引數是區塊資料及祕鑰存放目錄。 第一次輸入命令後,它會放在當前目錄下新建一個testNet目錄來存放資料。 console 進入控制檯 2>> test.log 表示把控制檯日誌輸出到test.log檔案

為了更好的理解,建議新開一個命令列終端,實時顯示日誌:

tail -f test.log
複製程式碼

輸出截圖:

Xshell建立一個新的視窗用於輸出LOG結果

2. 準備賬戶

部署智慧合約需要一個外部賬戶,我們先來看看分配的開發者賬戶,在控制檯使用以下命令檢視賬戶:

eth.accounts

回車後,返回一個賬戶陣列,裡面有一個預設賬戶, 也可以使用personal.listAccounts檢視賬戶。

personal.listAccounts

本文作者已建立了一個賬號,共有2個賬號了:

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行

eth.getBalance(eth.accounts[0])表示賬戶列表第一個賬戶 回車後,可以看到大量的餘額,如:

1.15792089237316195423570985008687907853269… e+77

開發者賬戶因餘額太多,如果用這個賬戶來部署合約時會無法看到餘額變化,為了更好的體驗完整的過程,這裡選擇建立一個新的賬戶。

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行

3. 建立賬戶

使用以下命令建立賬戶:

personal.newAccount("duncanwang")

duncanwang為新賬戶的密碼,回車後,返回一個新賬戶。 可以看到賬戶陣列包含了3個賬戶,新賬戶在第三個(索引為2)位置。 現在看看賬戶的新餘額,可以發現是0.

eth.accounts eth.getBalance(eth.accounts[2])

截圖如下:

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行

4. 給新賬戶轉賬

我們知道沒有餘額的賬戶是沒法部署合約的,那我們就從預設賬戶轉1以太幣給新賬戶,使用以下命令(請使用你自己eth.accounts對應輸出的賬戶):

eth.sendTransaction({from: '0x8cfa24a398efd88de3843d7834cb07fce41e6f46', to: '0x0f1b9da153d910f6ae150145924615c23bbf5176', value: web3.toWei(99, "ether")})

eth.getBalance(eth.accounts[2])

在開啟的tail -f test.log日誌終端裡,可以同時看到挖礦記錄 再次檢視新賬戶餘額,可以新賬戶有99個以太幣(顯示的單位是wei,所以有18個0) 。

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行

5. 解鎖賬戶

在部署合約前需要先解鎖賬戶(就像銀行轉賬要輸入密碼一樣),使用以下命令:

personal.unlockAccount(eth.accounts[2],"duncanwang");

“duncanwang” 是之前建立賬戶時的密碼 解鎖成功後,賬戶就準備完畢啦,接下來就是編寫合約程式碼。

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行

【說明】 geth的這些函式的介面文件是哪個呢?需要學習GETH所有的庫函式,可參考官網文件 1,admin,debug,miner,personal,txpool例項的介面函式[Console的描述] github.com/ethereum/go… 2,eth例項的介面函式[例如eth_protocolVersion去除下劃線為eth.protocolVersion] github.com/ethereum/wi…

6. 編寫合約程式碼

現在我們來開始編寫第一個智慧合約程式碼,solidity程式碼如下:

pragma solidity ^0.4.21;
contract hello {
    string greeting;

    function hello(string _greeting) public {
        greeting = _greeting;
    }

    function say() constant public returns (string) {
        return greeting;
    }
}
複製程式碼

簡單解釋下,我們定義了一個名為hello的合約,在合約初始化時儲存了一個字串(我們會傳入hello world),每次呼叫say返回字串。 把這段程式碼寫(拷貝)到Browser-Solidity,如果沒有錯誤,點選Details獲取部署程式碼,如:

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行
在彈出的對話方塊中找到WEB3DEPLOY部分,點拷貝,貼上到編輯器後,修改初始化字串為hello world。
第三課 如何實現以太坊最簡智慧合約“Hello World”的執行
solidity在博文寫作時(2018/3/30),版本為0.4.21,solidity發展非常快,solidity版本之間有可能不能相容,這是你可以在Browser-Solidity的Settings裡選擇對應的編譯器版本。 Browser-Solidity也不停的更新中,截圖可能和你看到的介面不一樣。

7. 部署合約

Browser-Solidity生成的程式碼,拷貝到編輯器裡修改後的程式碼如下:

var _greeting5 ="hello world" ;
var helloContract5 = web3.eth.contract([{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_greeting5","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]);
var hello = helloContract5.new(
   _greeting5,
   {
     from: web3.eth.accounts[2], 
     data: '0x6060604052341561000f57600080fd5b6040516102b83803806102b8833981016040528080518201919050508060009080519060200190610041929190610048565b50506100ed565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061008957805160ff19168380011785556100b7565b828001600101855582156100b7579182015b828111156100b657825182559160200191906001019061009b565b5b5090506100c491906100c8565b5090565b6100ea91905b808211156100e65760008160009055506001016100ce565b5090565b90565b6101bc806100fc6000396000f300606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063954ab4b214610046575b600080fd5b341561005157600080fd5b6100596100d4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561009957808201518184015260208101905061007e565b50505050905090810190601f1680156100c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100dc61017c565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101725780601f1061014757610100808354040283529160200191610172565b820191906000526020600020905b81548152906001019060200180831161015557829003601f168201915b5050505050905090565b6020604051908101604052806000815250905600a165627a7a72305820427519fec7c58323ba692e485469b971a098bccaeb0ddf7a48f15b917d2d13910029', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })
複製程式碼

【注意】 第1行:修改變數名為_geeting5, 修改字串為Hello World 第2行:合約變數名為helloContract5,裡面引用改為_greeting5 第3行:修改合約例項變數名為helloContract5,之後可以直接用例項呼叫函式。 第6行:修改部署賬戶為新賬戶索引,此處改為[2],即使用新賬戶來部署合約。 第8行:準備付的gas費用,IDE已經幫我們預估好了。 第9行:設定部署回撥函式。 其中變數名為全域性的,_geeting5僅為舉例表示新定義的變數。

拷貝會geth控制檯裡,回車後,看到輸出,說明合約已經部署成功。

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行
在開啟的tail -f test.log日誌終端裡,可以同時看到挖礦記錄 現在我們檢視下新賬戶的餘額:

eth.getBalance(eth.accounts[2])

輸出結果不再是99個以太幣,比以前少了。

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行

8. 執行合約

執行一下合約函式:

hello.say()

輸出Hello World,我們第一個合約Hello World,成功執行了。

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行
一個合約的意義更重要的是體驗智慧合約開發流程,對於初學者一些可以選擇先放棄一些細節,開發流程打通之後,可以增強信心進行下一步的學習。


參考文件

1,智慧合約開發環境搭建及Hello World合約

2,GETH賬戶管理介面文件

3,GETH JSON-RPC 介面呼叫函式

4, GETH API介面管理

知識對接服務: 輝哥和歐陽哥哥在知識星球開通了區塊鏈入門專欄,用於存放簡書區塊鏈入門專欄文章的工程原始碼等內容,並建立專項微信群用於技術交流,歡迎加入。

第三課 如何實現以太坊最簡智慧合約“Hello World”的執行

相關文章