《使用BSN 一天學會區(qū)塊鏈開發(fā)》系列文章可以幫助具有一定開發(fā)經(jīng)驗的開發(fā)者,在不需要學習區(qū)塊鏈開發(fā)語言的情況下,在區(qū)塊鏈服務網(wǎng)絡(BSN)上完成區(qū)塊鏈應用的開發(fā)。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、雅安服務器托管、營銷軟件、網(wǎng)站建設、玉山網(wǎng)站維護、網(wǎng)站推廣。
本文主要介紹用戶如何通過鏈下業(yè)務系統(tǒng)使用Python語言與鏈上數(shù)據(jù)進行交互而進行的相關操作流程說明,但在說明鏈下業(yè)務系統(tǒng)與鏈上進行數(shù)據(jù)交互之前,首先對用戶如何在區(qū)塊鏈服務門戶注冊、應用發(fā)布服務、應用服務參與以及應用管理進行一一說明。
注冊和登錄
打開區(qū)塊鏈服務網(wǎng)絡網(wǎng)址:www.bsnbase.com, 點擊登錄頁面中的【內(nèi)測申請】按鈕進入內(nèi)測申請頁:
根據(jù)頁面中的提示填寫內(nèi)測申請信息并提交內(nèi)測申請,內(nèi)測申請用戶分為個人用戶和企業(yè)用戶兩種,申請人應根據(jù)自己的用戶類型任選一種進行申請, 內(nèi)測申請?zhí)峤缓笮璧却到y(tǒng)審核,待系統(tǒng)審核通過后將向申請者發(fā)送激活郵件,申請用戶可根據(jù)【激活郵件】中的激活鏈接來激活賬, 帳戶激活后即可登錄系統(tǒng)使用。
應用服務發(fā)布
應用服務是指在區(qū)塊鏈服務網(wǎng)絡中已經(jīng)發(fā)布并運行的區(qū)塊鏈應用,用戶可以通過服務網(wǎng)絡門戶發(fā)布自己的區(qū)塊鏈應用服務,應用服務分為公開和非公開兩種(內(nèi)測期間發(fā)布的服務默認為非公開,如需公開服務需提交公開申請,后臺運營人員進行審核,只有審核通過后服務才可在服務門戶的應用商店中進行查看),此處就不一一截圖了,就概述一下應用服務發(fā)布整體流程:
· 登錄區(qū)塊鏈服務門戶以后,進入我發(fā)布的應用->我發(fā)布的服務頁面;
· 點擊創(chuàng)建新服務按鈕,進入創(chuàng)建新服務頁面,根據(jù)提示輸入相應的信息;
· 點擊下一步按鈕開始上傳鏈碼包(上傳鏈碼包可以使用自己開發(fā)的鏈碼包或直接使用服務網(wǎng)絡提供的預制鏈碼包),再定義服務功能及角色(表示鏈下業(yè)務系統(tǒng)調(diào)用鏈碼所對應的權限)、選擇發(fā)布的城市節(jié)點(表示當前發(fā)布的服務所對應的鏈碼部署在哪些城市節(jié)點)、付費周期以及是否使用云服務等信息;
· 繼續(xù)點擊下一步按鈕,進入到設置接入方式頁面,輸入網(wǎng)站地址、移動終端接入以及API服務接入等信息(接入方式均為鏈下接入的相關信息),如果暫時不需要設置接入方式,可跳過此頁面繼續(xù)點擊下一步按鈕,進入服務賬單頁面進行確定(服務網(wǎng)絡內(nèi)測其間,所有資源均免費使用);
· 點擊確定后,在我發(fā)布的應用->我發(fā)布的服務列表頁面可以看到該條新創(chuàng)建的服務,且該服務的狀態(tài)為"待初審"狀態(tài),發(fā)布者需等待運營和運維人員進行審核和發(fā)布,服務發(fā)布后發(fā)布者默認不參與服務。
應用服務參與
在服務網(wǎng)絡內(nèi)測期間,所有發(fā)布的服務均為非公開,如果自己或其他用戶想要參與已經(jīng)發(fā)布的服務,可通過在我發(fā)布的應用->我發(fā)布的服務列表中邀請參與者,將邀請參與者的鏈接地址發(fā)給需要參與服務的用戶,應用參與服務整體流程如下:
· 根據(jù)邀請的鏈接地址,進入服務信息頁面,點擊申請參與應用按鈕,進入服務角色及城市節(jié)點選擇頁面;
· 選擇需要使用的服務角色和城市節(jié)點(角色是指用戶參與服務后鏈下業(yè)務系統(tǒng)訪問鏈上所對應的權限;城市節(jié)點是指用戶的鏈下業(yè)務系統(tǒng)通過該城市節(jié)點與鏈上進行數(shù)據(jù)交互)。用戶選擇服務角色以后,系統(tǒng)會顯示角色對應的功能使用費,選擇城市節(jié)點的時候申請新證書或選擇已有的證書。
· 點擊確定按鈕,提示接入城市節(jié)點、接入方式以及費用信息:
· 確認參與服務的接入城市節(jié)點、接入方式以及費用信息(內(nèi)測期間,所有資源均免費)后,在我參與的應用->我參與的列表頁面可以查看到所參與的應用服務,該應用服務的狀態(tài)為待發(fā)布者審核,等待應用服務的發(fā)布者對參與者進行審核。
· 服務網(wǎng)絡內(nèi)測期間只要發(fā)布者對服務參與申請審核通過后,服務參與信息的狀態(tài)更新為已確認。至此,參與應用服務成功。
· 應用服務參與成功以后,鏈下業(yè)務系統(tǒng)就可以調(diào)用城市節(jié)點所對應的節(jié)點網(wǎng)關,將數(shù)據(jù)推送上鏈和從獲取上鏈數(shù)據(jù)以及鏈上區(qū)塊信息,調(diào)用節(jié)點網(wǎng)關所對應的參數(shù)可進入我參與的服務->我參與的->查看->接入的城市節(jié)點和服務接入配置參數(shù)部分進行查看,接入的城市節(jié)點用于接入的城市節(jié)點證書進行下載以及城市節(jié)點網(wǎng)關的調(diào)用地址進行展示,應用服務接入配置參數(shù)用于對鏈下業(yè)務系統(tǒng)調(diào)用城市節(jié)點網(wǎng)關的相關參數(shù)進行展示,此部分的細節(jié)描述參考"數(shù)據(jù)交互"部分;
應用管理
應用服務發(fā)布以后,可進入我發(fā)布的應用->我發(fā)布的服務管理列表中對已經(jīng)發(fā)布的服務進行統(tǒng)一管理,管理列表具體包含以下功能:
· 邀請參與者:主要用于將應用參與的邀請鏈接地址發(fā)給其它用戶,其它用于可以通過此邀請鏈接地址參與此服務;
· 申請公開:主要是內(nèi)測期間,所有發(fā)布的服務默認均為非公開,如果需要將服務公開,則可以通過此功能提交公開申請;
· 服務升級:主要用于對應用服務的鏈碼包進行升級;
· 配置升級:主要用于對應用服務的配置資源進行升級,如部署的城市節(jié)點以及節(jié)點的資源的配置信息;
· 歷史版本:主要用于對服務升級以后的歷史版本進行查詢;
· 運行信息:主要用于對應用服務的部署節(jié)點以及節(jié)點資源信息和鏈上數(shù)據(jù)(來源于鏈下業(yè)務系統(tǒng)通過調(diào)用節(jié)點網(wǎng)關接口將數(shù)據(jù)推送上鏈)進行監(jiān)控;
· 設置接入方式:主要用于對應用服務的鏈下業(yè)務系統(tǒng)的接入進行配置;
· 查看:主要用于對應用服務的基本信息、鏈碼及部署信息、服務角色信息、審批記錄信息以及接入方式等信息進行查看。
應用鏈碼開發(fā)
鏈碼(ChainCode)又稱為智能合約,是用計算機語言描述合約條款、交易的條件、交易的業(yè)務邏輯等,通過調(diào)用智能合約實現(xiàn)交易的自動執(zhí)行和對賬本數(shù)據(jù)的操作。一個區(qū)塊鏈應用可以部署多個鏈碼,每個鏈碼包含多個方法。
鏈碼支持多種語言編寫,包括golang、java、node.js。每個鏈碼程序都必須實現(xiàn)Chaincode接口,鏈碼包含:Init ,Invoke,Query三個基本操作:
· Init :鏈碼初始化的方法,在鏈碼實例化或者升級的時候調(diào)用一次,以便鏈碼可以執(zhí)行任何必要的 初始化,包括應用程序狀態(tài)的初始化。
· Invoke:接收和處理鏈下業(yè)務系統(tǒng)調(diào)用事務處理提案,其參數(shù)包含調(diào)用的鏈碼程序中函數(shù)的名稱和具體業(yè)務處理數(shù)據(jù)參數(shù)。即在Invoke中根據(jù)不同的方法參數(shù)調(diào)用其他分支處理響應的業(yè)務。Invoke可以簡單的理解為鏈碼方法的入口。
· Query:提供查詢鏈碼數(shù)據(jù)的方法,該方法只作為查詢使用,不提供操作鏈上數(shù)據(jù)的操作。可在Query操作時調(diào)用,亦可在Invoke方法中作為某些方法的分支被調(diào)用。該方法可以不實現(xiàn)。
下面以通用數(shù)據(jù)鏈碼包為例詳細說明一下。
通用數(shù)據(jù)鏈碼包是我們?yōu)閼瞄_發(fā)者提供對業(yè)務數(shù)據(jù)進行增刪改查基本操作的鏈碼(Golang語言編寫)。應用開發(fā)者可以在此鏈碼包的基礎上根據(jù)應用業(yè)務需求進一步拓展鏈碼功能。此鏈碼支持存儲的數(shù)據(jù)類型有字符串、整型、浮點型、集合(map、list)等等。
鏈碼包下載地址: www.bsnbase.com/static/base/BaseChainCode.zip
1.鏈碼包功能如下:
1.1.增加數(shù)據(jù)(set)
輸入?yún)?shù)說明
baseKey:需要保存的唯一的主鍵標識,baseValue:保存的數(shù)據(jù)信息
例:{"baseKey":"str","baseValue":"this is string"}
注:其中baseKey是不能為空的字符串,baseValue可以是任意類型的數(shù)據(jù)。如果baseKey已經(jīng)存在,則直接返回已經(jīng)存在,不能添加;如果不存在,則添加數(shù)據(jù)。
1.2. 修改數(shù)據(jù)(update)
輸入?yún)?shù)說明
baseKey:需要修改的唯一的主鍵標,baseValue:保存的數(shù)據(jù)信息
例:{"baseKey":"str","baseValue":"this is string"}
注:其中baseKey是不能為空的字符串,baseValue可以是任意類型的數(shù)據(jù)。如果baseKey不存在,則無法更新,如果已經(jīng)存在,則修改數(shù)據(jù)。
1.3. 刪除數(shù)據(jù)(delete)
輸入?yún)?shù)說明
baseKey:需要刪除的唯一的主鍵標識的值
例:"str"
注:其中baseKey的值不能為空,且必須存在,否則將無法刪除。
1.4. 獲取數(shù)據(jù)(get)
輸入?yún)?shù)說明
baseKey:需要獲取的唯一的主鍵標識的值
例:"str"
注:其中baseKey的值不能為空,且必須存在,否則將無法獲取到相應的信息。
2.鏈碼介紹
2.1.Init方法
這個就是最簡單的鏈碼初始化功能,寫日志、初始化一條數(shù)據(jù)、保存到數(shù)據(jù)庫、響應。
建議在鏈碼初始化(Init)的時候,不要有太多的業(yè)務操作。
2.2. Invoke
stub.GetFunctionAndParameters():獲取請求的方法名稱(string)和參數(shù)信息([]string)
return t.set(stub, args)//調(diào)用保存的方法,具體的業(yè)務處理
節(jié)點網(wǎng)關
節(jié)點網(wǎng)關是部署在各個城市節(jié)點,接收應用系統(tǒng)的請求,使用托管的用戶身份信息,向相應的應用鏈碼發(fā)起訪問并返回鏈碼的執(zhí)行結果。節(jié)點網(wǎng)關的調(diào)用是通過向區(qū)塊鏈服務的各個城市節(jié)點的網(wǎng)關服務發(fā)送HTTP請求來實現(xiàn)。節(jié)點網(wǎng)關負責驗證用戶身份信息、應用信息,通過用戶身份信息和應用信息以及需要訪問的鏈碼、鏈碼方法來傳遞鏈碼參數(shù)、獲取鏈碼執(zhí)行結果的服務通道。
業(yè)務系統(tǒng)需要按照接口說明在請求中加入相應的請求參數(shù),調(diào)用節(jié)點網(wǎng)關以后,節(jié)點網(wǎng)關會返回鏈碼的執(zhí)行結果。
接口地址:https://節(jié)點網(wǎng)關地址/api/node/reqChainCode
注:用戶參與服務成功后可以在服務詳情頁面查看并下載應用鏈下業(yè)務系統(tǒng)開發(fā)所需要的應用服務配置參數(shù)、節(jié)點網(wǎng)關地址和應用身份證書,如下圖:
通訊方式:POST
簽名算法:
1、將userCode+ appCode+ chainCode+ funcName的值以及args中每一項數(shù)據(jù)拼接成字符串A;
2、對字符串A使用用戶證書的私鑰進行SHA256WITHECDSA簽名。
請求參數(shù)
響應參數(shù)
數(shù)據(jù)交互
應用服務參與審核通過之后,鏈下業(yè)務系統(tǒng)就可以通過節(jié)點網(wǎng)關與鏈上數(shù)據(jù)進行數(shù)據(jù)交互,調(diào)用節(jié)點網(wǎng)關需要節(jié)點網(wǎng)關接入地址、節(jié)點網(wǎng)關請求參數(shù)以及證書等信息,此部分數(shù)據(jù)可以通過我參與的應用->我參與的->查看明細頁面進行獲取,下面對這三方面的參數(shù)進行一一說明;
· 節(jié)點網(wǎng)關接入地址:為鏈下業(yè)務系統(tǒng)調(diào)用鏈上所對應的城市節(jié)點入口,所有與鏈上的數(shù)據(jù)交互都是通過此地址進行訪問,如下圖所示:
· 節(jié)點網(wǎng)關請求參數(shù):如果需要通過節(jié)點網(wǎng)關接入地址與鏈上進行數(shù)據(jù)交互,肯定需要按照節(jié)點網(wǎng)關接口調(diào)用規(guī)范,節(jié)點網(wǎng)關接口調(diào)用需要userCode、appCode、tid、chainCode、funcName、agrs等參數(shù)信息,下面對相關參數(shù)進行概要說明。
· userCode:應用發(fā)布者或者參與者的登錄名(也就是登錄門戶的用戶名)。
· appCode:參與應用的唯一標識。應用創(chuàng)建時,系統(tǒng)自動生成的唯一標識。
· tid:用戶與參與的應用之間關聯(lián)的唯一標識。
· chainCode:區(qū)塊鏈服務網(wǎng)絡中,運維部署的鏈碼的名稱。需要注意的是,這里的鏈碼名稱不是服務發(fā)布時的鏈碼名稱。
· funcName:調(diào)用鏈碼的方法名稱。
· agrs:調(diào)用鏈碼方法的參數(shù)集合。字符串類型的數(shù)組,參與者需要與應用發(fā)布者聯(lián)系,獲取方法對應的參數(shù)。
參數(shù)獲取頁面如下圖所示:
· 節(jié)點用戶證書:在請求節(jié)點網(wǎng)關過程中需要https證書、請求報文簽名證書(即用戶身份證書)和響應結果驗簽證書。
· https請求證書:為保障數(shù)據(jù)傳輸層的安全,需要使用https請求。
· 請求報文簽名證書:用戶私鑰證書。
· 響應結果驗簽證書:網(wǎng)關公鑰證書。
用戶身份證書的下載可以通過我參與的應用->我參與的->查看->接入的城市節(jié)點部分進行下載,也可以通過進入我的身份證書-證書查看列表中找到對應的應用信息,進行證書下載。下載的證書文件包含https證書、用戶證書(私鑰證書、公鑰證書(網(wǎng)關對報文的驗簽))、網(wǎng)關證書(網(wǎng)關公鑰證書)。證書下載頁面如下圖所示
業(yè)務系統(tǒng)開發(fā)
業(yè)務系統(tǒng)就是鏈下業(yè)務系統(tǒng),需要與鏈上進行數(shù)據(jù)交互的系統(tǒng),下面根據(jù)預置鏈碼包的Python開發(fā)實例(可從門戶下載)著重說一下與網(wǎng)關交互的說明。
項目環(huán)境準備:
1、Pycharm/VS Code(可以使用您習慣的IDE)
2、Python 3.6.6+
3、Django 2.2.5
4、Django-bootstrap3 11.1.0
5、requests 2.22.0
6、cryptography 2.7
7、fabric-sdk-py 0.8.1
注:可根據(jù)requirements.txt文件自動安裝依賴
項目介紹:
上圖為項目的目錄結構:
該項目使用Python-Django框架,直接調(diào)用服務網(wǎng)關api接口,實現(xiàn)數(shù)據(jù)交互:
1、 common 文件夾下文件說明:
· myecdsa256.py(橢圓曲線 SHA256WITHECDSA 簽名方法和驗簽方法)
· loggers.py(日志方法)
2、 certificate 文件夾下文件說明(下載用戶證書zip包獲?。?/p>
· bsn_https.pem(https請求的公鑰證書)
· gateway_public_cert.pem(網(wǎng)關公鑰證書)
· private_key.pem(用戶私鑰證書)
· public_cert.pem(用戶公鑰證書)
3、 packages 文件夾下文件說明 :
· fabric-sdk-py-master.zip (fabric官方py庫包,需解壓后手動安裝到python第三方庫中 )
4、logs 文件夾下存放日志文件。
流程說明:
1、 用戶在客戶端(web頁面)填寫上鏈信息
2、 進入相應的方法,獲取用戶填寫的上鏈信息,并且判斷輸入信息不可為空
3、 拼接待簽名的字符串,對字符串使用用戶私鑰證書進行 SHA256WITHECDSA 簽名加密(調(diào)用myecdsa256下的ecdsa_sign方法生成base64格式的mac值)
4、 發(fā)起post請求,并且附加HTTPS證書
5、 獲取返回報文中的mac值,對返回報文中的mac值,使用網(wǎng)關的公鑰證書進行驗簽,驗簽內(nèi)容與傳參時簽名字符串相同
6、 若驗簽成功,則將鏈上返回報文處理后,顯示到web頁面中
詳細說明
發(fā)起請求(以添加數(shù)據(jù)save為例)