區(qū)塊鏈中的RESTFUL鏈碼調(diào)用API原理詳解

本文適合于熟悉開源區(qū)塊鏈技術(shù)Hyperledger Fabric,以及希望更高效地使用華為云區(qū)塊鏈服務(wù)的讀者。當(dāng)然,也歡迎任何對區(qū)塊鏈技術(shù)有興趣的讀者閱讀本文,相信讀者們都能從中受益。

成都創(chuàng)新互聯(lián) - 成都服務(wù)器托管,四川服務(wù)器租用,成都服務(wù)器租用,四川網(wǎng)通托管,綿陽服務(wù)器托管,德陽服務(wù)器托管,遂寧服務(wù)器托管,綿陽服務(wù)器托管,四川云主機(jī),成都云主機(jī),西南云主機(jī),成都服務(wù)器托管,西南服務(wù)器托管,四川/成都大帶寬,服務(wù)器機(jī)柜,四川老牌IDC服務(wù)商

2018年2月1日 華為云發(fā)布企業(yè)級區(qū)塊鏈開放平臺區(qū)塊鏈服務(wù)BCS(Blockchain Service),是基于開源區(qū)塊鏈技術(shù)和華為在分布式并行計算、數(shù)據(jù)管理、安全加密等核心技術(shù)領(lǐng)域多年積累基礎(chǔ)上推出的企業(yè)級區(qū)塊鏈云服務(wù)產(chǎn)品,旨在幫助各行業(yè)、企業(yè)在華為云上快速、高效的搭建企業(yè)級區(qū)塊鏈行業(yè)方案和應(yīng)用。

如前所述,搭建區(qū)塊鏈不是目的,關(guān)鍵是要方便應(yīng)用更高效地使用區(qū)塊鏈。本文要介紹的RESTFUL鏈碼調(diào)用API即是華為云區(qū)塊鏈為此目的而開發(fā)的,在詳細(xì)介紹API之前,先對鏈代碼做一下簡單介紹,便于沒有Fabric知識背景的讀者理解。

我們知道區(qū)塊鏈?zhǔn)且环N由區(qū)塊串聯(lián)而成的鏈?zhǔn)浇Y(jié)構(gòu),每一個區(qū)塊上都記錄著賬戶數(shù)據(jù),這些數(shù)據(jù)一經(jīng)寫入是不可篡改的。那么數(shù)據(jù)是如何寫入的呢?如果讓擁有寫入權(quán)限的用戶都能隨意寫入數(shù)據(jù)的話,區(qū)塊鏈也就失去了存在的意義,因此鏈代碼概念的引入意義重大。鏈代碼又被稱之為智能合約,顧名思義就是向區(qū)塊鏈寫入數(shù)據(jù)的預(yù)先約定好的代碼。它是一段邏輯,這個邏輯可以是簡單的限制和約束,也可以是非常復(fù)雜的業(yè)務(wù)相關(guān)的邏輯,根據(jù)用戶的輸入,進(jìn)行邏輯的運(yùn)算,最終得出向區(qū)塊鏈寫入的數(shù)據(jù)集合,然后將數(shù)據(jù)寫入到區(qū)塊鏈上去。如果這樣描述過于抽象的話,我們以一個賬戶轉(zhuǎn)賬的例子來進(jìn)行說明。
區(qū)塊鏈中的RESTFUL鏈碼調(diào)用API原理詳解
如上圖所示,圖中右邊的區(qū)塊鏈記錄著原始賬戶的余額,a為100元,b為200元。圖中左邊客戶端應(yīng)用程序發(fā)起一筆轉(zhuǎn)賬交易:a向b轉(zhuǎn)x元。這筆交易不會直接寫入?yún)^(qū)塊鏈,而是先經(jīng)過中間的鏈代碼進(jìn)行智能合約的運(yùn)算,檢查a的賬戶里是否有足夠的余額,然后才允許轉(zhuǎn)賬交易的進(jìn)行,將最終的a、b賬戶的余額寫入到最新的區(qū)塊鏈中。
整個交易過程以及鏈代碼的作用其實(shí)非常淺顯易懂,但其實(shí)我們的應(yīng)用程序向鏈代碼發(fā)起調(diào)用的過程還是有些復(fù)雜的。因?yàn)閰^(qū)塊鏈的調(diào)用請求不同于普通的RPC遠(yuǎn)程調(diào)用,客戶端需要有如下的事情:

