麻豆国内精品欧美在线-麻豆国内精品久久久久久-麻豆国产在线观看一区二区-麻豆国产在线观看免费-麻豆国产原创-麻豆国产一区二区在线观看

Truffle詳解區(qū)塊鏈

張希 2018-06-24 16:15
分享到:
導(dǎo)讀

本文介紹一個(gè)簡單的部署智能合約的方法:Truffle。

image.png

1、什么是Truffle ?

Truffle是針對基于以太坊的Solidity語言的一套開發(fā)框架。本身基于Javascript。Truffle為以太坊提供了開發(fā)環(huán)境、測試框架和資產(chǎn)管道(pipeline),旨在使以太坊開發(fā)更容易,使用Truffle你會(huì)得到:

內(nèi)置智能合約編譯、鏈接、部署和二進(jìn)制字節(jié)碼管理。

針對快速迭代開發(fā)的自動(dòng)化合約測試。

可腳本化,可擴(kuò)展的部署和遷移框架。

網(wǎng)絡(luò)管理,用于部署到任意數(shù)量的公共和私有網(wǎng)絡(luò)。

使用EthPM和NPM進(jìn)行包安裝管理。

用于直接合約通信的交互式控制臺(tái)。

支持持續(xù)集成的可配置構(gòu)建管道。

外部腳本運(yùn)行程序可以在Truffle環(huán)境中執(zhí)行腳本。

提供了合約抽象接口,可以直接通過var instance = Storage.deployed();拿到合約對象后,在Javascript中直接操作對應(yīng)的合約函數(shù)。原理是使用了基于web3.js封裝的Ether Pudding工具包。簡化開發(fā)流程。

提供了控制臺(tái),使用框架構(gòu)建后,可以直接在命令行調(diào)用輸出結(jié)果,可極大方便開發(fā)調(diào)試。當(dāng)開發(fā)基于Truffle的應(yīng)用時(shí),我們推薦使用 EthereumJS TestRPC。它是一個(gè)完整的運(yùn)行在內(nèi)存中的區(qū)塊鏈,僅僅存在于你開發(fā)設(shè)備上。它在執(zhí)行交易時(shí)是實(shí)時(shí)返回的,而不等待默認(rèn)的出塊時(shí)間,這樣你可以快速驗(yàn)證你新寫的代碼,當(dāng)出現(xiàn)錯(cuò)誤時(shí),也能即時(shí)反饋給你。它同時(shí)還是一個(gè)支持自動(dòng)化測試的功能強(qiáng)大的客戶端。Truffle充分利用它的特性,能將測試運(yùn)行時(shí)間提速近90%。最好使用TestRPC客戶端充分測試后,再使用這些客戶端。這些是完整的客戶端實(shí)現(xiàn),包括挖礦,網(wǎng)絡(luò),區(qū)塊及交易的處理,Truffle可以在不需要額外配置的情況下發(fā)布到這些客戶端。

下面我們從一個(gè)簡單的例子開始了解一下Truffle。

2、安裝Truffle

image.png

安裝完成后執(zhí)行下面的命令,確保Truffle被正確的安裝:

image.png

3. 創(chuàng)建并初始化項(xiàng)目

image.png

初始化完成后的目錄結(jié)構(gòu)如下:

image.png

contracts/ – 存放我們編寫的合約。

migrations/ – 存放遷移部署腳本。

test/ – 存放合約測試腳本

truffle.js – Truffle的配置文件

truffle init會(huì)給我們創(chuàng)建一個(gè)名叫MetaCoin的代幣應(yīng)用。我們將這個(gè)默認(rèn)的應(yīng)用刪除,我們將編寫自己的合約。

image.png

4. 創(chuàng)建合約

接下來我們創(chuàng)建一個(gè)我們自己的合約,進(jìn)入contracts目錄,創(chuàng)建Storage.sol合約文件。

image.png

Storage.sol合約的內(nèi)容如下:

image.png

5. 編譯合約

接下來使用truffle compile命令編譯剛剛完成的Storage.sol合約

image.png

從控制臺(tái)的輸出中,我們可以看到合約編譯后的文件(artifacts)會(huì)寫入./build/contracts目錄中,這些合約編譯后的文件對于Truffle框架能否正常工作至關(guān)重要。請不要手動(dòng)修改這些文件,因?yàn)榧词剐薷牧耍俅螆?zhí)行編譯命令時(shí)又會(huì)被覆蓋掉。

Truffle默認(rèn)只編譯自上次編譯后被修改過的合約,目的是為了減少不必要的編譯。如果你想編譯全部合約 ,可以使用–all選項(xiàng)。

image.png

合約編譯完成后,我們需要部署Storage.sol合約,在truffle中部署合約需要用到遷移腳本。下面我們進(jìn)入migrations目錄中為Storage合約創(chuàng)建一個(gè)遷移腳本。

6. 遷移合約

遷移腳本是由一些Javascript文件組成,用來幫助你把合約發(fā)布到以太坊網(wǎng)絡(luò)中。之所以需要遷移腳本是因?yàn)槟愕牟渴鹦枨髸?huì)隨著時(shí)間改變。隨著你的項(xiàng)目的發(fā)展,你可以創(chuàng)建新的遷移腳本把這些變化的合約部署到區(qū)塊鏈上。之前你運(yùn)行的遷移歷史記錄,會(huì)被一個(gè)特殊的Migrations.sol合約記錄在區(qū)塊鏈上,后面將對Migrations.sol合約進(jìn)行詳細(xì)介紹。

移腳本的命名規(guī)則:文件名以數(shù)字開頭,一個(gè)描述性的后綴結(jié)尾。數(shù)字前綴是必須的,用于記錄移植是否成功。后綴僅是為了提高可讀性,以方便理解。

image.png

文件:2_storage_migration.js

image.png

6.1 artifacts.require()

在遷移腳本開頭,我們通過artifacts.require()方法告訴truffle我們將要與那個(gè)合約交互。這個(gè)方法類似于NodeJs中的require,但在這里,它返回的是一個(gè)合約抽象,我們可以在我們的遷移腳本的其余部分中使用這個(gè)合約抽象。artifacts.require()中使用的名字不是必須與合約源文件的文件名相同,相反,它應(yīng)該與在合約源代碼中定義的合約類的名稱相同。

6.2 module .exports

在遷移腳本最后,我們通過module.exports到處一個(gè)函數(shù),被遷移腳本導(dǎo)出的函數(shù)都應(yīng)該接受一個(gè) deployer 對象作為其第一個(gè)參數(shù)。deployer對象中的輔助函數(shù)在部署過程中提供了一種清晰的語法,用于部署智能合約,以及執(zhí)行一些常見的任務(wù),比如把發(fā)布后的對象保存下來供以后使用。這個(gè) deployer 對象是部署任務(wù)的主接口,它的API在本文后面有講解。

好了,我們的一切準(zhǔn)備工作都做好了,接下來我們就可以把Storage.sol部署到我們的區(qū)塊鏈上了,在上一章中我們把智能合約部署到geth私有鏈中,這次我們將把智能合約部署到Testrpc環(huán)境中。

如果你還沒有安裝Testrpc 那么先執(zhí)行下面的安裝命令:

image.png

啟動(dòng)testrpc

image.png


testrpc啟動(dòng)成功后,回到myproject項(xiàng)目的目錄中,執(zhí)行遷移命令

image.png

truffle migrate命令會(huì)執(zhí)行所有的位于migrations目錄內(nèi)所有的遷移腳本。如果你之前已成功執(zhí)行過遷移腳本,那么truffle migrate僅會(huì)執(zhí)行新創(chuàng)建的遷移。如果沒有新的遷移腳本,這個(gè)命令不會(huì)執(zhí)行任何操作??梢允褂眠x項(xiàng)–reset來重新執(zhí)行全部遷移腳本。

image.png

6.3 初始化遷移合約

在本節(jié)開頭我們提到過一個(gè)特殊的Migrations.sol合約,那么現(xiàn)在就來詳細(xì)了解下這個(gè)特殊合約。為了使用遷移功能,Truffle要求你要有一個(gè)遷移合約。這個(gè)合約必須包含一個(gè)特定的接口,對于大多數(shù)項(xiàng)目來說,這個(gè)合約只會(huì)在第一次做遷移的時(shí)候被部署,以后都不會(huì)做任何的更改了。當(dāng)你使用 truffle init 來創(chuàng)建一個(gè)項(xiàng)目的時(shí)候,它會(huì)默認(rèn)創(chuàng)建這個(gè)合約。

文件名:contracts/Migration.sol

image.png

為了利用遷移的特性,你必須首先要部署Migration.sol合約。為此,創(chuàng)建以下遷移腳本:

文件名:migrations/1_initial_migrations.js

image.png

要部署其他合約,你可以遞增數(shù)字編號前綴來創(chuàng)建新的遷移腳本。

6.4 部署器(deployer)

你的遷移腳本會(huì)使用這deployer對象來組織部署任務(wù)。deployer對象會(huì)同步執(zhí)行部署任務(wù),因此你可以按順序編寫部署任務(wù)。

image.png

另外,deployer上的每一個(gè)函數(shù)都會(huì)返回一個(gè)promise,通過promise可以把有執(zhí)行順序依賴關(guān)系的部署任務(wù)組成隊(duì)列。

image.png

6.5 deployer API

deployer對象包含許多方法,可以用來簡化你的遷移工作。

(1) deployer.deploy(CONTRACT, ARGS…, OPTIONS)

這個(gè)API是用來部署合約的,contract參數(shù)傳入需要部署的合約名字,args參數(shù)傳入合約的構(gòu)造函數(shù)需要的參數(shù),options是一個(gè)可選參數(shù)它的值是{overwrite: true/false}, 如果 overwrite 被設(shè)置成 false, 那么當(dāng)這個(gè)合約之前已經(jīng)部署過了,這個(gè)deployer就不會(huì)再部署這個(gè)合約,這在當(dāng)一個(gè)合約的依賴是由一個(gè)外部合約地址提供的情況下是有用的。

為了快速進(jìn)行部署多個(gè)合約,你可以向deployer.deploy(…..)函數(shù)中傳入一個(gè)或多個(gè)數(shù)組。

例子:

image.png

(2) deployer.link(LIBRARY, DESTINATIONS)

把一個(gè)已部署好的庫鏈接到一個(gè)或多個(gè)合約里. destinations 可以傳入一個(gè)合約,也可以傳入一組合約. 如果 destinations 中的某個(gè)合約不依賴這個(gè)庫, 那deployer 的link函數(shù)就會(huì)忽略這個(gè)合約。

image.png

(3) deployer.then(function() {…})

在遷移過程中使用它調(diào)用特定合約的函數(shù)來部署新的合約,為已部署的合約做一些初始化工作等。

例子:

image.png

(4) 網(wǎng)絡(luò)相關(guān)

在執(zhí)行遷移時(shí),遷移腳本會(huì)把truffle.js里配置的networks傳遞給你,你可以在module.exports導(dǎo)出函數(shù)中第二個(gè)參數(shù)位置接受這個(gè)值。

文件:truffle.js

image.png

例子:

image.png

(5) 可用的賬戶

在執(zhí)行遷移時(shí),遷移腳本會(huì)把當(dāng)前以太坊客戶端或web3.provider中可用的賬戶列表傳遞給你,這個(gè)列表與web3.eth.getAccounts()返回的賬戶列表完全一樣。你可以在module.exports導(dǎo)出函數(shù)中第三個(gè)參數(shù)位置接受這個(gè)值。

image.png

7. 合約交互

以太坊中將向以太坊網(wǎng)絡(luò)寫入數(shù)據(jù)和從以太坊網(wǎng)絡(luò)中讀取數(shù)據(jù)這兩種操作做了區(qū)分。一般來說,寫數(shù)據(jù)被稱為交易(transaction),而讀取數(shù)據(jù)稱為調(diào)用(call)。交易和調(diào)用的處理方式非常不同,并且具有以下特征。

7.1 交易(transaction)

交易會(huì)從根本上改變了網(wǎng)絡(luò)的狀態(tài)。簡單的交易有:發(fā)送以太幣到另一個(gè)賬戶。復(fù)雜的交易有:調(diào)用一個(gè)合約的函數(shù),向網(wǎng)絡(luò)中部署一個(gè)合約。交易的顯著特征是:

交易可以寫入或修改數(shù)據(jù);

交易花費(fèi)以太幣運(yùn)行,就是我們所說的gas;

交易需要時(shí)間處理。

當(dāng)你通過交易調(diào)用合約的函數(shù)時(shí),我們將無法立即獲得智能合約的返回值,因?yàn)樵摻灰桩?dāng)前只是被發(fā)送,離被打包、執(zhí)行還有一段時(shí)間。通常,通過交易執(zhí)行的函數(shù)將不會(huì)立刻返回值,它們將返回一個(gè)交易ID。所以總結(jié)一下,一個(gè)交易一般有如下特征:

消耗gas(以太幣)

更改網(wǎng)絡(luò)的狀態(tài)

不會(huì)立即處理

不會(huì)立刻返回一個(gè)返回值(只有一個(gè)交易ID)。

7.2 調(diào)用(CALL)

另一方面,調(diào)用則完全不一樣。調(diào)用可以在網(wǎng)絡(luò)上執(zhí)行代碼,但不會(huì)永久更改數(shù)據(jù)。調(diào)用可以免費(fèi)運(yùn)行,不需要花費(fèi)gas。調(diào)用的顯著特征是:調(diào)用是用來讀取數(shù)據(jù)。當(dāng)你通過調(diào)用執(zhí)行合約函數(shù)時(shí),你將立即收到返回值??偠灾{(diào)用是:

是免費(fèi)的(不消耗gas)

不會(huì)更改網(wǎng)絡(luò)的狀態(tài)

會(huì)被立即處理

會(huì)立刻返回一個(gè)值

決定使用交易還是調(diào)用,依據(jù)很簡單:要讀取數(shù)據(jù)還是寫入數(shù)據(jù)。

7.3 合約抽象

合約抽象是Javascript和以太坊合約交互的中間層粘合劑。簡而言之,合約抽象幫我們封裝好了代碼,它可以讓你和合約之間的交互變得簡單,從而讓你不必關(guān)心合約調(diào)用細(xì)節(jié)。Truffle通過truffle-contract模塊來使用自己的合約抽象。合約抽象中的函數(shù)和我們合約中的函數(shù)是一樣的。

為了使用合約抽象和合約交互,我們需要通過npm安裝truffle-contract模塊

image.png

7.4 與合約交互

7.4.1. Call 方式交互

介紹完上述概念后,現(xiàn)在我們可以和之前部署好的Storage.sol合約交互了,首先我們以call方式調(diào)用合約。

文件:call.js

image.png

注意:

我們必須明確地調(diào)用.call()函數(shù),告訴Ethereum網(wǎng)絡(luò)知道我們不會(huì)修改區(qū)塊鏈上的數(shù)據(jù)。

當(dāng)調(diào)用成功是,我們會(huì)收到一個(gè)返回值,而不是交易ID。

7.4.2 ransaction 方式交互

接下來我們以transaction方式給Storage.sol合約中storedData變量賦值為42

文件:transaction.js

image.png

上面的代碼有一些需要說明的地方:

我們直接調(diào)用這合約抽象的 set 方法。 默認(rèn)情況下,這個(gè)操作會(huì)向區(qū)塊鏈網(wǎng)絡(luò)中發(fā)送一筆交易。也可以顯式調(diào)用storageInstance.set.sendTransaction(42,{from:Storage.web3.eth.accounts[0]}),表明是以transaction方式交互

當(dāng)這個(gè)交易成功發(fā)出后,回調(diào)函數(shù)只有在交易被成功打包處理后才會(huì)激活,這省去了你自己寫判斷語句檢查交易狀態(tài)的麻煩。

我們傳遞了一個(gè)對象給set函數(shù)的第二個(gè)參數(shù)。注意:在我們的Storage.sol合約代碼中set函數(shù)并沒有第三個(gè)參數(shù),這第三個(gè)參數(shù)是合約抽象API里的。在合約抽象的所有函數(shù)中,你都可以向它們傳入一個(gè)對象作為最后一個(gè)參數(shù),在這個(gè)對象中你可以寫入一些有關(guān)交易細(xì)節(jié),在這個(gè)例子中,我們在對象中寫入from字段,以確保這個(gè)交易是來自 web3.eth.accounts[0]。

7.5 添加一個(gè)新合約到網(wǎng)絡(luò)

在上面的所有例子中,我們使用的是一個(gè)已部署好的合約抽象,我們可以使用合約抽象的.new()函數(shù)來部署自己的合約。

文件:new.js

image.png

合約 部署 遷移 使用 交易
分享到:

1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。


專題報(bào)道

主站蜘蛛池模板: 亚洲国产成人久久综合一 | 激情婷婷综合久久久久 | 国产一级在线观看 | 精品欧美日韩一区二区三区 | 精品视频免费在线 | 深夜视频免费看 | 日韩美一区二区三区 | 波多野结中文字幕在线69视频 | 99久在线| 亚洲男人第一天堂 | 湖南美女被黑人4p到惨叫 | 91肥熟国产老肥熟在线 | 美女脱一净二净不带胸罩 | 手机看片福利盒子久久 | 男人摸女人下面 | 九九九国产在线 | 精品国产日韩一区三区 | 国产一级视频在线观看 | 性印度freehd | 国内9lporm自拍视频区 | 黑人女性猛交xxxxxⅹxx | 我的男友是消防员在线观看 | 国产馆在线观看免费的 | 国产99久久精品 | 99久久伊人一区二区yy5099 | 无套内射在线观看THEPORN | 美女扒开腿让男人桶爽动态图片 | 香蕉视频在线观看网站 | 青青青青青国产费线在线观看 | 国产伦精品一区二区三区免费迷 | 亚洲日本va午夜中文字幕 | 顶级尤物极品女神福利视频 | 色一情一乱一伦 | 99在线观看视频 | 日本一区二区三区精品 | 四虎影音在线 | 亚洲日本va午夜中文字幕 | 好男人在线观看hd中字 | 日韩精品免费一区二区三区 | 国产一区二区在线观看视频 | 色老板在线观看 |