框架
框架可以用于簡(jiǎn)化Ethereum智能合約的開(kāi)發(fā)。通過(guò)自己做所有的事情,你就能更好地理解每件事是如何組合在一起的识藤,但這是一項(xiàng)非常繁瑣、重復(fù)性的工作次伶。下面列出的框架可以自動(dòng)執(zhí)行某些任務(wù)并使開(kāi)發(fā)變得輕而易舉痴昧。
Truffle
- Github鏈接:https://github.com/trufflesuite/truffle
- 網(wǎng)站鏈接:https://truffleframework.com
- 文檔鏈接:https://truffleframework.com/docs
- Truffle Boxes鏈接:http://truffleframework.com/boxes/
- npm package repository鏈接:https://www.npmjs.com/package/truffle
安裝truffle框架
truffle框架由幾個(gè)NodeJS包組成。在安裝truffle之前冠王,我們需要安裝最新的NodeJS和node包管理器(npm)赶撰。
安裝NodeJS和npm的推薦方法是使用節(jié)點(diǎn)版本管理器NVM。一旦我們安裝了nvm,它將為我們處理所有的依賴項(xiàng)和更新豪娜。我們將遵循在http://nvm.sh中的說(shuō)明餐胀。
一旦nvm安裝在您的操作系統(tǒng)上,安裝node.js就很簡(jiǎn)單了瘤载。我們使用-lts
標(biāo)志來(lái)告訴nvm否灾,我們需要最新的NodeJS“長(zhǎng)期支持(Long Term Support, lts)”版本
$ nvm install --lts
確認(rèn)已安裝node和npm:
$ node -v
v8.9.4
$ npm -v
5.6.0
創(chuàng)建一個(gè)DApp支持的包含Node.js版本的隱藏文件.nvmrc,因此開(kāi)發(fā)人員只需在項(xiàng)目目錄的根目錄中運(yùn)行nvm安裝鸣奔,它就會(huì)自動(dòng)安裝并切換到使用該版本墨技。
$ node -v > .nvmrc
$ nvm install
看上去不錯(cuò)。現(xiàn)在安裝truffle:
$ npm -g install truffle
+ truffle@4.0.6
installed 1 package in 37.508s
集成預(yù)構(gòu)建的Truffle項(xiàng)目(Truffle Box)
如果我們想使用或創(chuàng)建一個(gè)基于預(yù)先構(gòu)建的樣板文件的DApp溃蔫,那么在Truffle Boxes鏈接中我們可以選擇一個(gè)現(xiàn)有的Truffle項(xiàng)目健提,然后運(yùn)行以下程序來(lái)下載和提取:
$ truffle unbox <BOX_NAME>
創(chuàng)建一個(gè)truffle項(xiàng)目目錄
對(duì)于使用truffle的每個(gè)項(xiàng)目,我們都創(chuàng)建一個(gè)項(xiàng)目目錄并在該目錄中初始化truffle伟叛。truffle將在我們的項(xiàng)目目錄中創(chuàng)建必要的目錄結(jié)構(gòu)私痹。通常,我們給項(xiàng)目目錄一個(gè)描述項(xiàng)目的名稱统刮。對(duì)于本例紊遵,我們將使用truffle來(lái)從[simple_contract_example]部署水龍頭合約,因此我們將命名項(xiàng)目文件夾Faucet侥蒙。
$ mkdir Faucet
$ cd Faucet
Faucet $
一旦進(jìn)入Faucet目錄暗膜,我們初始化truffle:
Faucet $ truffle init
Truffle創(chuàng)建了一個(gè)目錄結(jié)構(gòu)和一些默認(rèn)文件:
Faucet
├── contracts
│ └── Migrations.sol
├── migrations
│ └── 1_initial_migration.js
├── test
├── truffle-config.js
└── truffle.js
除了truffle本身,我們還將使用一些JavaScript (nodeJS)支持包鞭衩。我們可以用npm安裝這些学搜。我們初始化npm目錄結(jié)構(gòu)并接受npm建議的默認(rèn)值:
$ npm init
package name: (faucet)
version: (1.0.0)
description:
entry point: (truffle-config.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to Faucet/package.json:
{
"name": "faucet",
"version": "1.0.0",
"description": "",
"main": "truffle-config.js",
"directories": {
"test": "test"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Is this ok? (yes)
現(xiàn)在,我們可以安裝與truffle一起使用的依賴項(xiàng):
$ npm install dotenv truffle-wallet-provider ethereumjs-wallet
現(xiàn)在论衍,在您的Faucet目錄中瑞佩,有一個(gè)包含數(shù)千個(gè)文件的node_modules目錄。
在將DApp部署到云生產(chǎn)或持續(xù)集成環(huán)境之前坯台,有必要指定“engines
”字段炬丸,以便使用正確的Node.js版本構(gòu)建DApp及安裝其相關(guān)的依賴項(xiàng)。
Package.json中“engines”字段配置參考鏈接:https://docs.npmjs.com/files/package.json#engines
配置truffle
Truffle創(chuàng)建一些空的配置文件蜒蕾,truffle.js和truffle-config.js稠炬。在Windows系統(tǒng)上truffle.js名稱可能會(huì)引起沖突,當(dāng)您嘗試運(yùn)行命令truffle時(shí)咪啡,Windows嘗試運(yùn)行truffle.js代替首启。為了避免這種情況,我們將刪除truffle.js和使用truffle-config.js支持Windows用戶撤摸,老實(shí)說(shuō)毅桃,他們已經(jīng)受夠了栽惶。
$ rm truffle.js
現(xiàn)在我們編輯truffle-config.js,內(nèi)容替換為:
truffle-config.js:truffle配置疾嗅,讓我們開(kāi)始
module.exports = {
networks: {
localnode: { // Whatever network our local node connects to
network_id: "*", // Match any network id
host: "localhost",
port: 8545,
}
}
};
上面的配置是一個(gè)很好的起點(diǎn)。它設(shè)置一個(gè)默認(rèn)的Ethereum網(wǎng)絡(luò)(名為localnode)冕象,該網(wǎng)絡(luò)假定您正在運(yùn)行一個(gè)Ethereum客戶機(jī)(如parity)代承,要么作為一個(gè)完整的節(jié)點(diǎn),要么作為一個(gè)輕量級(jí)客戶機(jī)渐扮。此配置將指示truffle通過(guò)端口8545上的RPC與本地節(jié)點(diǎn)通信论悴。Truffle將使用本地節(jié)點(diǎn)連接到的任何Ethereum網(wǎng)絡(luò),比如Ethereum主網(wǎng)絡(luò)墓律,或者像Ropsten這樣的測(cè)試網(wǎng)絡(luò)膀估。本地節(jié)點(diǎn)也將提供錢包功能。
在接下來(lái)的小節(jié)中耻讽,我們將為truffle配置其他網(wǎng)絡(luò)察纯,例如ganache test-RPC區(qū)塊鏈和托管網(wǎng)絡(luò)提供商Infura。隨著我們添加更多的網(wǎng)絡(luò)针肥,配置文件將變得更加復(fù)雜饼记,但它也將為我們的測(cè)試和開(kāi)發(fā)工作流提供更多的選項(xiàng)。
使用truffle部署合約
現(xiàn)在慰枕,我們有了一個(gè)用于我們的水龍頭項(xiàng)目的基本工作目錄具则,并配置了truffle和它的依賴項(xiàng)。合約進(jìn)入我們項(xiàng)目的合約子目錄具帮。該目錄已經(jīng)包含了一個(gè)“helper”合約博肋,Migrations.sol為我們管理合約升級(jí)。我們將檢查Migrations.sol的使用在后面的部分蜂厅。
讓我們復(fù)制Faucet.sol合同(從[solid _faucet_example])到contract子目錄匪凡,因此項(xiàng)目目錄如下所示:
Faucet
├── contracts
│ ├── Faucet.sol
│ └── Migrations.sol
...
現(xiàn)在我們可以要求truffle為我們編譯合同:
$ truffle compile
Compiling ./contracts/Faucet.sol...
Compiling ./contracts/Migrations.sol...
Writing artifacts to ./build/contracts
Truffle遷移——理解部署腳本
Truffle提供了一個(gè)名為migration的部署系統(tǒng)。如果您在其他框架中工作過(guò)葛峻,您可能會(huì)看到類似的東西:Ruby on Rails锹雏、Python Django和許多其他語(yǔ)言和框架都有migrate命令。
在所有這些框架中术奖,遷移的目的是處理不同版本的軟件之間的數(shù)據(jù)模式的變化礁遵。以太坊的遷移目的略有不同。因?yàn)橐蕴缓霞s是不可變的采记,并且成本高昂佣耐,因此truffle提供了一種遷移機(jī)制來(lái)跟蹤哪些合約(以及哪些版本)已經(jīng)被部署。在一個(gè)包含數(shù)十個(gè)合約和復(fù)雜依賴項(xiàng)的復(fù)雜項(xiàng)目中唧龄,您不希望必須花錢重新部署沒(méi)有更改的合約兼砖。您也不希望手動(dòng)跟蹤已經(jīng)部署了哪些合約版本。truffle遷移機(jī)制通過(guò)部署智能合約Migrations.sol完成了這一切,然后跟蹤所有其他合約部署讽挟。
我們只有一個(gè)合同懒叛,F(xiàn)aucet.sol,至少可以說(shuō)耽梅,遷移系統(tǒng)是過(guò)度的薛窥。不幸的是,我們不得不使用它眼姐。但是诅迷,通過(guò)學(xué)習(xí)如何在一個(gè)合約中使用它,我們可以開(kāi)始為我們的開(kāi)發(fā)工作流實(shí)踐一些好習(xí)慣众旗。隨著事情變得越來(lái)越復(fù)雜罢杉,這種努力將會(huì)得到回報(bào)。
Truffle的migrations目錄是找到遷移腳本的地方」逼纾現(xiàn)在滩租,只有一個(gè)腳本1_initial_migration。它部署Migrations.sol合約本身:
include::code/Faucet/migrations/1_initial_migration.js
我們需要第二個(gè)遷移腳本艘款,以部署Faucet.sol持际。我們叫它2_deploy_contracts.js。它非常簡(jiǎn)單哗咆,就像1_initial_migration.js蜘欲,只有幾個(gè)小的改變。事實(shí)上晌柬,您可以復(fù)制1_initial_migration.js的內(nèi)容姥份。用Faucet替換所有Migrations的實(shí)例:
include::code/Faucet/migrations/2_deploy_contracts.js
腳本初始化變量Faucet,標(biāo)識(shí)Faucet.sol的Solidity源代碼是定義Faucet的工件年碘。然后澈歉,它調(diào)用部署函數(shù)來(lái)部署這個(gè)合約。
我們都準(zhǔn)備好了屿衅。讓我們使用truffle migrate來(lái)部署合約埃难。我們必須使用——network參數(shù)來(lái)指定部署合約的網(wǎng)絡(luò)。配置文件中只指定了一個(gè)網(wǎng)絡(luò)涤久,我們將其命名為localnode涡尘。確保您的本地Ethereum客戶端正在運(yùn)行,然后輸入:
Faucet $ truffle migrate --network localnode
因?yàn)槲覀冋谑褂靡粋€(gè)本地節(jié)點(diǎn)連接到Ethereum網(wǎng)絡(luò)并管理我們的錢包响迂,所以我們必須授權(quán)truffle創(chuàng)建的事務(wù)考抄。我正在運(yùn)行連接到Ropsten測(cè)試區(qū)塊鏈的奇偶校驗(yàn),因此在truffle遷移期間蔗彤,我將在奇偶校驗(yàn)的web控制臺(tái)看到一個(gè)彈出:
您將看到總共四筆交易川梅。一個(gè)用于部署遷移疯兼,一個(gè)用于將部署計(jì)數(shù)器更新為1,一個(gè)用于部署Faucet贫途,另一個(gè)用于將部署計(jì)數(shù)器更新為2吧彪。
truffle將顯示遷移完成,顯示每個(gè)交易并顯示合同地址:
$ truffle migrate --network localnode
Using network 'localnode'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0xfa090db179d023d2abae543b4a21a1479e70ca7d35a469a5d1a98bfc6bd80fe8
Migrations: 0x8861c27715550bed8362c0345add158489df6db0
Saving successful migration to network...
... 0x985c4a32716826ddbe4eae284104bef8bc69e959899f62246a1b27c9dfcd6c03
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying Faucet...
... 0xecdbeef77f0558edc689440e34b7bba0a3ba7a45e4b680b071b47c30a930e9d6
Faucet: 0xd01cd8e7bd29e4bff8c1693f59eee46137a9f300
Saving successful migration to network...
... 0x11f376bd7307edddfd40dc4a14c3f7cb84b6c921ac2465602060b67d08f9fd8a
Saving artifacts...
使用truffle控制臺(tái)
Truffle提供了一個(gè)JavaScript控制臺(tái)丢早,我們可以使用它與以太坊網(wǎng)絡(luò)(通過(guò)本地節(jié)點(diǎn))進(jìn)行交互来氧,與已部署的合同進(jìn)行交互,并與錢包提供商進(jìn)行交互香拉。在我們當(dāng)前的配置(localnode)中,節(jié)點(diǎn)和錢包提供程序是我們的本地奇偶校驗(yàn)客戶端中狂。
讓我們啟動(dòng)松露控制臺(tái)并嘗試一些命令: