Truffle 官網教程:利用OpenZeppelin構建健壯的智慧合約

Truffle 官網教程:利用OpenZeppelin構建健壯的智慧合約

眾所周知,部署在以太坊的智慧合約是能夠處理真實世界現金的,那麼這就要求我們的合約程式碼免於錯誤,同時還要高度安全。(畢竟牽扯到錢的事情都不是小事)。

Zeppelin Solutions,一種智慧合約審計服務,認識到了這裡面的需要(不就是商機嗎,不過貌似是開源的)。利用他們的經驗,整合提出了一套經過審查的智慧合同,名為“OpenZeppelin”。

我們可以使用和擴充套件這些合約,以在更短的時間內建立更安全的dapps(分散式應用)。OpenZeppelin提供了各種各樣的智慧合同,用於各種重要的功能(請參閱這裡的所有功能),但是今天我們將重點關注他們的通證(一般稱為代幣)合約。具體來說,我們將擴充套件他們的StandardToken.sol合約,來建立我們自己的相容ERC20標準的合約。

要求:

本教程希望你有一些關於truffle、以太坊和Solidity的知識。如果你還沒有瀏覽過我們的以太坊概述和我們的寵物商店教程,那將是很好的開始(直接來這個吧)。

有關更多資訊,請參見以下連結:

我們在本教程中將主要使用命令列,因此請確保您對作業系統的終端基本熟悉。(自己用的Ubuntu 16.04)

概述:

在本教程中,我們將涉及:

  • Unboxing前端應用程式
  • 建立“tutorialtoken“智慧合約
  • 編譯和部署智慧合約
  • 與新的通證(代幣)進行互動

寫在前面(大家可以瞭解一下Atom,在建立與編譯的時候,我其實是走了彎路的)

第一步:Unboxing 前端應用程式

在本教程中,我們關注的是智慧合約的建立。為了達到這個目的,我們已經為你建立了一個truffle的前端。

  • 開啟終端,建立資料夾並進入這個資料夾(一般放在桌面上就可以了)
        mkdir oz-workspace
cd oz-workspace

  • Unbox tutorialtoken 這將為我們提供專案模板。
   truffle unbox tutorialtoken

   圖片中命令列終端上面顯示了此時oz-workspace資料夾裡面的內容。

  • 下一步,我們將安裝openzeppelin
   npm install zeppelin-solidity

第二步:建立“tutorialtoken“智慧合約
  • 建立智慧合約之前,我們需要了解了解一下檔案結構,如下圖:
  • 開啟contracts檔案,建立檔案TutorialToken.sol這個檔案,然後輸入內容:
    pragma solidity ^0.4.17;
    import 'zeppelin-solidity/contracts/token/ERC20/StandardToken.sol';
    contract TutorialToken is StandardToken {
    }

     

    

     注意事項:
     1.在合同建立之前,我們匯入了StandardToken.sol智慧合約,並且宣告瞭TutorialToken。

     2.很顯然,我們使用的來自StandardToken.sol合約的內容,並且將從StandardToken合約繼承所有的變數和函          數。

     3.通過在新合同中宣告他們,繼承的函式和變數可以被重寫。

  • 我們可以設定自己的引數,宣告我們自己的名字、符號和其他細節。將以下內容塊新增到契約(在我們剛才新建的合約裡面新增):
   string public name = 'TutorialToken';
string public symbol = 'TT';
uint8 public decimals = 2;
uint public INITIAL_SUPPLY = 12000;

      

     注意事項:

      1.name 與 symbol 變數將會給我們一個獨特的身份(說白了就是定義你代幣的名字和簡稱)

      2.decimals變數顯示你的代幣小數點後幾位,2則為小數點後兩位。

      3.INITIAL_SUPPLY確定合約建立時代幣的數量,當然12000這個數字是可以改變的,想多大都可以。

  • 為了完成合約,我們將建立一個建構函式,設定totalSupply(總代幣數量)等於我們之前宣告的INITIAL_SUPPLY變數。將整個供應交給部署帳戶的地址。接著將一下程式碼塊新增到之前的合約中。
  function TutorialToken() public {
totalSupply_ = INITIAL_SUPPLY;
balances[msg.sender] = INITIAL_SUPPLY;
}

     

     然後Esc ,wq,儲存檔案就可以啦!

  • 用了少於15行手工程式碼(哈哈,都是拷貝的),我們就建立了屬於自己的以太坊合約。
第三步:編譯和部署智慧合約
  •   在migrations/資料夾裡面,建立2_deploy_contracts.js檔案,並輸入以下內容。
   var TutorialToken = artifacts.require("TutorialToken");
module.exports = function(deployer) {
deployer.deploy(TutorialToken);
};

 

  

  

    

