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