區(qū)塊鏈智能合約技術(shù)與應(yīng)用 課件 第7、8章 Hyperledger Composer業(yè)務(wù)網(wǎng)絡(luò)實(shí)戰(zhàn)-提高篇;Hyperledger Composer客戶端接入_第1頁(yè)
區(qū)塊鏈智能合約技術(shù)與應(yīng)用 課件 第7、8章 Hyperledger Composer業(yè)務(wù)網(wǎng)絡(luò)實(shí)戰(zhàn)-提高篇;Hyperledger Composer客戶端接入_第2頁(yè)
區(qū)塊鏈智能合約技術(shù)與應(yīng)用 課件 第7、8章 Hyperledger Composer業(yè)務(wù)網(wǎng)絡(luò)實(shí)戰(zhàn)-提高篇;Hyperledger Composer客戶端接入_第3頁(yè)
區(qū)塊鏈智能合約技術(shù)與應(yīng)用 課件 第7、8章 Hyperledger Composer業(yè)務(wù)網(wǎng)絡(luò)實(shí)戰(zhàn)-提高篇;Hyperledger Composer客戶端接入_第4頁(yè)
區(qū)塊鏈智能合約技術(shù)與應(yīng)用 課件 第7、8章 Hyperledger Composer業(yè)務(wù)網(wǎng)絡(luò)實(shí)戰(zhàn)-提高篇;Hyperledger Composer客戶端接入_第5頁(yè)
已閱讀5頁(yè),還剩155頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第7章HyperledgerComposer業(yè)務(wù)

網(wǎng)絡(luò)實(shí)戰(zhàn)——提高篇7.1貨幣貿(mào)易網(wǎng)絡(luò)案例分析7.2能源購(gòu)置網(wǎng)絡(luò)案例分析7.3產(chǎn)品拍賣網(wǎng)絡(luò)案例分析本章小結(jié)

7.1貨幣貿(mào)易網(wǎng)絡(luò)案例分析

7.1.1網(wǎng)絡(luò)建模該業(yè)務(wù)網(wǎng)絡(luò)涉及以下幾個(gè)方面的內(nèi)容:貨幣,交易者、警察,制造貨幣,交易貨幣,銷毀假幣。資產(chǎn)包含貨幣。在貨幣貿(mào)易網(wǎng)絡(luò)中,將模擬貨幣生產(chǎn)、交易以及假幣銷毀的過程,因此需要如下參與者:交易者,警察。

交易包含業(yè)務(wù)如下:

·交易者制造貨幣;

·交易者之間交易貨幣;

·警察銷毀假幣;

·批量銷毀貨幣。

確認(rèn)模型后,開始編寫代碼實(shí)現(xiàn)模型。

7.1.2代碼實(shí)現(xiàn)

首先用Yeoman生成工程目錄結(jié)構(gòu),并新建lib文件夾和logic.js,如圖7-1所示。圖7-1工程目錄結(jié)構(gòu)

1.CTO建模

1)利用枚舉設(shè)置狀態(tài)

使用貨幣狀態(tài)來標(biāo)識(shí)貨幣的真?zhèn)?,用交易者狀態(tài)標(biāo)識(shí)其是否合法。

貨幣狀態(tài)如下:

交易者狀態(tài)如下:

2)設(shè)置相關(guān)資產(chǎn)

貨幣結(jié)構(gòu)如下(通過引用類型指向該貨幣目前的擁有者與貨幣制造者):

3)設(shè)置參與者

設(shè)置參與者的抽象類,結(jié)構(gòu)如下:

貨幣交易者結(jié)構(gòu)如下(通過引用類型數(shù)組指向該交易者現(xiàn)持有的貨幣):

警察的結(jié)構(gòu)如下:

4)編寫交易代碼

制造貨幣交易代碼如下:

交易貨幣交易代碼如下:

銷毀假幣交易代碼如下:

批量銷毀貨幣交易代碼如下:

2.業(yè)務(wù)邏輯

貨幣貿(mào)易網(wǎng)絡(luò)的業(yè)務(wù)邏輯代碼寫在lib目錄下的logic.js文件中。

(1)常量定義,代碼如下:

(2)制造貨幣,代碼如下:

上述代碼對(duì)應(yīng)的業(yè)務(wù)邏輯可被簡(jiǎn)述為:獲取貨幣制造者的參與者信息并判斷操作是否合法→創(chuàng)建新的貨幣實(shí)例并賦值→將新的貨幣實(shí)例加入制造者的“現(xiàn)持有貨幣”數(shù)組→與注冊(cè)器交互更新相應(yīng)資源的狀態(tài)。

