天天看點

SAP雲平台,區塊鍊,超級賬本和智能合約

前一篇文章《Hyperledger Fabric on SAP Cloud Platform》,我的同僚Aviva已經給大家介紹了基于區塊鍊技術的超級賬本(Hyperledger)的一些概要知識。Fabric是超級賬本5個并行項目中的其中之一,因為發展較為成熟,SAP雲平台對Fabric也提供了較好的支援。

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

我們做的這個練習的範圍很窄,就是學會如何使用go語言開發一組微服務,這組微服務包含讀和寫兩個API,能夠将資料寫入架設于SAP雲平台上的超級賬本服務。

大家還記得之前Aviva介紹的智能合約(Smart Contract)麼?

SAP雲平台,區塊鍊,超級賬本和智能合約

簡單地說,應用程式通過智能合約接口同超級賬本進行讀寫操作。我們将開發一個Hello World的智能合約,部署到SAP雲平台上。出于簡單起見,我們沒有開發應用,而是簡單地在SAP雲平台的API控制台上直接消費這個Hello World的智能合約,對雲平台上的超級賬本進行讀和寫。

SAP雲平台,區塊鍊,超級賬本和智能合約

打開超級賬本項目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中去:

SAP雲平台,區塊鍊,超級賬本和智能合約
SAP雲平台,區塊鍊,超級賬本和智能合約

2. Fabric項目已經将智能合約同超級賬本的通信封裝到一個名叫shim的接口中,我們隻需要在我們編寫的智能合約代碼中直接調用該shim接口即可。

我們使用import将這個shim接口的依賴引入進來,在第14行定義一個結構體,包含ID和Value兩個字段。這個結構體即是待寫入超級賬本的資料結構,ABAP顧問可以将其視為ABAP資料字典裡定義的結構體。

SAP雲平台,區塊鍊,超級賬本和智能合約

第46行定義的方法Invoke是這個最簡單的智能合約的核心代碼,cc *MessageStore這個文法和C語言很像,定義了一個類型為MessageStore的指針變量cc。這個指針變量同C++的this指針和ABAP的me引用作用類似,在方法被調用時,指向了方法的調用者。

Invoke後面括号裡的stub shim.ChaincodeStubInterface定義了該方法的輸入參數(形參)stub, 類型為shim.ChaincodeStubInterface。

SAP雲平台,區塊鍊,超級賬本和智能合約

這個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方法的邏輯結構和本文智能合約代碼的結構非常相似。

SAP雲平台,區塊鍊,超級賬本和智能合約
SAP雲平台,區塊鍊,超級賬本和智能合約

關于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雲平台之前,先在本地開發環境将所有潛在錯誤全部檢測出并修複。

SAP雲平台,區塊鍊,超級賬本和智能合約

4. 登入SAP雲平台,在Service Marketplace裡點選Hyperledger Fabric的超連結:

SAP雲平台,區塊鍊,超級賬本和智能合約

建立一個新的Service執行個體:

SAP雲平台,區塊鍊,超級賬本和智能合約

建立過程中需要填寫channel的ID和密匙。

SAP雲平台,區塊鍊,超級賬本和智能合約

還記得上一篇文章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調用。

SAP雲平台,區塊鍊,超級賬本和智能合約

點選Service執行個體的Referencing Apps面闆,點選按鈕Open Dashboard:

SAP雲平台,區塊鍊,超級賬本和智能合約

點選Deploy Chaincode,選擇本地建構好的zip包,進行上傳并部署。這個按鈕同SAP雲平台Neo和CloudFoundry環境部署本地應用的邏輯相同。

SAP雲平台,區塊鍊,超級賬本和智能合約

部署成功後,點選Test Chaincode超連結進入API控制台。

SAP雲平台,區塊鍊,超級賬本和智能合約

該控制台內建了Swagger架構,在調用post請求進行超級賬本的寫操作和get請求進行讀操作之前,先要點選Authorize按鈕進行身份認證:

SAP雲平台,區塊鍊,超級賬本和智能合約

輸入第四步建立Service Key後生成的clientID和clientSecret進行認證:

SAP雲平台,區塊鍊,超級賬本和智能合約

認證成功後,可以在Swagger的控制台裡調用post和get請求了。

SAP雲平台,區塊鍊,超級賬本和智能合約

首先發送post請求,請求負載就是一個簡單的json對象,id為i042416,value為Hello World:

post請求在SAP雲平台上的超級賬本執行成功,傳回200響應碼:

SAP雲平台,區塊鍊,超級賬本和智能合約

緊接着執行get請求,輸入剛才寫入的資料id: i042416:

SAP雲平台,區塊鍊,超級賬本和智能合約

get請求能夠将之前通過post請求寫入賬本的資料成功讀出來:

SAP雲平台,區塊鍊,超級賬本和智能合約

登入SAP雲平台超級賬本控制台,能看到之前通過post寫入的資料已經加入到區塊鍊尾部的區塊了。點選區塊可以檢視資料明細:

SAP雲平台,區塊鍊,超級賬本和智能合約

在超級賬本控制台的API Calls和Logs面闆裡也能看到每次超級賬本讀寫的詳細資訊。

SAP雲平台,區塊鍊,超級賬本和智能合約

總結一下,SAP雲平台的超級賬本服務,成功地幫助了希望使用這項區塊鍊技術的企業避免了硬體基礎設施的投入,同時屏蔽了大部分超級賬本平台管理的底層細節。通過SAP雲平台提供的控制台,即可實作對超級賬本進行裝置接入,通路控制,服務監控等管理功能。同時,通過Go語言編寫的智能合約一旦部署到SAP雲平台,生成的Restful API能夠被其他程式設計語言友善地消費。調用這些API寫入超級賬本區塊鍊中的資料将無法再被篡改。使用SAP雲平台的超級賬本服務,應用開發人員可以無需将過多精力花費在超級賬本體系架構本身,進而能夠專注于應用邏輯的編寫上去。

本文寫作過程中,得到了同僚Aviva的大力幫助,在此感謝。