您好,登錄后才能下訂單哦!
前一篇文章《 Hyperledger Fabric on SAP Cloud Platform 》,我的同事Aviva已經(jīng)給大家介紹了基于區(qū)塊鏈技術(shù)的超級賬本(Hyperledger)的一些概要知識。Fabric是超級賬本5個并行項目中的其中之一,因為發(fā)展較為成熟,SAP云平臺對Fabric也提供了較好的支持。
學(xué)完了前一篇文章的理論知識后,今天我們來動手實踐一下。
我們做的這個練習(xí)的范圍很窄,就是學(xué)會如何使用go語言開發(fā)一組微服務(wù),這組微服務(wù)包含讀和寫兩個API,能夠?qū)?shù)據(jù)寫入架設(shè)于SAP云平臺上的超級賬本服務(wù)。
大家還記得之前Aviva介紹的智能合約(Smart Contract)么?
簡單地說,應(yīng)用程序通過智能合約接口同超級賬本進行讀寫操作。我們將開發(fā)一個Hello World的智能合約,部署到SAP云平臺上。出于簡單起見,我們沒有開發(fā)應(yīng)用,而是簡單地在SAP云平臺的API控制臺上直接消費這個Hello World的智能合約,對云平臺上的超級賬本進行讀和寫。
打開超級賬本項目Fabric的github倉庫地址:
https://github.com/hyperledger/fabric
發(fā)現(xiàn)Fabric項目是Google的編程語言GoLang開發(fā)的,因此咱們這個練習(xí)也使用Go語言來進行智能合約的開發(fā)。
1. 從Google上將Go語言1.11版的二進制包下載到本地,解壓到/usr/local目錄下:
sudo tar -C /usr/local -xzf /home/vagrant/Downloads/go1.11.linux-amd64.tar.gz
將該目錄配置到環(huán)境變量PATH中去:
2. Fabric項目已經(jīng)將智能合約同超級賬本的通信封裝到一個名叫shim的接口中,我們只需要在我們編寫的智能合約代碼中直接調(diào)用該shim接口即可。
我們使用import將這個shim接口的依賴引入進來,在第14行定義一個結(jié)構(gòu)體,包含ID和Value兩個字段。這個結(jié)構(gòu)體即是待寫入超級賬本的數(shù)據(jù)結(jié)構(gòu),ABAP顧問可以將其視為ABAP數(shù)據(jù)字典里定義的結(jié)構(gòu)體。
第46行定義的方法Invoke是這個最簡單的智能合約的核心代碼,cc MessageStore這個語法和C語言很像,定義了一個類型為MessageStore的指針變量cc。這個指針變量同C++的 this指針 和ABAP的 me引用 *作用類似,在方法被調(diào)用時,指向了方法的調(diào)用者。
Invoke后面括號里的stub shim.ChaincodeStubInterface定義了該方法的輸入?yún)?shù)(形參)stub, 類型為shim.ChaincodeStubInterface。
這個Invoke方法不會通過應(yīng)用程序顯式調(diào)用,而是通過超級賬本程序回調(diào):當(dāng)方法被調(diào)用時,指針cc和輸入?yún)?shù)stub已經(jīng)自動被Fabric框架賦上了對應(yīng)值。在Invoke方法運行的上下文里,通過輸入?yún)?shù)stub判斷出當(dāng)前回調(diào)的場景是讀還是寫,然后進入對應(yīng)的分支。分支內(nèi)部調(diào)用我們自己開發(fā)的write和read方法同超級賬本進行交互。具體源碼在我的github上:
https://github.com/i042416/KnowlegeRepository/blob/master/ABAP/blockchain/message_store_chaincode.go
這種通過同一個回調(diào)函數(shù)內(nèi)部的switch case來處理多個場景的做法,ABAP和Java開發(fā)者應(yīng)該都不陌生。比如下圖是通過InvocationHandler實現(xiàn)Java動態(tài)代理的例子,其中invoke方法的邏輯結(jié)構(gòu)和本文智能合約代碼的結(jié)構(gòu)非常相似。
關(guān)于ABAP和Java里各種靜態(tài)代理和動態(tài)代理的寫法,請參考我的博客:
Various Proxy Design Pattern implementation variants in Java, ABAP and JavaScript
https://blogs.sap.com/2017/04/17/various-proxy-design-pattern-implementation-variants-in-java-and-abap/
3. 將開發(fā)好的智能合約源文件構(gòu)建成可執(zhí)行文件。這一步確保在部署智能合約到SAP云平臺之前,先在本地開發(fā)環(huán)境將所有潛在錯誤全部檢測出并修復(fù)。
4. 登錄SAP云平臺,在Service Marketplace里點擊Hyperledger Fabric的超鏈接:
創(chuàng)建一個新的Service實例:
創(chuàng)建過程中需要填寫channel的ID和密匙。
還記得上一篇文章Aviva提到區(qū)塊鏈分為 公有鏈 , 私有鏈 和 聯(lián)盟鏈 ,而超級賬本屬于聯(lián)盟鏈么?在聯(lián)盟鏈里,有一個專門的稱為MSP(Membership Service Provider)的模塊,提供成員管理服務(wù),只有授權(quán)用戶才能接入?yún)^(qū)塊鏈網(wǎng)絡(luò)。這里我事先在SAP云平臺上創(chuàng)建了一個渠道并進行認證,因此此處直接輸入一個合法的渠道ID和密匙。關(guān)于SAP云平臺上超級賬本渠道的創(chuàng)建和成員授權(quán)接入的步驟,請參考SAP幫助文檔:
https://help.sap.com/viewer/p/HYPERLEDGER_FABRIC
Service實例創(chuàng)建完畢后,點擊Create Service Key按鈕創(chuàng)建key,目的是生成用于OAuth認證的clientId和clientSecret,方便接下來的API調(diào)用。
點擊Service實例的Referencing Apps面板,點擊按鈕Open Dashboard:
點擊Deploy Chaincode,選擇本地構(gòu)建好的zip包,進行上傳并部署。這個按鈕同SAP云平臺Neo和CloudFoundry環(huán)境部署本地應(yīng)用的邏輯相同。
部署成功后,點擊Test Chaincode超鏈接進入API控制臺。
該控制臺集成了Swagger框架,在調(diào)用post請求進行超級賬本的寫操作和get請求進行讀操作之前,先要點擊Authorize按鈕進行身份認證:
輸入第四步創(chuàng)建Service Key后生成的clientID和clientSecret進行認證:
認證成功后,可以在Swagger的控制臺里調(diào)用post和get請求了。
首先發(fā)送post請求,請求負載就是一個簡單的json對象,id為i042416,value為Hello World:
post請求在SAP云平臺上的超級賬本執(zhí)行成功,返回200響應(yīng)碼:
緊接著執(zhí)行g(shù)et請求,輸入剛才寫入的數(shù)據(jù)id: i042416:
get請求能夠?qū)⒅巴ㄟ^post請求寫入賬本的數(shù)據(jù)成功讀出來:
登錄SAP云平臺超級賬本控制臺,能看到之前通過post寫入的數(shù)據(jù)已經(jīng)加入到區(qū)塊鏈尾部的區(qū)塊了。點擊區(qū)塊可以查看數(shù)據(jù)明細:
在超級賬本控制臺的API Calls和Logs面板里也能看到每次超級賬本讀寫的詳細信息。
總結(jié)一下,SAP云平臺的超級賬本服務(wù),成功地幫助了希望使用這項區(qū)塊鏈技術(shù)的企業(yè)避免了硬件基礎(chǔ)設(shè)施的投入,同時屏蔽了大部分超級賬本平臺管理的底層細節(jié)。通過SAP云平臺提供的控制臺,即可實現(xiàn)對超級賬本進行設(shè)備接入,訪問控制,服務(wù)監(jiān)控等管理功能。同時,通過Go語言編寫的智能合約一旦部署到SAP云平臺,生成的Restful API能夠被其他編程語言方便地消費。調(diào)用這些API寫入超級賬本區(qū)塊鏈中的數(shù)據(jù)將無法再被篡改。使用SAP云平臺的超級賬本服務(wù),應(yīng)用開發(fā)人員可以無需將過多精力花費在超級賬本體系架構(gòu)本身,從而能夠?qū)W⒂趹?yīng)用邏輯的編寫上去。
本文寫作過程中,得到了同事Aviva的大力幫助,在此感謝。
更多閱讀
Hyperledger Fabric on SAP Cloud Platform
300行ABAP代碼實現(xiàn)一個最簡單的區(qū)塊鏈原型
要獲取更多Jerry的原創(chuàng)文章,請關(guān)注公眾號"汪子熙":
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。