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