《精通以太坊》-開(kāi)發(fā)工具忱屑、框架和庫(kù)

原文:Development Tools, Frameworks and Libraries

框架

框架可以用于簡(jiǎn)化Ethereum智能合約的開(kāi)發(fā)。通過(guò)自己做所有的事情,你就能更好地理解每件事是如何組合在一起的识藤,但這是一項(xiàng)非常繁瑣、重復(fù)性的工作次伶。下面列出的框架可以自動(dòng)執(zhí)行某些任務(wù)并使開(kāi)發(fā)變得輕而易舉痴昧。

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è)彈出:

image

您將看到總共四筆交易川梅。一個(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)并嘗試一些命令:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凫碌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胃榕,更是在濱河造成了極大的恐慌盛险,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勋又,死亡現(xiàn)場(chǎng)離奇詭異苦掘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)楔壤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門鹤啡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蹲嚣,你說(shuō)我怎么就攤上這事递瑰。” “怎么了隙畜?”我有些...
    開(kāi)封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵抖部,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我议惰,道長(zhǎng)慎颗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任言询,我火速辦了婚禮俯萎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倍试。我一直安慰自己讯屈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布县习。 她就那樣靜靜地躺著涮母,像睡著了一般谆趾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叛本,一...
    開(kāi)封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天沪蓬,我揣著相機(jī)與錄音,去河邊找鬼来候。 笑死跷叉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的营搅。 我是一名探鬼主播云挟,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼转质!你這毒婦竟也來(lái)了园欣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤休蟹,失蹤者是張志新(化名)和其女友劉穎沸枯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赂弓,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绑榴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盈魁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翔怎。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杨耙,靈堂內(nèi)的尸體忽然破棺而出姓惑,到底是詐尸還是另有隱情,我是刑警寧澤按脚,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布于毙,位于F島的核電站,受9級(jí)特大地震影響辅搬,放射性物質(zhì)發(fā)生泄漏唯沮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一堪遂、第九天 我趴在偏房一處隱蔽的房頂上張望介蛉。 院中可真熱鬧,春花似錦溶褪、人聲如沸币旧。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吹菱。三九已至巍虫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳍刷,已是汗流浹背占遥。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留输瓜,地道東北人瓦胎。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像尤揣,于是被迫代替她去往敵國(guó)和親搔啊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容