(3)交易貨幣,代碼如下:

上述代碼對(duì)應(yīng)的業(yè)務(wù)邏輯可被簡(jiǎn)述為:獲取交易雙方的參與者信息并判斷購(gòu)買者余額是否足夠→改變交易雙方的剩余額度→將交易中的貨幣實(shí)例加入買方的“現(xiàn)持有貨幣”數(shù)組,并從賣方的對(duì)應(yīng)數(shù)組中移除該貨幣→與注冊(cè)器交互更新相應(yīng)資源的狀態(tài)。

(4)銷毀貨幣,代碼如下:

上述代碼對(duì)應(yīng)的業(yè)務(wù)邏輯可被簡(jiǎn)述為:檢查被操作貨幣的屬性→若滿足條件,則從“持有貨幣”數(shù)組中移除該貨幣實(shí)例并標(biāo)記貨幣制造者為‘非法’用戶→與注冊(cè)器交互,對(duì)貨幣實(shí)例進(jìn)行銷毀操作→與注冊(cè)器交互更新相應(yīng)資源的狀態(tài)。

(5)批量銷毀貨幣,代碼如下:

業(yè)務(wù)邏輯所用到的輔助函數(shù)selectCoinsByStatus可用如下方式進(jìn)行配置:

在項(xiàng)目根目錄(trade-network)下新建queries.qry文件,所有的自定義查詢都編寫在該文件中。

定義一個(gè)查詢。Hyperledger天生支持LevelDB和CouchDB兩種數(shù)據(jù)庫(kù),因此可以使用類sql語句從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)。

批量銷毀貨幣交易時(shí),需接收一個(gè)貨幣狀態(tài)參數(shù),因此要使用條件查詢(where)。查詢status等于傳入貨幣狀態(tài)的所有貨幣,代碼如下:

(6)編寫輔助函數(shù)。從貨幣數(shù)組中移除指定貨幣,可通過遍歷“貨幣持有”數(shù)組中的貨幣實(shí)例,根據(jù)貨幣ID判斷其是否為需要移除的對(duì)象。代碼如下:

7.1.3情景模擬

1.貨幣交易

小王和小明是兩位交易者。小王制作了一枚貨幣,小明想用金錢將其買下來。

(1)創(chuàng)建交易者小王和小明,代碼如下:

(2)執(zhí)行制造貨幣交易(MakeCoinTransaction),制造一枚貨幣,代碼如下:

新創(chuàng)建的貨幣信息如下所示(剛生產(chǎn)的貨幣的owner和maker相同):

根據(jù)業(yè)務(wù)邏輯,該貨幣將被自動(dòng)放入制作者的錢包,代碼如下:

(3)購(gòu)買貨幣,執(zhí)行貨幣交易(TradeCoinTransaction),代碼如下:

交易成功,該貨幣更換了主人,代碼如下:

賣方(貨幣制造者)金錢增加20,數(shù)據(jù)如下:

買方金錢減少20,將買到的貨幣放入錢包,數(shù)據(jù)如下:

2.假幣銷毀

上述情景中,小王實(shí)際上制作了一枚假幣!因此警察將會(huì)銷毀該假幣并禁止小王再次制作貨幣。

(1)創(chuàng)建警察,警察信息如下:

(2)發(fā)起銷毀假幣交易(DestoryIllegalCoinTransaction),交易信息如下:

假幣制造者被標(biāo)為“非法的”,代碼如下:

警察銷毀假幣數(shù)?+?1,代碼如下:

假幣已從貨幣擁有者的錢包移除,代碼如下:

3.假幣制造者再次制幣

執(zhí)行制造貨幣交易,代碼如下:

將看到錯(cuò)誤提示,交易執(zhí)行失敗,賬本狀態(tài)將不會(huì)發(fā)生任何改變,如圖7-2所示。圖7-2錯(cuò)誤提示

4.批量銷毀貨幣

手動(dòng)創(chuàng)建兩個(gè)合法和兩個(gè)非法的貨幣,如圖7-3所示。圖7-3創(chuàng)建貨幣

執(zhí)行兩次批量銷毀貨幣交易,分別銷毀所有合法和非法的貨幣(status分別為L(zhǎng)EGAL和ILLEGAL),代碼如下:

7.1.4網(wǎng)絡(luò)擴(kuò)展

(1)進(jìn)行合理性擴(kuò)展,包含內(nèi)容如下:

