truffle (ETH以太坊智慧合約整合開發工具) 入門教程

truffle (ETH以太坊智慧合約整合開發工具) 入門教程

truffle (ETH以太坊智慧合約整合開發工具) 入門教程

前言

在你瞭解區塊鏈開發之前,你有必要了解區塊鏈的一些基礎知識,什麼是DApp,DApp與傳統app的區別,
什麼是以太坊,以太坊中的智慧合約是什麼,智慧合約能幹什麼,什麼是共識演算法,目前為止常用的共識演算法有哪些,
共識演算法解決了什麼問題,(PoW,PoS,DPoS等等共識演算法),基於以太坊的智慧合約開發使用哪些工具,使用哪些語言開發,
solidity是什麼,智慧合約開發與普通開發有什麼相同與不同,等等。

你需要提前看下這本書來了解一些入門知識: 《區塊鏈開發指南》

簡介

truffle是一個以太坊智慧合約整合開發測試環境,他和一般的IDE不同,它並沒有程式碼編輯環境,
但是它能夠方便的管理智慧合約執行的環境,並且提供一套便捷開發智慧合約(Smart Contract)的API,
能夠有效的提升開發效率。truffle擁有以下特性:

  • 內建的智慧合約編譯、連線、釋出和二進位制檔案管理工具。
  • 快速開發自動化測試智慧合約指令碼。
  • 指令碼化、可拓展的釋出、遷移框架。
  • 管理任意公有以及私有的釋出網路(1或者其他數字,1是以太坊正式執行網路,其他數字是本地開發網路環境)。
  • 使用 EthPMNPM 進行包管理,使用ERC190標準規範。
  • 擁有與智慧合約能直接通訊的互動式控制檯。
  • 可配置的構建管道,支援緊密整合。
  • 外部指令碼執行器,用於在Truffle環境中執行指令碼。

執行環境

安裝 truffle

$ npm install -g truffle

當前 truffle 版本為

$ truffle version
Truffle v4.1.13 (core: 4.1.13)
Solidity v0.4.24 (solc-js)

程式碼編輯器

儘管你可以使用文字編輯器編寫智慧合約,但是編輯器會讓你事半功倍,這裡推薦兩個solildity程式碼編輯器。

1. Sublime Text 3

熟悉前端開發的同時都知道這個編輯器,安裝幾個外掛就能配置好開發環境。
下載 Sublime Text 3, 安裝solildity,nodejs外掛,基本的開發環境就算是好了。

2. VS Code

VS Code也是輕量級的開發工具,下載 VS Code , 下載後安裝solidity, nodejs 外掛。

以上,VSCode在寫程式碼的時候就能夠提示語法錯誤,是VS系列工具的一貫優點,Sublime的優點就是快速輕量。
使用哪個工具完全取決於個人。

詳細使用教程

快速入門

目錄

1. 建立專案
2. 瀏覽專案
3. 測試
4. 編譯
5. 遷移到truffle開發環境
6. 使用 Ganache 遷移智慧合約
7. 與智慧合約互動

1. 建立專案

  1. 建立專案資料夾
$ mkdir MetaCoin
$ cd MetaCoin
  1. 下載並解壓MetaCoin專案(unbox)
$ truffle unbox metacoin

注意:

使用 truffle unbox <box-name> 下載任意 truffle boxes。
使用 truffle init 初始化一個不包含智慧合約的專案。

完成以上步驟後,你將會看到工程目錄下有如下資料夾。

  • contracts/ 合約放在這個目錄下(Solidity contracts)
  • migrations 指令碼化部署檔案
  • test/ 測試你的智慧合約和應用資料夾
  • truffle.js truffle配置檔案

2. 瀏覽專案

這一章我們是快速入門這裡不再詳細說明每個檔案中的內容,只大概描述下檔案的作用,詳細的說明請檢視truffle的文件。

  1. 開啟 contracts/MetaCoin.sol ,這是一個用solidity編寫的智慧合約,它建立了一個MetaCoin token。
    它使用了另外一個在該目錄下的合約檔案ConvertLib.sol

  2. 開啟 contracts/Migrations.sol ,這個是一個獨立的檔案,沒有依賴其他合約,用來更新你釋出的只能合約狀態。
    這個是truffle生成的檔案,一般我們不編輯它。

  3. 開啟 migrations/1_initial_deployment.js ,這個是用於遷移 Migrations.sol 的指令碼檔案。

  4. 開啟 migrations/2_deploy_contracts.js ,這個是用於遷移 MetaCoin.sol 的指令碼。
    (遷移的指令碼會依次執行,以上兩個檔案的開頭都是數字,執行順序將會按照數字順序執行。)

  5. 開啟 test/TestMetaCoin.sol ,這個是一個用solidity編寫的測試檔案,他將確保你的智慧合約按照你預期的結果執行。

  6. 開啟 test/metacoin.js,這個是一個用javascript指令碼編寫的測試檔案,他和上面的solidity編寫的測試檔案功能基本相同。

  7. 開啟 truffle.js ,這個是 truffle 配置檔案,用來設定網路一起其他專案相關的設定。 這是一個空白檔案,
    你可以不進行任何配置,truffle 的命令列中有一些內建的預設引數。

3. 測試

  1. 在終端中執行指令碼:
$ truffle test ./test/TestMetaCoin.sol

注意:

在windows中執行這個命令的時候,你會發現 truffle.js 被執行了,而 truffle 並沒有執行。
具體解決辦法,看

這裡解決 truffle 命令無法執行問題。

你將會看到如下輸出:

  TestMetacoin
√ testInitialBalanceUsingDeployedContract (58ms)
√ testInitialBalanceWithNewMetaCoin (53ms)
2 passing (648ms)
  1. 執行 js 測試指令碼:
$ truffle test ./test/metacoin.js

你將會看到如下輸出:

  Contract: MetaCoin
√ should put 10000 MetaCoin in the first account
√ should call a function that depends on a linked library (38ms)
√ should send coin correctly (95ms)
3 passing (193ms)

4. 編譯

  1. 編譯智慧合約
$ truffle compile

你將會看到如下輸出:

Compiling .\contracts\ConvertLib.sol...
Compiling .\contracts\MetaCoin.sol...
Compiling .\contracts\Migrations.sol...
Compiling .\contracts\MyContract.sol...
Writing artifacts to .\build\contracts

編譯後的檔案將會在工程目錄下的 build 目錄中。

5. 遷移到truffle開發環境

注意:使用 Ganache,請跳過本節到下一節。

為了開發智慧合約,我們需要連線到區塊鏈。truffle有內建的私有連用於測試。
這個網路是你電腦上的本地網路,並不會連線到以太坊的主網路。

使用如下命令建立私有連並與其互動:

  1. 執行 Truffle develop
$ truffle develop

你將會看到如下輸出:

Truffle Develop started at http://127.0.0.1:9545/
Accounts:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de
Private Keys:
(0) c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3
(1) ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f
(2) 0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8ad91193c05875ef1
(3) c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd85da83b71f772aa6c
(4) 388c684f0ba1ef5017716adb5d21a053ea8e90277d0868337519f97bede61418
(5) 659cbb0e2411a44db63778987b1e22153c086a95eb6b18bdf89de078917abc63
(6) 82d052c865f5763aad42add438569276c00d3d88a2d062d36b2bae914d58b8c8
(7) aa3680d5d48a8283413f7a108367c7299ca73f553735860a87b08f39395618b7
(8) 0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07700d8669ff12b7c4
(9) 8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362dcae9012b548b1e5
Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat
⚠️  Important ⚠️  : This mnemonic was created for you by Truffle. It is not secure.
Ensure you do not use it on production blockchains, or else you risk losing funds.
truffle(develop)>

這裡顯示了10個賬戶和它們的私鑰,用於和區塊鏈互動。

truffle(develop)>geth attach 是相同的互動式控制檯。

  1. truffle 互動控制檯中,你可以省略 truffle 字首,例如使用 truffle compile 你可以直接使用 compile
    用於釋出的命令列是 truffle migrate , 在互動命令列中使用 migrate 即可:
truffle(develop)> migrate

你將會看到如下輸出:

Using network 'develop'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0xfc1305e8437792f4111d189a7215a57700f15211d17cf4d5b723c5cef054c313
Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0
Saving successful migration to network...
... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying ConvertLib...
... 0x9bad657102554ee0183b260e9144c45cff6f1b8acc158535b1d96a03e21a67a1
ConvertLib: 0x345ca3e014aaf5dca488057592ee47305d9b3e10
Linking ConvertLib to MetaCoin
Deploying MetaCoin...
... 0xc68fe7303339ebd996b0b1c5ed7dd72498839ad3729ef991419c40b7ea8378fe
MetaCoin: 0xf25186b5081ff5ce73482ad761db0eb0d25abfbf
Saving successful migration to network...
... 0x059cf1bbc372b9348ce487de910358801bbbd1c89182853439bec0afaee6c7db
Saving artifacts...
Running migration: 4_example_migration.js
Deploying MyContract...
... 0x8c2aeb4d8be63db2d5e04459689ef1a84e0116d8805e6149b1b69d26ecc9095a
MyContract: 0x9fbda871d559710256a2502a2517b794b482db40
Saving successful migration to network...
... 0xcfa8ca90b302e023e613f1cd644dd62942c82277d36ceef1df5b97b13f67ae6d
Saving artifacts...

這裡顯示交易IDs,和智慧合約的部署地址。

6. 使用 Ganache 遷移智慧合約

truffle develop 是一個將多個工具集中的私有連、控制檯,你也可以使用 Ganache ,它是一個桌面應用,用於啟動你的私有連。
Ganache 能夠讓新入門以太坊和區塊鏈的開發者更加容易理解,它預先顯示了更多資訊。

唯一的額外步驟,執行 Ganache ,你可以修改 truffle 配置檔案來指向 Ganache 例項。

  1. 下載並安裝 Ganache
  2. 開啟 truffle.js 配置檔案,替換 networks 配置:

    module.exports = {
    networks: {
    development: {
    host: "127.0.0.1",
    port: 7545,
    network_id: "*"
    }
    }
    };

    這個配置就是指定 truffle 連線到 Ganache 私有連。

  3. 儲存並關閉檔案。

  4. 啟動 Ganache

    ganache_accounts

  5. 在終端中輸入 migrate 命令,遷移智慧合約到由 Ganache 建立的區塊鏈:

    $ truffle migrate

    你將會看到如下輸出:

    Using network 'development'.
    Running migration: 1_initial_migration.js
    Deploying Migrations...
    ... 0xfc1305e8437792f4111d189a7215a57700f15211d17cf4d5b723c5cef054c313
    Migrations: 0x13f70ff9440b96e783a9000e2755ac6dbbf33ac4
    Saving successful migration to network...
    ... 0x0f002d7dc7b04ec9b8e05bc3be03fa11ceaea0e5d5c99ac594dc0fa33e74df39
    Saving artifacts...
    Running migration: 2_deploy_contracts.js
    Deploying ConvertLib...
    ... 0x9bad657102554ee0183b260e9144c45cff6f1b8acc158535b1d96a03e21a67a1
    ConvertLib: 0x45daf5b81c0238d7fc3f094b2d54c00badf96745
    Linking ConvertLib to MetaCoin
    Deploying MetaCoin...
    ... 0x89b661e01f3b910276a9e123881c0dbba728d30fbc0997befaaf0cbad998c6ff
    MetaCoin: 0x11a3dcd88766fe67f29c73a662b6c40bb63ddce8
    Saving successful migration to network...
    ... 0x2487356aa6d044b475b8213b14d627541c69447e65645da673f83fc75c39df99
    Saving artifacts...
    Running migration: 4_example_migration.js
    Deploying MyContract...
    ... 0x8c2aeb4d8be63db2d5e04459689ef1a84e0116d8805e6149b1b69d26ecc9095a
    MyContract: 0x09c654238c3fc3bcddda064c637951c7a8a9ce23
    Saving successful migration to network...
    ... 0xc55fdf833d88082943602c691ec72c62cb2fdc1b5adcc7c232f970c7d69d266b
    Saving artifacts...

    這裡顯示的是交易id和你部署的合約地址。

  6. Ganache 中,點選 Transactions 按鈕檢視已經被處理的交易。

  7. 為了與智慧合約互動,你可使用 truffle 控制檯。truffle 控制檯類似於 Truffle Develop
    期望他連線到已經存在的區塊鏈(由 Ganache 保證建立區塊鏈)。

    $ truffle console

    你將會看到如下輸出:

    truffle(development)>

7. 與智慧合約互動

使用控制檯與智慧合約互動有以下幾種方式:

注意:我們這個例子中使用 web3.eth.accounts[] 中的所有賬戶由助記詞(mnemonic)保證。
所以,demo中出現的地址跟你本地區塊鏈中的地址有所不同是很正常的。通常我們這樣使用地址 web3.eth.accounts[0] 。
  • 查詢 metacoin 釋出後智慧合約中的賬戶餘額:
MetaCoin.deployed().then(function(instance){return instance.getBalance(web3.eth.accounts[0]);}).then(function(value){return value.toNumber()});
  • 查詢賬戶餘額值多少ETH
MetaCoin.deployed().then(function(instance){return instance.getBalanceInEth(web3.eth.accounts[0]);}).then(function(value){return value.toNumber()});
  • 轉 metacoin 從一個賬戶轉賬到另外一個賬戶
MetaCoin.deployed().then(function(instance){return instance.sendCoin(web3.eth.accounts[1], 500);});
  • 查詢接收 metacoin 的賬戶的餘額:
MetaCoin.deployed().then(function(instance){return instance.getBalance(web3.eth.accounts[1]);}).then(function(value){return value.toNumber()});
  • 查詢轉出 metacoin 賬戶的餘額:
MetaCoin.deployed().then(function(instance){return instance.getBalance(web3.eth.accounts[0]);}).then(function(value){return value.toNumber()});

繼續學習

這個快速教程主要展示了 truffle 的基礎教程,但是任然有很多要學習。請繼續學習我們剩下的教程,尤其是 教程