1,將鏈代碼的調(diào)用信息如通道ID、鏈碼ID、調(diào)用參數(shù)、調(diào)用者信息等進(jìn)行打包,
2,將打包好的二進(jìn)制內(nèi)容使用用戶私鑰進(jìn)行簽名
3,根據(jù)鏈碼的背書策略不同,可能需要向多個組織的節(jié)點(diǎn)上的鏈碼發(fā)起調(diào)用
區(qū)塊鏈中的RESTFUL鏈碼調(diào)用API原理詳解
由此可見,這個調(diào)用過程如果讓客戶端自己來實(shí)現(xiàn)是不太現(xiàn)實(shí)的,因此需要借助SDK的幫助來實(shí)現(xiàn)。目前根據(jù)客戶端的語言不同,SDK也有各種不同的語言版本,例如golang語言就有fabric-sdk-go的實(shí)現(xiàn),javascript也有nodejs版本的SDK實(shí)現(xiàn)。我們先來看一下使用SDK需要的配置文件以及使用SDK進(jìn)行調(diào)用的示例代碼片段:
區(qū)塊鏈中的RESTFUL鏈碼調(diào)用API原理詳解
上圖是一個200行的SDK配置文件片段
區(qū)塊鏈中的RESTFUL鏈碼調(diào)用API原理詳解
這是一個nodejs版本的SDK使用示例。由此我們可以看出客戶端應(yīng)用直接使用SDK的弊端:
1,配置文件書寫復(fù)雜 雖然華為云已經(jīng)提供了SDK配置文件下載功能,對于首次使用SDK的開發(fā)人員來說成本仍然很高。
2,SDK語言相關(guān),并且學(xué)習(xí)成本高 雖然很多語言都提供了Fabric SDK,但是學(xué)習(xí)起來仍然有一定學(xué)習(xí)成本,并且不同語言的類庫名稱,方法名稱調(diào)用方式都各不相同,切換不同語言時的學(xué)習(xí)成本成倍增加。
3,SDK過于厚重 應(yīng)用程序在使用SDK的時候需要將SDK類庫引入,雖然不用開發(fā)語言的SDK打包后大小各不相同,但對于一些薄客戶端(比如安卓或者IOS手機(jī)應(yīng)用)來說仍然顯得十分厚重。
華為云為了方便開發(fā)者使用區(qū)塊鏈服務(wù),在服務(wù)端提供了RESTFUL的API以克服上述直接使用SDK方式的不足:
區(qū)塊鏈中的RESTFUL鏈碼調(diào)用API原理詳解
如上面架構(gòu)圖所示,華為云區(qū)塊鏈服務(wù)直接暴露RESTFUL形式的API供開發(fā)者使用,在服務(wù)端封裝了對SDK的調(diào)用。因?yàn)槿A為云替用戶管理著區(qū)塊鏈的組織結(jié)構(gòu)以及各種證書,所以天然具備了所需要的SDK的配置文件,不需要用戶自己手動生成。在此給出一個RESTFUL鏈碼調(diào)用請求的Header和Body的示例供讀者參考:
HEADER:
x-bcs-signature-sign: 1f8b08000000000000ff14cbb11503510c02b081d260c098bfff6279d74bb90a5ca7384e3cae9b5825af7cb076b65e039be41da8e8b1e38700d599fa4aee37d6c159a94355ada783dbb4d66e17e967db39cef36bcd0b5adc8be3e178698ef9070000ffff
BODY:
{
“channelId”: “testchannel”,
“chaincodeId”: “zmmcode”,
“chaincodeVersion”: “1.0”,
“userId”: “User1”,
“orgId”: “7258adda1803f4137eff4813e7aba323018200c5”,
“opmethod”: “invoke”,
“args”: “[“invoke”,“a”,“b”,“1”]”,
“timestamp”: “2018-10-31T17:28:16+08:00”,
“cert”: “-----BEGIN CERTIFICATE-----\nMIIDBzCCAq2gAwIBAgIQEXPZlMsReamxVtVNnKwCCzAKBggqhkjOPQQDAjCCAQQx\nDjAMBgNVBAYTBUNISU5BMRAwDgYDVQQIEwdCRUlKSU5HMRAwMwUQYD14eH+jTTBLMA4GA1Ud\nDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIFBXQ5TC4acFeTlT\nJuDZg62XkXcdnOfvbejSeKI2TXoIMAoGCCqGSM49BAMCA0gAMEUCIQCadHIKl0Mk\nYn0WZizyDZYR4rT2q0nzjFaiW+YfV5FBjAIgNalKUe3rIwXJvXORV4ZXurEua2Ag\nQmhcjRnVwPTjpTE=\n-----END CERTIFICATE-----\n”
}
看到這里,讀者可能會對上面Header中的簽名以及Body中的cert證書信息有所疑惑。請不要著急,在此先介紹一下華為云區(qū)塊鏈RESTFUL接口的實(shí)現(xiàn)原理,讀者自然就能解除心中疑慮。
區(qū)塊鏈中的RESTFUL鏈碼調(diào)用API原理詳解
根據(jù)前文我們已經(jīng)了解區(qū)塊鏈的調(diào)用和普通RPC的遠(yuǎn)程調(diào)用最主要的區(qū)別在于需要有用戶簽名用于證明交易是指定用戶所發(fā)起的,那么RESTFUL調(diào)用也不可避免這個問題。因此我們在使用華為云區(qū)塊鏈RESTFUL接口時仍然需要使用用戶私鑰對整個請求消息體進(jìn)行簽名如圖中?所示,簽名的結(jié)果放到HEADER中指定名稱下。這個簽名在服務(wù)端會使用用戶的公鑰進(jìn)行驗(yàn)證,驗(yàn)證通過交易才能繼續(xù)。