·貨幣制作后立即檢驗(yàn),防止假幣流通;

·防止自買自賣。

(2)進(jìn)行安全性擴(kuò)展,包含內(nèi)容如下:

·只有警察可以訪問假幣。

(3)進(jìn)行模型擴(kuò)展,包含內(nèi)容如下:

·添加資產(chǎn)——新幣種;

·添加參與者——法庭,對(duì)假幣制造者進(jìn)行裁決;

·添加參與者——黃牛,大量收獲貨幣并高價(jià)賣出。

(4)進(jìn)行功能擴(kuò)展,包含內(nèi)容如下:

·支持貨幣和貨幣間的交換;

·批量制作貨幣或批量購(gòu)買貨幣優(yōu)惠;

·對(duì)假幣制造者進(jìn)行金錢懲罰。

7.2能源購(gòu)置網(wǎng)絡(luò)案例分析

7.2.1網(wǎng)絡(luò)定義該業(yè)務(wù)網(wǎng)絡(luò)涉及如下內(nèi)容:

·貨幣、能源

·居民、銀行、能源公司

·金錢、貨幣和能源之間的交易

(1)資產(chǎn)包含如下內(nèi)容:貨幣,能源。

(2)參與者包含如下內(nèi)容:居民,銀行,能源公司。

在能源購(gòu)置網(wǎng)絡(luò)中,將模擬居民用銀行發(fā)行的貨幣來購(gòu)買能源的過程。

(3)交易包含如下內(nèi)容:居民用金錢購(gòu)買貨幣;居民用貨幣購(gòu)買能源;居民退還貨幣,獲得金錢。

確認(rèn)網(wǎng)絡(luò)中的模型后,即可編寫代碼實(shí)現(xiàn)模型和交易。

7.2.2代碼實(shí)現(xiàn)

首先用Yeoman生成工程目錄結(jié)構(gòu),并新建lib文件夾和logic.js。

1.CTO建模

1)利用枚舉設(shè)置貨幣持有者

貨幣持有者類型結(jié)構(gòu)如下:

2)設(shè)置相關(guān)資產(chǎn)類

設(shè)置抽象類,結(jié)構(gòu)如下:

設(shè)置貨幣類,代碼如下:

3)設(shè)置參與者相關(guān)類

設(shè)置參與者抽象類,結(jié)構(gòu)如下:

4)編寫交易代碼

居民用金錢從銀行購(gòu)買貨幣,代碼如下:

居民用貨幣從能源公司購(gòu)買能源,代碼如下:

居民從銀行將貨幣兌換成金錢,代碼如下:

2.業(yè)務(wù)邏輯

能源購(gòu)置網(wǎng)絡(luò)的業(yè)務(wù)邏輯代碼寫在lib目錄下的logic.js文件中。

(1)常量定義,代碼如下:

(2)用金錢購(gòu)買貨幣,代碼如下:

上述代碼對(duì)應(yīng)的業(yè)務(wù)邏輯可被簡(jiǎn)述為:獲取交易雙方的參與者信息并檢查購(gòu)買者的余額是否足夠→將貨幣實(shí)例從賣方轉(zhuǎn)移至購(gòu)買方→調(diào)整交易雙方的余額→與注冊(cè)器交互并更新相關(guān)資源的狀態(tài)。

(3)用貨幣購(gòu)買能源,代碼如下:

上述代碼對(duì)應(yīng)的業(yè)務(wù)邏輯可被簡(jiǎn)述為:獲取交易雙方的參與者信息→將貨幣實(shí)例從居民轉(zhuǎn)移至能源公司→將能源實(shí)例從能源公司轉(zhuǎn)移至居民→與注冊(cè)器交互并更新相關(guān)資源的狀態(tài)。

(4)將貨幣兌換成金錢,代碼如下:

(5)編寫輔助函數(shù)。從數(shù)組中移除指定元素,代碼如下:

7.2.3情景模擬

1.購(gòu)買能源

某居民區(qū)附近有銀行和能源公司,銀行發(fā)行了一批貨幣,居民先從銀行購(gòu)買貨幣,再使用貨幣從能源公司購(gòu)買能源。

(1)創(chuàng)建居民,數(shù)據(jù)如下:

(2)創(chuàng)建銀行,數(shù)據(jù)如下:

(3)創(chuàng)建能源公司,數(shù)據(jù)如下:

(4)創(chuàng)建兩個(gè)貨幣,數(shù)據(jù)如下:

(5)創(chuàng)建能源實(shí)例,擁有者是id為1的公司,數(shù)據(jù)如下:

