SAP雲平臺,區塊鏈,超級帳本和智能合約

前一篇文章《Hyperledger Fabric on SAP Cloud Platform》,個人同事Aviva已經給你們介紹了基於區塊鏈技術的超級帳本(Hyperledger)的一些概要知識。Fabric是超級帳本5個並行項目中的其中之一,由於發展較爲成熟,SAP雲平臺對Fabric也提供了較好的支持。java

學完了前一篇文章的理論知識後,今天咱們來動手實踐一下。linux

咱們作的這個練習的範圍很窄,就是學會如何使用go語言開發一組微服務,這組微服務包含讀和寫兩個API,可以將數據寫入架設於SAP雲平臺上的超級帳本服務。git

你們還記得以前Aviva介紹的智能合約(Smart Contract)麼?github

簡單地說,應用程序經過智能合約接口同超級帳本進行讀寫操做。咱們將開發一個Hello World的智能合約,部署到SAP雲平臺上。出於簡單起見,咱們沒有開發應用,而是簡單地在SAP雲平臺的API控制檯上直接消費這個Hello World的智能合約,對雲平臺上的超級帳本進行讀和寫。編程

打開超級帳本項目Fabric的github倉庫地址:json

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的大力幫助,在此感謝。

更多閱讀

要獲取更多Jerry的原創文章,請關注公衆號"汪子熙":

相關文章
相關標籤/搜索