做者:修蓬榮、曹國波java
《使用BSN 一天學會區塊鏈開發》系列文章能夠幫助具備必定開發經驗的開發者,在不須要學習區塊鏈開發語言的狀況下,在區塊鏈服務網絡(BSN)上完成區塊鏈應用的開發。node
本文主要介紹用戶如何經過鏈下業務系統使用Python語言與鏈上數據進行交互而進行的相關操做流程說明,但在說明鏈下業務系統與鏈上進行數據交互以前,首先對用戶如何在區塊鏈服務門戶註冊、應用發佈服務、應用服務參與以及應用管理進行一一說明。python
註冊和登陸golang
打開區塊鏈服務網絡網址:www.bsnbase.com, 點擊登陸頁面中的【內測申請】按鈕進入內測申請頁: web
根據頁面中的提示填寫內測申請信息並提交內測申請,內測申請用戶分爲我的用戶和企業用戶兩種,申請人應根據本身的用戶類型任選一種進行申請, 內測申請提交後需等待系統審覈,待系統審覈經過後將向申請者發送激活郵件,申請用戶可根據【激活郵件】中的激活連接來激活帳, 賬戶激活後便可登陸系統使用。算法
應用服務發佈數據庫
應用服務是指在區塊鏈服務網絡中已經發布並運行的區塊鏈應用,用戶能夠經過服務網絡門戶發佈本身的區塊鏈應用服務,應用服務分爲公開和非公開兩種(內測期間發佈的服務默認爲非公開,如需公開服務需提交公開申請,後臺運營人員進行審覈,只有審覈經過後服務纔可在服務門戶的應用商店中進行查看),此處就不一一截圖了,就概述一下應用服務發佈總體流程:bootstrap
應用服務參與api
在服務網絡內測期間,全部發布的服務均爲非公開,若是本身或其餘用戶想要參與已經發布的服務,可經過在我發佈的應用->我發佈的服務列表中邀請參與者,將邀請參與者的連接地址發給須要參與服務的用戶,應用參與服務總體流程以下:數組
應用管理
應用服務發佈之後,可進入我發佈的應用->我發佈的服務管理列表中對已經發布的服務進行統一管理,管理列表具體包含如下功能:
應用鏈碼開發
鏈碼(ChainCode)又稱爲智能合約,是用計算機語言描述合約條款、交易的條件、交易的業務邏輯等,經過調用智能合約實現交易的自動執行和對帳本數據的操做。一個區塊鏈應用能夠部署多個鏈碼,每一個鏈碼包含多個方法。
鏈碼支持多種語言編寫,包括golang、java、node.js。每一個鏈碼程序都必須實現Chaincode接口,鏈碼包含:Init ,Invoke,Query三個基本操做:
下面以通用數據鏈碼包爲例詳細說明一下。
通用數據鏈碼包是咱們爲應用開發者提供對業務數據進行增刪改查基本操做的鏈碼(Golang語言編寫)。應用開發者能夠在此鏈碼包的基礎上根據應用業務需求進一步拓展鏈碼功能。此鏈碼支持存儲的數據類型有字符串、整型、浮點型、集合(map、list)等等。
鏈碼包下載地址: www.bsnbase.com/static/base/BaseChainCode.zip
1.鏈碼包功能以下:
1.1.增長數據(set)
輸入參數說明
baseKey:須要保存的惟一的主鍵標識,baseValue:保存的數據信息
例:{"baseKey":"str","baseValue":"thisis string"}
注:其中baseKey是不能爲空的字符串,baseValue能夠是任意類型的數據。若是baseKey已經存在,則直接返回已經存在,不能添加;若是不存在,則添加數據。
1.2. 修改數據(update)
輸入參數說明
baseKey:須要修改的惟一的主鍵標,baseValue:保存的數據信息
例:{"baseKey":"str","baseValue":"thisis string"}
注:其中baseKey是不能爲空的字符串,baseValue能夠是任意類型的數據。若是baseKey不存在,則沒法更新,若是已經存在,則修改數據。
1.3. 刪除數據(delete)
輸入參數說明
baseKey:須要刪除的惟一的主鍵標識的值
例:"str"
注:其中baseKey的值不能爲空,且必須存在,不然將沒法刪除。
1.4. 獲取數據(get)
輸入參數說明
baseKey:須要獲取的惟一的主鍵標識的值
例:"str"
注:其中baseKey的值不能爲空,且必須存在,不然將沒法獲取到相應的信息。
2.鏈碼介紹
2.1.Init方法
這個就是最簡單的鏈碼初始化功能,寫日誌、初始化一條數據、保存到數據庫、響應。
建議在鏈碼初始化(Init)的時候,不要有太多的業務操做。
2.2. Invoke
stub.GetFunctionAndParameters():獲取請求的方法名稱(string)和參數信息([]string)
return t.set(stub, args)//調用保存的方法,具體的業務處理
節點網關
節點網關是部署在各個城市節點,接收應用系統的請求,使用託管的用戶身份信息,向相應的應用鏈碼發起訪問並返回鏈碼的執行結果。節點網關的調用是經過向區塊鏈服務的各個城市節點的網關服務發送HTTP請求來實現。節點網關負責驗證用戶身份信息、應用信息,經過用戶身份信息和應用信息以及須要訪問的鏈碼、鏈碼方法來傳遞鏈碼參數、獲取鏈碼執行結果的服務通道。
業務系統須要按照接口說明在請求中加入相應的請求參數,調用節點網關之後,節點網關會返回鏈碼的執行結果。
接口地址:https://節點網關地址/api/node/reqChainCode
注:用戶參與服務成功後能夠在服務詳情頁面查看並下載應用鏈下業務系統開發所須要的應用服務配置參數、節點網關地址和應用身份證書,以下圖:
通信方式:POST
簽名算法:
一、將userCode+appCode+ chainCode+ funcName的值以及args中每一項數據拼接成字符串A;
二、對字符串A使用用戶證書的私鑰進行SHA256WITHECDSA簽名。
請求參數
響應參數
數據交互
應用服務參與審覈經過以後,鏈下業務系統就能夠經過節點網關與鏈上數據進行數據交互,調用節點網關須要節點網關接入地址、節點網關請求參數以及證書等信息,此部分數據能夠經過我參與的應用->我參與的->查看明細頁面進行獲取,下面對這三方面的參數進行一一說明;
userCode:應用發佈者或者參與者的登陸名(也就是登陸門戶的用戶名)。
appCode:參與應用的惟一標識。應用建立時,系統自動生成的惟一標識。
tid:用戶與參與的應用之間關聯的惟一標識。
chainCode:區塊鏈服務網絡中,運維部署的鏈碼的名稱。須要注意的是,這裏的鏈碼名稱不是服務發佈時的鏈碼名稱。
funcName:調用鏈碼的方法名稱。
agrs:調用鏈碼方法的參數集合。字符串類型的數組,參與者須要與應用發佈者聯繫,獲取方法對應的參數。
參數獲取頁面以下圖所示:
https請求證書:爲保障數據傳輸層的安全,須要使用https請求。
請求報文簽名證書:用戶私鑰證書。
響應結果驗簽證書:網關公鑰證書。
用戶身份證書的下載能夠經過我參與的應用->我參與的->查看->接入的城市節點部分進行下載,也能夠經過進入個人身份證書-證書查看列表中找到對應的應用信息,進行證書下載。下載的證書文件包含https證書、用戶證書(私鑰證書、公鑰證書(網關對報文的驗籤))、網關證書(網關公鑰證書)。證書下載頁面以下圖所示
業務系統開發
業務系統就是鏈下業務系統,須要與鏈上進行數據交互的系統,下面根據預置鏈碼包的Python開發實例(可從門戶下載)着重說一下與網關交互的說明。
項目環境準備:
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
注:可根據requirements.txt文件自動安裝依賴
項目介紹:
上圖爲項目的目錄結構:
該項目使用Python-Django框架,直接調用服務網關api接口,實現數據交互:
一、 common文件夾下文件說明:
* myecdsa256.py(橢圓曲線 SHA256WITHECDSA 簽名方法和驗籤方法)
* loggers.py(日誌方法)
二、 certificate文件夾下文件說明(下載用戶證書zip包獲取):
* bsn_https.pem(https請求的公鑰證書)
* gateway_public_cert.pem(網關公鑰證書)
* private_key.pem(用戶私鑰證書)
* public_cert.pem(用戶公鑰證書)
三、 packages文件夾下文件說明:
* fabric-sdk-py-master.zip (fabric官方py庫包,需解壓後手動安裝到python第三方庫中 )
四、 logs文件夾下存放日誌文件。
流程說明:
一、 用戶在客戶端(web頁面)填寫上鍊信息
二、 進入相應的方法,獲取用戶填寫的上鍊信息,而且判斷輸入信息不可爲空
三、 拼接待簽名的字符串,對字符串使用用戶私鑰證書進行 SHA256WITHECDSA 簽名加密(調用myecdsa256下的ecdsa_sign方法生成base64格式的mac值)
四、 發起post請求,而且附加HTTPS證書
五、 獲取返回報文中的mac值,對返回報文中的mac值,使用網關的公鑰證書進行驗籤,驗籤內容與傳參時簽名字符串相同
六、 若驗籤成功,則將鏈上返回報文處理後,顯示到web頁面中
詳細說明
發起請求(以添加數據save爲例)