(6)居民從銀行購(gòu)買貨幣,執(zhí)行購(gòu)買貨幣交易(MoneyToCoinTransaction),數(shù)據(jù)如下:

貨幣的擁有者發(fā)生改變,數(shù)據(jù)如下:

銀行獲得20金錢,且支出了一枚貨幣,數(shù)據(jù)如下:

居民支出20金錢,且獲得了一枚貨幣,數(shù)據(jù)如下:

(7)居民用貨幣購(gòu)買能源,執(zhí)行貨幣換能源交易(CoinToEnergyTransaction),數(shù)據(jù)如下:

能源的擁有者發(fā)生改變,數(shù)據(jù)如下:

貨幣的擁有者發(fā)生改變,數(shù)據(jù)如下:

公司支出能源,獲得貨幣,數(shù)據(jù)如下:

居民支出貨幣,獲得能源,數(shù)據(jù)如下:

2.退還貨幣

該居民又買了一枚貨幣,但發(fā)現(xiàn)目前不需要它,于是決定退還貨幣給銀行。

1)再次購(gòu)買貨幣

執(zhí)行購(gòu)買貨幣交易(MoneyToCoinTransaction),數(shù)據(jù)如下:

銀行獲得20金錢,支出貨幣,數(shù)據(jù)如下:

居民支出20金錢,獲得貨幣,數(shù)據(jù)如下:

2)執(zhí)行退還貨幣操作

執(zhí)行貨幣換金錢交易(CoinToMoneyTransaction),數(shù)據(jù)如下:

銀行獲得貨幣,退給居民10金錢,數(shù)據(jù)如下:

居民退還貨幣給銀行,獲得10金錢,數(shù)據(jù)如下:

7.2.4網(wǎng)絡(luò)擴(kuò)展

(1)進(jìn)行合理性擴(kuò)展,內(nèi)容如下:

·用戶購(gòu)買能源時(shí)必須確保能源公司仍有此能源;

·用戶購(gòu)買貨幣時(shí)必須確保銀行仍有此貨幣;

·銀行在受理退幣時(shí)必須確保該用戶仍有此貨幣;

·在購(gòu)買貨幣和退還貨幣返現(xiàn)交易中檢查金額是否合法。

(2)進(jìn)行安全性擴(kuò)展,內(nèi)容如下:

·用戶只能使用自己的貨幣。

(3)模型擴(kuò)展,內(nèi)容如下:

·添加資產(chǎn)——新幣種;

·添加參與者——能源回收者,從居民回收能源;

·添加事件——銀行發(fā)行貨幣。

(4)進(jìn)行功能擴(kuò)展,內(nèi)容如下:

·能源公司也可以用貨幣從銀行兌換金錢;

·能源可能會(huì)過期,需要添加一個(gè)時(shí)間戳;

·不同的幣種兌換不同的能源數(shù)。

(5)進(jìn)行其他網(wǎng)絡(luò)擴(kuò)展。

實(shí)際上,可以將貨幣和能源進(jìn)行通用處理,每次居民購(gòu)買銀行發(fā)行的貨幣,銀行就從貨幣數(shù)組中彈出最后一個(gè)貨幣給居民。同理,居民用貨幣購(gòu)買能源時(shí),無需指定具體的貨幣id,取出最后一個(gè)貨幣即可。這樣不僅可以減少參數(shù)的傳遞,還提供了一種判斷能否交易的簡(jiǎn)便方法——數(shù)組是否為空。

此外,還可以把price(價(jià)格)屬性從交易移至貨幣,這樣每次發(fā)起交易時(shí),price是一個(gè)固定的值,而無需刻意傳參。當(dāng)銀行想要貨幣貶值時(shí),可以使用updateAll函數(shù)對(duì)所有貨幣的價(jià)值進(jìn)行更新,調(diào)整幣價(jià)將變得相當(dāng)簡(jiǎn)單靈活。

7.3產(chǎn)品拍賣網(wǎng)絡(luò)案例分析7.3.1網(wǎng)絡(luò)定義根據(jù)需求對(duì)網(wǎng)絡(luò)進(jìn)行建模,該業(yè)務(wù)網(wǎng)絡(luò)涉及如下內(nèi)容:拍賣品,出價(jià)者,加價(jià),落錘(拍賣結(jié)束)。

(1)資產(chǎn)包含內(nèi)容:拍賣品。

(2)參與者。在產(chǎn)品拍賣網(wǎng)絡(luò)中,要模擬對(duì)產(chǎn)品的競(jìng)價(jià)拍賣的流程,需要的參與者是:出價(jià)者。

