天天看點

智能合約圖形化部署和運作原理

網絡上不少部署智能合約的文章,但是都有一個共同的特點,就是采用指令行的方式來部署,先是建立SOLC的編譯環境,然後部署Geth或者Eth節點,然後一步一步生成錢包、ABI、合約位址進行部署,對初學者來說晦澀難懂而且容易失敗,本文主要介紹如何在圖形化界面下一鍵部署和調用智能合約。

一、       智能合約和DAPP概述

1、  智能合約基本概念

        智能合約是一段代碼和資料的集合,可以部署以太坊網絡上運作。如果做比喻的話智能合約更像是JAVA程式,JAVA程式通過JAVA虛拟機(JVM)将代碼解釋位元組進行執行,以太坊的智能合約通過以太坊虛拟機(EVM)解釋成位元組碼進行執行,如果你學過彙編,會發現編譯後的位元組碼和彙編很類似。同時智能合約有自己的賬戶,在時間或事件的驅動下能自動執行一些功能,如可以在互相之間傳遞資訊,修改區塊鍊的狀态比如賬戶資訊等。以太坊的智能合約最大的特點是圖靈完備,通俗來說可以完全模拟一台計算機所能做的所有事情,大家熟知的比特币其實也可以執行一些簡單腳本,但是他就不是圖靈完備,比如循環指令比特币就無法執行。

以太坊虛拟機(EVM)

        以太坊虛拟機(EVM)是以太坊中智能合約的運作環境。它不僅被沙箱封裝起來,事實上它被完全隔離運作,也就是說運作在EVM内部的代碼不能接觸到網絡、檔案系統或者其它程序,甚至智能合約之間也隻有有限的調用。

2、  DAPP基本概念

        初學者經常把智能合約和DAPP搞混,以太坊社群把基于智能合約的應用稱為去中心化的應用程式(Decentralized App)。DApp的目标是讓你的智能合約有一個友好的界面,外加一些額外的有利于使用者使用的東西。典型的DApp例子由一個html界面,web3運作庫,一段JS代碼以及部署在區塊鍊上的一段智能合約組成。與一般CS架構的網站不同,DApp不能在普通的伺服器上運作,DApp必須運作在一台能與以太坊節點互動的伺服器上,或者任意一個以太坊節點上。DApp通過送出交易到區塊鍊網絡與對應的智能合約進行互動,并且從區塊鍊網絡而不是中心化資料庫比如(MYSQL資料庫)讀取重要資料。相對于典型的BS架構使用者登入系統不同,以太坊使用者被表示成一個十六進制的位址而且所有使用者資料和其他資料均儲存在本地,與目前的web應用架構有很多不同。

3、  智能合約進階語言

        使用者不可能直接編寫以太坊虛拟機(EVM)位元組碼,是以以太坊提供了幾種編寫智能合約的進階語言。

Solidity:類似JavaScript,這是以太坊推薦的旗艦語言,也是最流行的智能合約語言。具體用法參加Solidity文檔,位址:https://solidity.readthedocs.io/en/latest/

Serpent:類似Python風格,文檔位址:https://github.com/ethereum/wiki/wiki/Serpent

LLL:類似Lisp風格,目前已經被終止了。

可以根據不同的習慣選擇不同的進階語言,目前最流行的是Solidity。

二、       在以太坊私有鍊上部署第一個智能合約

        本文的智能合約采用以太坊官方的示例合約,功能就是在區塊鍊上存儲一個數字,并能夠讀取出來。代碼如下:

contract SimpleStorage {

    uint storedData;

    function set(uint x) {

        storedData = x;

    }

    function get() constant returns (uintretVal) {

        return storedData;

}

        即使沒有學過Solidity語言也可以大緻看出,該合約set函數存儲一個數字在X變量中,get函數從X變量中讀取這個數字出來,下面對這個合約進行部署:

1、  啟動私有鍊

Ethereum-Wallet會顯示紅色的PRIVTE-NET标記。

智能合約圖形化部署和運作原理

2、建立兩個錢包

        點選”ADD ACCOUNT” 按鈕,添加一個錢包,程式會彈出一個對話框,提示輸入兩遍密碼,輸入完密碼後,賬号即建立成功。建立其他的賬号,一樣的操作,從上面的截圖可以看到,有三個賬号,一個是MAIN ACCOUNT,一個是ACCOUNT2,一個是ACCOUNT3

3、挖礦擷取一些以太币

        賬号建立後,還沒有以太币,需要在私有鍊上挖礦,切換到Geth界面,輸入

miner.start(1)

        miner指令括号中的1表示用一個線程進行挖礦,如果不配置,就會讓CPU全速運作,影響計算機的使用。

智能合約圖形化部署和運作原理

         運作一會後,主賬号就會擷取很多以太币,這個時候螢幕會快速刷屏,不用管,輸入指令miner.stop()停止挖礦。

4、  将一個錢包的以太币轉到另一個錢包中

        先點選ACCOUNT2賬号,進入賬号詳情的界面,點選右側的“COPY address”,把ACCOUNT2的位址拷貝下來,系統會提示你現在你處在一個測試網絡,不要轉入真正的以太币到這個賬号。

智能合約圖形化部署和運作原理

        點選錢包中“SEND”按鈕,從MAINACCOUNT給ACCOUNT2轉入一定以太币,同時可以看到執行這筆交易的費用是0.00042個以太币。

智能合約圖形化部署和運作原理
智能合約圖形化部署和運作原理

    點選發送後會提示如輸入密碼,但這時還沒有發送成功,根據區塊鍊的交易規則,需要礦工的确認,并且每筆交易需要确認12個塊,一個塊是16秒的生成時間。切換到Geth程式,輸入挖礦指令,直到ACCOUNT2上顯示100個以太币,然後停止挖礦。

5、  部署智能合約

        點“CONTRACTS”,進入智能合約管理界面,點選“DEPOLY NEW CONTRACT”,開始部署智能合約,選擇部署智能合約的賬号,并輸入智能合約的代碼後,如下圖

智能合約圖形化部署和運作原理

         輸入完畢後點選“DEPLOY”,系統會提示輸入賬号密碼,因為部署智能合約是需要費用的。

智能合約圖形化部署和運作原理

    這個時候是看不到部署的智能合約的,切換到Geth界面,進行挖礦,在12個塊後,智能合約就能确認并顯示出來。

三、       運作智能合約

1、 在本節點上運作智能合約

        點選“CONTRACTS”進入智能合約界面,可以看到剛才部署的智能合約“SimpleStorage”,點選進入該智能合約,進入詳情界面,其中有智能合約寫入區域和讀取區域,首先啟動Geth的挖礦,然後在寫入區域選擇相應的智能合約函數SET,在下面的數值輸入框輸入想設定的數值,運作一會後就可以在讀取區域看到智能合約函數GET中Retval的傳回值有變化。

         其他智能合約的運作也是一樣,無非就是函數多點,輸入多點。

智能合約圖形化部署和運作原理

2、 在其他節點上運作智能合約

        此時的智能合約隻能自己能看到,别人是無法看到和運作的,如果其他人要運作你部署好的智能合約需要提供一些資訊,就是其他教程中所說的智能合約的ABI和位址。

進入剛部署的“SimpleStorage”智能合約界面,右側有四個按鈕

A.“Deposit Eher”:向該智能合約發送以太币

B.“Copy address”:拷貝該智能合約的位址

C.“Show QR Code”:顯示一個二維碼,如果用手機掃描的話,顯示該智能合約的位址

D.“Show Interface”:顯示該智能合約的JSON接口,也就是ABI

        首先我們點“Copy address”,拷貝該智能合約的位址,然後點“Show Interface”将智能合約的JSON接口全部拷貝出來,在另一個需要運作智能合約的節點打開Ethereum-Wallet,打開“CONTRACTS”界面點選“WATCH CONTRACTS”添加一個智能合約。

智能合約圖形化部署和運作原理

        如上圖所示,CONTRACT NAME随便填,CONTRACT ADDRESS填寫智能合約位址,JSON INTERFACE填寫剛才在”Show Interface “中拷貝的内容。點OK後,就可以看到這個智能合約并運作了。

四、       智能合約的部署原理

1、智能合約的部署架構

         本文介紹的智能合約的部署雖然是在圖形化界面編譯和執行,但其實最主要的是依賴于背景運作Geth的節點,此時Geth提供了一個RPC的接口向圖形化界面的錢包提供區塊鍊的資訊。

RPC接口

        我們部署一個智能合約時,首先Ethereum-Wallet調用SOLC智能合約編譯器将代碼編譯成成EVM位元組碼,然後将EVM位元組碼通過Geth的RPC接口發送到以太坊網絡,經過全網驗證後,同時寫入到每個Geth管理的區塊鍊中,架構如下

智能合約圖形化部署和運作原理

2、 部署的資料流

       首先代碼先經過SOLC編譯變為了二進制碼,然後通過一筆交易來建立智能合約,該筆交易包含了建立者賬号、智能合約内容、智能合約的位址這幾個關鍵資訊,其中智能合約位址的生成是由建立者的賬号和發送的交易數作為随機數輸入,通過Kecca-256加密算法重新建立一個位址作為賬号。

智能合約圖形化部署和運作原理

       部署過程中,需要通過交易來部署,同時資料要存儲到區塊鍊上,這些需要使用到GAS。

交易(Transactions)

        一筆交易是一條消息,從一個賬戶發送到另一個賬戶。交易可以包含二進制資料(payload)和以太币。

        如果目标賬戶包含代碼,該代碼和輸入資料會被執行。

        如果目标賬戶是零賬戶(賬戶位址是0),交易将建立一個新合約。正如上文所講,這個智能合約位址不是零位址,而是由合約建立者的位址和該位址發出過的交易數量計算得到。建立合約交易的payload被當作EVM位元組碼執行。執行的輸出做為合約代碼被永久存儲。這意味着,為了建立一個合約,你不需要向合約發送真正的合約代碼,而是發送能夠傳回可執行代碼的代碼。

Gas

        以太坊上的每筆交易都會被收取一定數量的gas,gas的目的是限制執行交易所需的工作量,同時為執行支付費用。當EVM執行智能合約時,gas将按照特定規則被逐漸消耗,其實GAS就是以太币的比較小的機關,如果以太币比作100元,那麼GAS可以看作是1分錢。如果隻有以太币,會有問題,以太币是需要大家買賣的,市場會有價格波動。可能會出現比特币這樣的狀況,一天跌50%漲50%。這個對計算的成本是不能接受的,例如今天做一個加法需要十塊錢,明天做一個加法需要一百塊錢。是以這裡引入gas來解耦。把市場的波動和計算的開銷來解耦,也就是說以太币和gas之間是有匯率的,以太币漲沒關系,gas價格下降就可以了。它要保證我做同樣的計算,消耗的法币是一緻的。

        gas price(gas價格,以太币計)是由交易建立者設定的,發送賬戶需要預付的交易費用 = gas price * gas amount。 如果執行結束還有gas剩餘,這些gas将被返還給發送賬戶。

        前文中曾經提到部署智能合約使用了0.00042個以太币,換算成gas就是21000個gas。

        無論執行到什麼位置,一旦gas被耗盡(比如降為負值),将會觸發一個out-of-gas異常。目前調用幀所做的所有狀态修改都将被復原。

五、       智能合約的運作原理

        智能合約是部署在區塊鍊的代碼,區塊鍊本身不能執行代碼,代碼的執行是在本地的EVM中,實際上,部署在區塊鍊上代碼是能夠在本地産生原智能合約代碼的代碼,可以了解區塊鍊為一個資料庫,而用戶端從資料庫中讀取了存儲的運作代碼,并在本地運作後,将結果寫入到了區塊鍊這個資料庫中。

智能合約圖形化部署和運作原理

       本質上,以太坊的錢包也是智能合約的一個應用,以太坊搭建的是一個可供編寫各種應用的平台。下一篇,将詳細講述智能合約的開發編寫和調試方法