做者:修蓬荣、曹国波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为例)