(也不知道你們看了這些圖片後頭暈不,哈哈!)

      我們的TutorialToken合約中的import語句將由編譯器自動處理,以及StandardToken的任何後續匯入。

  • 現在,我們已經準備好將你的合約編譯並部署到區塊鏈中。在本教程中,我們將使用 Ganache,一個用於以太開發的個人區塊鏈(就是我們可以免除搭建私鏈的痛苦啦),你可以使用他來部署合同、開發應用程式和執行測試。當然,如果你還沒有這個軟體,下載並雙擊圖示來啟動這個應用程式,這將在7545埠上生成一個執行在本地的區塊鏈。

     

    不過檔案字尾比較奇葩,Linux系統需要下載字尾為.AppImage那個檔案,還有注意的是這個檔案的開啟方式      也有點奇怪,大家自己去網上搜吧。

    開啟後是這個樣子:

   

注:在Truffle documentation中瞭解更多關於 Ganache 的內容。

  • 隨著我們的區塊鏈(Ganache)啟動,回到你的終端。在您的專案中(你建立的資料夾下面),執行以下命令來編譯合同:
    truffle compile

   

      此時會產生一個build資料夾,裡面就是編譯好的檔案。

    

  •    確定編譯好後,繼續敲程式碼。
    truffle migrate

      你將看到下面類似的輸出:

    

      不過我也希望你們能夠看到,之前幾次的錯誤(沒有開啟Ganache),如果成功後,我們將會在Ganache客 戶端看到下面的情況。

 

很顯然我們部署過程中花費了ETH,如果沒有出現這種情況的話,大家可能需要好好想想哪裡出了問題。

第四步:與新的通證(代幣)進行互動
在這部分教程中,我們推薦使用MetaMask(不用點了,需要翻牆),這是一個存在於谷歌瀏覽器與火狐瀏覽器裡面的擴充套件程式(不過需要翻牆)。它將允許您快速地在帳戶之間切換,以測試傳輸新建立的通證(token)的能力。我們的 Pet Shop 教程擁有更多關於MetaMask的資訊.

接下來,我們怎樣才能建立起 GanacheMetaMask的聯絡呢,大家首先需要在瀏覽器下載metamask,就是這個樣子。

     

這個時候,我們不要著急設定賬號密碼與確認密碼,看到第二張圖片的的import with seed phrase了嗎,我們在第二張圖片點選它,而不是輸入上面的new password 與 confirm password。接下來,我們會到這樣一個頁面。

 重要的時刻來臨了,顯然這個軟體的設計者希望我們能夠輸入一些內容到這個框框裡面。還記得我們的Ganache嗎,他不是還開著呢嗎,我們需要將Ganache頁面的一串英文數字複製到這個框框裡面,如下(打上馬賽克的部分):

 

複製成功後,接下來他會讓你輸入密碼和確認密碼,然後你就進入了下面這個頁面。

  你們的頁面應該顯示的是account 1,然後我們需要連線本地的埠:因為我們賬號上面應該是99.82ETH,

  點選上面狐狸頭右方有一個向下的三角,點選後我們將會看到上面這張圖片,然後點選Custom RPC,到了下面這張圖片

  在輸入欄輸入HTTP://127.0.0.1:7545,save即可。

然後點選返回按鈕,就可以看到我們的賬號上面顯示99.82ETH了,如果沒有的話,要確認你是在本地7545埠網路裡面。

  • 這個時候返回我們的終端,輸入npm run dev ,然後他會自動開啟你的瀏覽器,如下:

   

但是這個時候,你的上面是不會顯示balance值的,因為我們的自己的配置檔案是有問題(哈哈)

首先是你需要改變app.js 16行的埠:如下(建議用atom開啟oz-workspace檔案)

  

改為7545埠,我已經改了,你們的應該為9545好像。

此外還應該注意你們js資料夾下面(還是上面這張圖片),有沒有jquery檔案,沒有的話需要下載,1.9.1就可以了,不需要太高,因為我試過(哈哈,3.3.1好像不可以)。然後接下來如下圖:

修改index檔案下,有一行ajax.googleapis.com/ajax…..的程式碼,我們需要改為上圖那樣,變為引入1.9.1.min.js檔案。儲存即可。

接下來,我們開啟瀏覽器重新整理就可以看到我們的12000TT了(我的已經轉過一次賬了)。

  • 那麼我們怎麼轉賬呢,首先我們需要開啟你的metamask,點選建立第二個賬戶,

  然後大概步驟就是複製你的第二個賬戶的地址,

如下:

  點選copy address to …即可,然後切換到我們的第一個賬戶

記得重新整理,將第二賬戶的地址複製,輸入轉賬金額:

如下:

點選transfer按鈕,就會出現下面的情況:

點選SUBMIT,一會就會出現這樣的情況:

這個時候你去第二個賬戶,重新整理頁面就可以看到你的賬戶有2000TT了。

如果這個時候你再去ganache去看一下,你會發現多了一個block,更多的資訊就不說了。

到此為止,我們實現了一個Truffle 官網的一個教程了。

(哎,最後都不想翻譯了!)