在某些情況下,用戶的公私鑰對并不是華為云區(qū)塊鏈服務(wù)管理的,而是用戶使用組織私鑰自行簽發(fā)的,這個時候服務(wù)端就缺少這個用戶的公私鑰,此時就需要在請求消息體中使用cert字段上傳用戶公鑰,服務(wù)端使用用戶上傳的公鑰驗(yàn)證HEADER中的簽名是否是私鑰對消息體的合法簽名。這時問題就來了,任何一個偽造者都可以自己制作一個非對稱的公私鑰對,然后對一個非法的消息體進(jìn)行私鑰簽名,并把公鑰放到消息體中以通過服務(wù)端的驗(yàn)簽。為了避免這個漏洞,服務(wù)端在驗(yàn)簽之前會對用戶上傳的公鑰進(jìn)行合法性驗(yàn)證,如上圖?。因?yàn)橛脩羯蟼鞯墓€實(shí)際上是一個證書,該證書包含了用戶公鑰以及組織私鑰對該證書的簽名,而偽造者缺少組織私鑰無法偽造簽名,這樣服務(wù)端就能判定用戶上傳證書的合法性。

當(dāng)服務(wù)端使用合法的用戶證書驗(yàn)證請求HEADER中的簽名是用戶私鑰的簽名后,服務(wù)端就可以真正發(fā)起區(qū)塊鏈鏈碼的調(diào)用了,這里服務(wù)端使用SDK的方式與客戶端直接使用SDK的方式并無不同,只不過如果客戶端證書是自行簽發(fā)的,那么服務(wù)端是沒有用戶私鑰的,這個時候就會使用組織的admin證書發(fā)起區(qū)塊鏈鏈碼的調(diào)用。
至此,RESTFUL的調(diào)用機(jī)制讀者也清楚了,那么RESTFUL調(diào)用的優(yōu)點(diǎn)也就很容易理解:

1.使用簡單方便,由華為云區(qū)塊鏈服務(wù)封裝SDK的復(fù)雜性。

  1. 由于絕大多數(shù)語言都已經(jīng)擁有很成熟的RESTFUL調(diào)用類庫,調(diào)用RESTFUL基本沒有學(xué)習(xí)成本。
  2. 不用引入SDK類庫,適合更輕量的客戶端。
    以上就是對華為云區(qū)塊鏈RESTFUL鏈代碼調(diào)用API的原理的詳細(xì)講述,目前RESTFUL接口還處于公測階段,歡迎讀者到華為云進(jìn)行免費(fèi)體驗(yàn)并提出寶貴意見。

參考資料:API參考


來源:CSDN
原文:https://blog.csdn.net/weixin_43682574/article/details/85077234
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

分享題目:區(qū)塊鏈中的RESTFUL鏈碼調(diào)用API原理詳解
文章起源:http://www.muchs.cn/article20/phdoco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄定制開發(fā)、網(wǎng)站制作、靜態(tài)網(wǎng)站、、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)