3.13 truffle 安裝使用

尹成發表於2018-11-08
  1. 安裝 npm install -g truffle
  2. 建立專案 
    1. 新建目錄 
      1. Mkdir MetaCoin
      2. Cd MetaCoin
    2. 下載unbox 
      1. Truffle unbox metacoin
      2. 如果想不在裡面包含任何例項合約 使用truffle init
  3. Truffle boxes 
    1. Truffle boxes是一種框架樣板,有不同的種類,通過樣板可以很方便的管理專案
  4. 編譯合約 
    1. 位置:所有合約全部處於contracts下面
    2. 編譯命令:truffle compile 可以通過新增 –all重新編譯所有合約檔案
    3. 構建artifacts:位於build/contracts下面
    4. 依賴:通過import匯入
  5. 部署遷移
    1. 命令:truffle migrate (注:如果沒有新的遷移指令碼匯入,使用truffle migrate不執行操作,要使用truffle migrate –reset,在部署合約時必須保證有測試網路)
    2. 遷移指令碼:必須以數字開頭 
      1. var MyContract = artifacts.require("MyContract"); 
        module.exports = function(deployer) { 
        // deployment steps 
        deployer.deploy(MyContract); 
        }; 
      2. Artifacts.require:告訴truffle,要與哪個合約進行互動,類似於node的require,返回一個合約抽象,指定合約與互動合約的名字要匹配,不要使用以合約檔案為引數,因為一個檔案裡可能存在多個合約
      3. Module.exports:匯出一個函式,全被遷移指令碼匯出的函式都應該接受一個deployer物件作為其第一個引數。
      4. 初始化遷移合約:Migrations.sol:該合約包含一個特定的介面,對於大多數專案來說,這個合約只有在第一次做遷移的時候會被部署,以後都不會做任何更改。如果使用truffle init 來建立專案,會預設建立該合約
      5. Deployer:部署器、組織部署任務,同步執行,所以可以按照順序來編譯部署任務,另外deployer上的每一個函式都會返回一個Promise,通過promise可以把有執行順序依賴關係的部署任務組成佇列。
      6. 可用賬號:可以在部署中使用以太坊客戶端或者web3提供的賬戶列表中的賬號
      7. Deployer API 
        1. Deployer.deploy(CONTRACT, ARGS…,OPTIONS):部署合約 
          1. Contract:需要部署的合約名字
          2. Args:合約的建構函式需要的引數
          3. Options:可選 值為{overwrite:true/false},如果overwrite為false,那麼在當前合約已經部署過的情況下,deployer不會再部署這個合約
          4. 為了快速部署多個合約,可以在該函式中傳入一個或多個陣列 
            – 部署單個合約,無建構函式引數 deployer.deploy(A) 
            – 部署單個合約,有建構函式引數 deployer.deploy(A,arg1,arg2,…) 
            – 部署單個合約,有的帶建構函式引數,有的不帶 deployer.deploy([[A,arg1,arg2,…],B,[C,arg1]])
        2. Deployer.link(LIBRARY,DESTINATIONS):把一個已部署好的庫連結到一個或多個合約裡,DESTINATIONS可以傳入一個合約,也可以傳入一組合約。如果destinations中的某個合約不依賴這個庫,那麼deployer的link函式就會忽略這個合約 
          1. Deployer.deploy(LibA);deployer.link(LibA,B);deployer.deploy(B);
          2. 庫LibA連結到多個合約:deployer.link(LibA,[B,C,D]); 
            3.Deployer.then(function(){…}):類似於node的promise,可以通過該函式操作合約資料
  6. 合約互動 以太坊中將向乙太網路寫入資料和從乙太網路中讀取資料作了區分。寫入叫做交易,讀取叫做呼叫
    1. 交易:從根本上改變網路的狀態。簡單的交易有“傳送一個以太幣到另一個賬戶”。複雜的交易有“呼叫一個合約的函式,向網路中部署一個合約” 
      1. 特徵 
        1. 交易可以寫入或修改資料
        2. 消耗gas
        3. 需要時間處理
        4. 不會立即返回一個值(只會立即返回一個交易ID)
      2. 呼叫:在網路上執行程式碼,不會永久更改資料 
        1. 特徵 
          1. 不消耗gas
          2. 不會更改網路狀態
          3. 會被立即處理
          4. 會立刻返回一個值
        2. 決定使用呼叫還是交易就是看要讀取資料還是寫入資料
      3. 合約抽象 
        1. 合約抽象用於封裝合約程式碼
        2. 安裝truffle-contract 
          1. cd myproject
          2. npm init -y
          3. npm install –save truffle-contract@3.0.1
          4. npm install –save web3@0.20.0
        3. 與合約互動
      4. 新增一個新合約到網路:contract.new()…
      5. 使用現有的合約地址:contract.at(“0x0…”);at函式基於指定地址生成一個新的例項(抽象)
      6. 向合約傳送以太幣: 
        1. 方法一:使用instance.sendTransaction()直接向合約傳送一個交易,類似於web3.eth.sendTransaction,除了沒有回撥函式
        2. 方法二:使用instance.send(web3.toWei(1,”ether”).then(function(result){});
  7. truffle和MetaMask 
    1. 在瀏覽器中與智慧合約進行互動之前,請確保它們已經編譯,部署,並且您正在通過客戶端JavaScript中的web3與它們進行互動。 我們建議使用truffle-contract庫,因為它使合約的互動更容易,更健壯。完成以上內容之後,就可以與MetaMask互動了
    2. 作用MetaMask和Ganache:設定MetaMask網路埠為7545,開啟Ganache
    3. 檢測MetaMask的web3注入
    4. // 判斷是否有一個注入的web3例項 
      if (typeof web3 !== 'undefined') { 
      console.log('web3 已經注入!'); 
      App.web3Provider = web3.currentProvider; 
      } else { 
      console.log('web3 被重新例項化!'); 
      // 如果沒有發現注入的web3例項,則返回到Ganache 
      App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:7545'); 
      } 
      web3 = new Web3(App.web3Provider); 
    5. 設定MetaMask 
      1. 開啟網路選項,選擇Custom RPC,在New RPC URL中輸入http://127.0.0.1:7545,然後點選儲存
    6. 使用MetaMask和truffle develop,與上面設定一樣,只是需要把7545改成9545 
      1. // 判斷是否有一個注入的web3例項 
        if (typeof web3 !== 'undefined') { 
        console.log('web3 已經注入!'); 
        App.web3Provider = web3.currentProvider; 
        } else { 
        console.log('web3 被重新例項化!'); 
        // 如果沒有發現注入的web3例項,則返回到Ganache 
        App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:9545'); 
        } 
        web3 = new Web3(App.web3Provider); 
    7. 使用MetaMask和Ganache CLI 
      1. // 判斷是否有一個注入的web3例項 
        if (typeof web3 !== 'undefined') { 
        console.log('web3 已經注入!'); 
        App.web3Provider = web3.currentProvider; 
        } else { 
        console.log('web3 被重新例項化!'); 
        // 如果沒有發現注入的web3例項,則返回到Ganache 
        App.web3Provider = new Web3.providers.HttpProvider('http://127.0.0.1:8545'); 
        } 
        web3 = new Web3(App.web3Provider); 
  8. EthPM 
    1. 概述:EthPM是以太坊的新包裝登錄檔。 它遵循ERC190規範釋出和使用智慧合約包,並獲得了許多不同的以太坊開發工具的廣泛支援。 以太坊軟體包登錄檔已經直接整合到Truffle中。
    2. 包的安裝 
      1. Truffle install
      2. 新增版本:truffle install @
    3. 依賴安裝 
      1. 編輯ethpm.json,然後使用truffle install就可以安裝了
    4. 使用已經安裝好的合約 
      1. 所有已安裝好的合約都在install_contracts下面,如果沒有該目錄會自動建立
    5. 釋出自己的軟體包 truffle publish,需要自己配置
    6. Ropsten:以太坊軟體包登錄檔目前存在於Ropsten測試網路中。 要釋出到登錄檔,我們需要設定自己的Ropsten配置,因為我們將進行需要簽名的事務。 
      1. 例項: 
        1. 使用infura釋出軟體包,在Ropsten網路上生成12個助記單詞 
          1. Npm install truffle-hdwallet-provider –save
          2. 編輯config(truffle.js)檔案,新增Reposten網路配置
    7. package配置 
      1. 例項
        { 
        "package_name": "adder", 
        "version": "0.0.3", 
        "description": "Simple contract to add two numbers", 
        "authors": [ 
        "Tim Coulter <tim.coulter@consensys.net>" 
        ], 
        "keywords": [ 
        "ethereum", 
        "addition" 
        ], 
        "dependencies": { 
        "owned": "^0.0.1" 
        }, 
        "license": "MIT" 
        } 
        配置完
        成後,使用truffle publish
      2. 在釋出之前,可以考慮刪除配置檔案中的無關網路artifacts:truffle networks –clean
  9. 合約除錯 
    1. 概述:Truffle包含一個整合的偵錯程式,以便您可以除錯針對您的合約進行的交易。 此偵錯程式的外觀和感覺類似於傳統開發環境中可用的現有命令列除錯程式。
    2. 除錯命令:truffle debug
  10. truffle develop 和 truffle console 
    1. truffle console:連線到任何以太坊客戶端的基本互動式控制檯,它主要用於連線已經啟動的以太坊客戶端(Ganache或者geth) 
      1. 啟動:truffle console
    2. truffle develop:truffle develop內建客戶端,可以執行truffle的各種命令,它與console的區別在於其內建客戶端,不需要單獨啟動以太坊客戶端 
      1. 啟動:truffle develop,啟動埠為9545的內建客戶端,會忽略掉truffle.js中的網路配置
    3. 可用命令:build compile create debug exec install migrate networks opcode public test version
  11. 編寫外部指令碼:truffle exec “path/to/file.js” 通過此方法也可以執行外部指令碼檔案