(3)交易包含內(nèi)容:出價(jià)者加價(jià),落錘(拍賣結(jié)束)。

(4)事件包含內(nèi)容:拍賣品拍賣結(jié)束時(shí)進(jìn)行通知。確認(rèn)網(wǎng)絡(luò)中的模型后,即可編寫代碼實(shí)現(xiàn)模型和交易。

7.3.2代碼實(shí)現(xiàn)

首先用Yeoman生成工程目錄結(jié)構(gòu),并新建lib文件夾和logic.js。

1.CTO建模

1)利用枚舉設(shè)置狀態(tài)

設(shè)置拍賣品狀態(tài),代碼如下:

2)設(shè)置相關(guān)資產(chǎn)

使用數(shù)組來記錄拍賣品的價(jià)格增長(zhǎng),結(jié)構(gòu)如下:

3)設(shè)置相關(guān)參與者

出價(jià)者結(jié)構(gòu)如下:

4)編寫交易代碼

出價(jià)者加價(jià),代碼如下:

5)編寫事件代碼

拍賣品拍賣結(jié)束,使用message屬性來傳遞事件通知,代碼如下:

2.編寫業(yè)務(wù)邏輯

產(chǎn)品拍賣網(wǎng)絡(luò)的業(yè)務(wù)邏輯代碼寫在lib目錄下的logic.js文件中。

(1)常量定義,代碼如下:

(2)出價(jià)者加價(jià),代碼如下:

首次叫價(jià)時(shí),procedure數(shù)組為空。因此只要首次叫價(jià)價(jià)格大于起始價(jià)格,即為叫價(jià)成功,之后的叫價(jià)必須大于當(dāng)前最高出價(jià)。

代碼對(duì)應(yīng)的業(yè)務(wù)邏輯可被描述為:獲取拍賣者與拍賣品的狀態(tài)信息,檢查拍賣品狀態(tài)是否滿足要求→判斷拍賣者的金額是否足夠→根據(jù)拍賣進(jìn)展判斷拍賣者叫價(jià)是否有效→若叫價(jià)有效則轉(zhuǎn)移拍賣品的暫時(shí)所有權(quán)至相應(yīng)拍賣者并更新叫價(jià)記錄數(shù)組→與注冊(cè)器交互,更新相關(guān)資源的狀態(tài)。

(3)拍賣結(jié)束,代碼如下:

7.3.3情景模擬

1.產(chǎn)品拍賣成功

一場(chǎng)大型拍賣會(huì)正在進(jìn)行,很多企業(yè)家們都在爭(zhēng)搶一件絕世珍寶。拍賣規(guī)則很簡(jiǎn)單,價(jià)高者得。

1)創(chuàng)建叫價(jià)者

創(chuàng)建三位叫價(jià)者,具有的資產(chǎn)分別為1000、2000、3000,代碼如下:

2)創(chuàng)建拍賣品

拍賣品初始狀態(tài)為“拍賣中”,代碼如下:

3)競(jìng)拍叫價(jià)

執(zhí)行一次叫價(jià)交易,第一位叫價(jià)者叫價(jià),代碼如下:

拍賣品記錄了最新叫價(jià),且得主更換,代碼如下:

再執(zhí)行一次叫價(jià)交易,由第二位叫價(jià)者進(jìn)行叫價(jià),代碼如下:

拍賣品再次記錄了最新叫價(jià),且得主更換,代碼如下:

再執(zhí)行一次叫價(jià)交易,由第三位叫價(jià)者叫價(jià),代碼如下:

再次記錄叫價(jià)并改變拍賣品得主,代碼如下:

執(zhí)行叫價(jià)交易,第一位叫價(jià)者再次叫價(jià),代碼如下:

金錢不足以叫價(jià),錯(cuò)誤提示如圖7-4所示。圖7-4叫價(jià)失敗錯(cuò)誤提示

4)拍賣結(jié)束,一錘定音

執(zhí)行拍賣結(jié)束(落錘)交易,代碼如下:

產(chǎn)品拍賣成功,狀態(tài)更改,代碼如下:

拍賣品得主扣除金錢,獲得拍賣品,代碼如下:

查看交易歷史記錄,拍賣成功時(shí),將收到事件通知,如圖7-5所示。圖7-5在歷史記錄中查看事件通知

2.產(chǎn)品拍賣失敗

接下來,開始拍賣另一件寶貝,不過好像大家都對(duì)這件拍賣品不感興趣,最終也無人叫價(jià)。

