第三課 如何實現以太坊最簡智能合約「Hello World」的運行

【本文目標】 完成以太坊最簡智能合約「Hello World」的編寫和運行html

【技術收穫】 跟隨本文實踐,你將能夠有如下收穫:git

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

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

第二課 如何實現以太坊最簡智能合約「Hello World」的運行web

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

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

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

第八課 如何調試以太坊官網的智能合約衆籌案例數組

【說明】未列出的課程爲知識普及的非實操類課程,全部區塊鏈文章參考「區塊鏈入口」專欄。瀏覽器

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

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

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

Browser-Solidity是一個基於瀏覽器的Solidity,就能夠不用安裝Solidity,本文的Hello World教程也將基於Browser-Solidity來進行。若是你想本身安裝請參考Solidity安裝指引

geth是一個以太坊客戶端,如今利用geth啓動一個以太坊(開發者)網絡節點。

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

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

命令參數說明: –dev 啓用開發者網絡(模式),開發者網絡會使用POA共識,默認預分配一個開發者帳戶而且會自動開啓挖礦。 –datadir 後面的參數是區塊數據及祕鑰存放目錄。 第一次輸入命令後,它會放在當前目錄下新建一個testNet目錄來存放數據。 console 進入控制檯 2>> test.log 表示把控制檯日誌輸出到test.log文件

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

tail -f test.log
複製代碼

輸出截圖:

Xshell創建一個新的窗口用於輸出LOG結果

2. 準備帳戶

部署智能合約須要一個外部帳戶,咱們先來看看分配的開發者帳戶,在控制檯使用如下命令查看帳戶:

eth.accounts

回車後,返回一個帳戶數組,裏面有一個默認帳戶, 也可使用personal.listAccounts查看帳戶。

personal.listAccounts

本文做者已建立了一個帳號,共有2個帳號了:

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

1.15792089237316195423570985008687907853269… e+77

開發者帳戶因餘額太多,若是用這個帳戶來部署合約時會沒法看到餘額變化,爲了更好的體驗完整的過程,這裏選擇建立一個新的帳戶。

3. 建立帳戶

使用如下命令建立帳戶:

personal.newAccount("duncanwang")

duncanwang爲新帳戶的密碼,回車後,返回一個新帳戶。 能夠看到帳戶數組包含了3個帳戶,新帳戶在第三個(索引爲2)位置。 如今看看帳戶的新餘額,能夠發現是0.

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

截圖以下:

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) 。

5. 解鎖帳戶

在部署合約前須要先解鎖帳戶(就像銀行轉帳要輸入密碼同樣),使用如下命令:

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

「duncanwang」 是以前建立帳戶時的密碼 解鎖成功後,帳戶就準備完畢啦,接下來就是編寫合約代碼。

【說明】 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獲取部署代碼,如:

在彈出的對話框中找到WEB3DEPLOY部分,點拷貝,粘貼到編輯器後,修改初始化字符串爲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控制檯裏,回車後,看到輸出,說明合約已經部署成功。

在打開的tail -f test.log日誌終端裏,能夠同時看到挖礦記錄 如今咱們查看下新帳戶的餘額:

eth.getBalance(eth.accounts[2])

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

8. 運行合約

執行一下合約函數:

hello.say()

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

一個合約的意義更重要的是體驗智能合約開發流程,對於初學者一些能夠選擇先放棄一些細節,開發流程打通以後,能夠加強信心進行下一步的學習。


參考文檔

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

2,GETH帳戶管理接口文檔

3,GETH JSON-RPC 接口調用函數

4, GETH API接口管理

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

相關文章
相關標籤/搜索