(1)創(chuàng)建拍賣品,數(shù)據(jù)如下:

(2)拍賣結(jié)束,執(zhí)行落錘操作。

執(zhí)行拍賣結(jié)束(落錘)交易,代碼如下:

無人購(gòu)買,交易失敗,如圖7-6所示。圖7-6錯(cuò)誤提示

7.3.4網(wǎng)絡(luò)擴(kuò)展

(1)進(jìn)行合理性擴(kuò)展,包含內(nèi)容如下:

·拍賣成功時(shí),當(dāng)前拍賣品必須處于拍賣中;

·拍賣成功時(shí),要再次校驗(yàn)得主的金錢是否足夠。

(2)進(jìn)行安全性擴(kuò)展,包含內(nèi)容如下:

·禁止任何人隨意修改拍賣品屬性,只能公開叫價(jià)。

(3)進(jìn)行模型擴(kuò)展,包含內(nèi)容如下:

·添加參與者——拍賣家,負(fù)責(zé)產(chǎn)品的拍賣;

·添加參與者——拍賣品原主人;

·添加事件——有新的叫價(jià)。

(4)進(jìn)行功能擴(kuò)展,包含內(nèi)容如下:

·自定義拍賣規(guī)則,未必價(jià)高者得;

·拍賣品原主人可在首次叫價(jià)前修改起價(jià);

·產(chǎn)品拍賣成功,拍賣家收到一定酬勞。

結(jié)

通過本章的學(xué)習(xí),讀者應(yīng)對(duì)HyperledgerComposer的一個(gè)高級(jí)功能——自定義查詢——有了基本的了解。并且通過三方交易類型和拍賣業(yè)務(wù)網(wǎng)絡(luò)的實(shí)戰(zhàn),熟悉了框架,開拓了思路。至此,HyperledgerComposer項(xiàng)目實(shí)戰(zhàn)系列就結(jié)束了。HyperledgerComposer的主要功能均已探索,還有一些功能,如資源注解、訪問控制、動(dòng)態(tài)綁卡、查看歷史記錄、OAuth等,在此不再贅述。讀者可自行閱讀官方文檔進(jìn)行學(xué)習(xí)。

本系列教程僅僅演示了超級(jí)賬本項(xiàng)目的冰山一角。實(shí)際上,通過Fabric區(qū)塊鏈網(wǎng)絡(luò)和HyperledgerComposer框架,幾乎可以滿足任何業(yè)務(wù)需求,開發(fā)任何不同場(chǎng)景的應(yīng)用。Hyperledger項(xiàng)目還提供了Explorer作為區(qū)塊鏈的監(jiān)控界面。想要成為超級(jí)賬本的開發(fā)高手,就要不斷地積累項(xiàng)目經(jīng)驗(yàn),探索更多的技術(shù),激發(fā)區(qū)塊鏈技術(shù)的無限可能性。第8章HyperledgerComposer

客戶端接入8.1項(xiàng)目簡(jiǎn)介8.2傳統(tǒng)項(xiàng)目的開發(fā)方式8.3區(qū)塊鏈項(xiàng)目的開發(fā)方式8.4多語言RestServer客戶端接入本章小結(jié)

8.1項(xiàng)

簡(jiǎn)

區(qū)塊鏈?zhǔn)且粋€(gè)分布式數(shù)據(jù)庫(kù),基于其加密、防篡改、可溯源等特點(diǎn),現(xiàn)在很多項(xiàng)目都會(huì)利用區(qū)塊鏈來存儲(chǔ)重要、敏感的數(shù)據(jù)。和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)、NoSQL數(shù)據(jù)庫(kù)不同,對(duì)基于HyperledgerFabric的區(qū)塊鏈進(jìn)行操作不需要使用SDK。HyperledgerComposer提供了RestServer和一套R(shí)estfulApi,只要使用Http請(qǐng)求遠(yuǎn)程調(diào)用即可使用。

現(xiàn)在的主流項(xiàng)目開發(fā)語言,如Java、Php、Golang、Node.js、Python等,都支持Http客戶端調(diào)用。因此HyperledgerComposer的客戶端接入十分簡(jiǎn)單,甚至讓開發(fā)者完全感受不到區(qū)塊鏈的存在,可以專注于業(yè)務(wù)。

本章首先從傳統(tǒng)項(xiàng)目開發(fā)方式講起,逐步揭秘傳統(tǒng)項(xiàng)目和區(qū)塊鏈項(xiàng)目開發(fā)過程的異同;再演示如何使用不同語言的客戶端接入ComposerRestServer。

8.2傳統(tǒng)項(xiàng)目的開發(fā)方式

在智能手機(jī)還未普及的時(shí)候,人們看到的網(wǎng)站大多是靜態(tài)網(wǎng)站,那時(shí)“前端”的概念并不流行。后來動(dòng)態(tài)網(wǎng)站的出現(xiàn)掀起了一場(chǎng)網(wǎng)絡(luò)風(fēng)暴,人們可以使用網(wǎng)站來收發(fā)郵件、填表、聽音樂、玩游戲、購(gòu)物等。如今已經(jīng)是“大前端時(shí)代”,H5、iOS、Android、微信小程序、支付寶小程序等成為移動(dòng)端App的主流開發(fā)技術(shù)。

傳統(tǒng)項(xiàng)目開發(fā)方式如圖8-1所示。圖8-1傳統(tǒng)項(xiàng)目開發(fā)方式

8.3區(qū)塊鏈項(xiàng)目的開發(fā)方式

8.3.1完全去中心化開發(fā)完全去中心化是指應(yīng)用部署在區(qū)塊鏈平臺(tái)上,而不是具體某一臺(tái)服務(wù)器,因此不會(huì)出現(xiàn)單機(jī)故障,此類應(yīng)用即DAPP。用戶一般需要下載特定的客戶端,如區(qū)塊鏈瀏覽器或電子錢包才能使用DAPP。目前,以太坊(Solidity和Truffle)和EOS是DAPP開發(fā)的主流技術(shù),開發(fā)難度較大。開發(fā)過程如圖8-2所示。圖8-2

DAPP開發(fā)過程

8.3.2數(shù)據(jù)存儲(chǔ)分布式開發(fā)

數(shù)據(jù)存儲(chǔ)分布式開發(fā)方式僅僅是將區(qū)塊鏈作為分布式數(shù)據(jù)庫(kù)去使用,實(shí)際應(yīng)用還是部署在中心服務(wù)器上的。因此該方式和傳統(tǒng)開發(fā)區(qū)別不大,十分簡(jiǎn)單,在提升數(shù)據(jù)的安全性方面卻有顯著效果,開發(fā)過程如圖8-3所示。圖8-3數(shù)據(jù)存儲(chǔ)分布式開發(fā)過程

HyperledgerComposer適用于該開發(fā)方式,后端通過請(qǐng)求調(diào)用ComposerRestServer提供的RestfulApi對(duì)區(qū)塊鏈上的數(shù)據(jù)進(jìn)行增刪查改等操作。

在了解兩種區(qū)塊鏈項(xiàng)目的開發(fā)方式后,下面進(jìn)入對(duì)HyperledgerComposer客戶端接入過程的講解。HyperledgerComposer客戶端的語言包括Java、Php、Golang、Node.js和Python,讀者可以用自己熟悉的語言有選擇地閱讀。

8.4多語言RestServer客戶端接入

8.4.1

Java

Java作為TIOBE編程語言排行榜的榜首,在企業(yè)項(xiàng)目開發(fā)、大數(shù)據(jù)、分布式、微服務(wù)等領(lǐng)域均被廣泛使用。它是一種面向?qū)ο蟮恼Z言,具有跨平臺(tái)、健壯性、多線程等特性,且完美支持RMI、RPC、Http等多種遠(yuǎn)程調(diào)用方式。因此,使用Java語言開發(fā)的項(xiàng)目接入RestServer極其簡(jiǎn)單。

目前流行的Java項(xiàng)目開發(fā)框架有Spring(面向切面編程)、SpringMVC(Web項(xiàng)目)、Mybatis(數(shù)據(jù)訪問)、SpringBoot(快速搭建Spring項(xiàng)目)、Dubbo(RPC遠(yuǎn)程調(diào)用)、SpringCloud(微服務(wù))、Netty(高性能NIO)等。

HttpClient是Java最常用的http調(diào)用庫(kù),并且在Java11的新特性中提供了HttpClientApi。由于Java8是目前企業(yè)項(xiàng)目的主流版本,此處使用Apache下的HttpClient來調(diào)用RestfulApi,方法如下:

(1)引入Maven依賴(或者下載jar包),配置代碼如下:

(2)初始化HttpClientBuilder,此處使用連接池管理Http連接,代碼如下:

(3)創(chuàng)建HttpClient,根據(jù)接口地址和請(qǐng)求類型創(chuàng)建請(qǐng)求對(duì)象。

Get請(qǐng)求方式代碼如下:

Post請(qǐng)求方式代碼如下:

Delete請(qǐng)求方式代碼如下:

Put請(qǐng)求方式代碼如下:

(4)發(fā)送請(qǐng)求,接受響應(yīng),代碼如下:

這里封裝了兩個(gè)常用函數(shù):checkResponse用于判斷請(qǐng)求是否返回了指定的狀態(tài)碼,否則拋出異常;responseToJsonString則用于接收RestServer返回的Json格式的字符串。

8.4.2

PHP

PHP有超過20年的歷史和巨大的生態(tài)圈,該語言因?yàn)檎Z法簡(jiǎn)單靈活而著稱,但是其性能相對(duì)其他語言較低,因此適用于開發(fā)中小型網(wǎng)站項(xiàng)目以及業(yè)務(wù)層面的應(yīng)用。

PHP的主流開發(fā)框架有ThinkPHP、Yii和Laravel等。其中,Laravel是目前PHP開發(fā)最主流的框架,它功能強(qiáng)大,設(shè)計(jì)思想先進(jìn),集合了PHP的優(yōu)點(diǎn)和特性,但是上手較難。

PHP常用的http調(diào)用方法有file_get_contents函數(shù)和curl擴(kuò)展庫(kù)。此處使用PHP原生支持的file_get_contents,方法如下:

(1)封裝請(qǐng)求參數(shù),代碼如下:

(2)封裝請(qǐng)求對(duì)象,代碼如下:

(3)發(fā)送請(qǐng)求,接收響應(yīng),代碼如下:

(4)將上述過程封裝為完整的函數(shù),代碼如下:

(5)調(diào)用封裝的請(qǐng)求函數(shù),代碼如下:

8.4.3

Go語言

Go語言是谷歌為了降低開發(fā)軟件的復(fù)雜度而推出的編程語言,它具有簡(jiǎn)潔、高效、快速、安全等特點(diǎn),且天然支持高并發(fā)。Go的編譯速度極快,編譯后Go代碼的運(yùn)行速度能夠媲美C語言。

Go語言還支持面向?qū)ο螅哂虚]包、反射等高級(jí)功能,學(xué)習(xí)過Java語言的開發(fā)者能夠快速上手并投入開發(fā)。

Go語言的主流Web開發(fā)框架有Beego、Gin、Revel等,這些框架都充分發(fā)揮了Go語言天然高性能的優(yōu)點(diǎn),能從容地面對(duì)高并發(fā)的場(chǎng)景。

使用Go語言提供的net/http模塊下的http.NewRequest可以很輕松地進(jìn)行Http調(diào)用,在數(shù)據(jù)抓取場(chǎng)景下也經(jīng)常被使用。方法如下:

(3)發(fā)送請(qǐng)求,接收響應(yīng)狀態(tài)碼和字符串,代碼如下:

8.4.4

Node.js

嚴(yán)格來說,Node.js不是一門編程語言,而是類似.Net的讓JavaScript能夠運(yùn)行在服務(wù)端的開發(fā)平臺(tái)。JavaScript是前端開發(fā)必不可少的腳本語言,運(yùn)行速度很快。Node.js采用封裝的V8引擎,它的出現(xiàn)讓JavaScript等腳本語言的運(yùn)行速度得到極大的提升,同時(shí)讓JavaScript具備了服務(wù)器端開發(fā)的能力。

Node.js使用事件驅(qū)動(dòng)、非阻塞的I/O模型。即使不新增額外的線程(即單線程),仍能夠通過事件循環(huán)對(duì)任務(wù)進(jìn)行并發(fā)處理。因此Node.js輕量且高效,適合實(shí)時(shí)應(yīng)用的開發(fā)。

Node.js最著名的框架是Express。Express框架為Node.js原生的Api進(jìn)行了良好的封裝,定義了大量的語法糖,且支持插件的開發(fā)和擴(kuò)展。

JS原本就是前端腳本語言,Ajax(異步JavaScript和XML)的出現(xiàn)開創(chuàng)了動(dòng)態(tài)網(wǎng)站的時(shí)代。因此,使用原生JS模擬Http請(qǐng)求本就十分簡(jiǎn)單,且Node.js的Http模塊對(duì)原本的Ajax請(qǐng)求進(jìn)行了封裝,提供了一套更易使用的異步http調(diào)用。下面介紹其使用方法:

(3)定義對(duì)響應(yīng)結(jié)果的處理和錯(cuò)誤處理,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論