使用BSN一天学会区块链开发-python篇

做者:修蓬荣、曹国波java

《使用BSN 一天学会区块链开发》系列文章能够帮助具备必定开发经验的开发者,在不须要学习区块链开发语言的状况下,在区块链服务网络(BSN)上完成区块链应用的开发。node

本文主要介绍用户如何经过链下业务系统使用Python语言与链上数据进行交互而进行的相关操做流程说明,但在说明链下业务系统与链上进行数据交互以前,首先对用户如何在区块链服务门户注册、应用发布服务、应用服务参与以及应用管理进行一一说明。python

注册和登陆golang

打开区块链服务网络网址:www.bsnbase.com, 点击登陆页面中的【内测申请】按钮进入内测申请页: web

根据页面中的提示填写内测申请信息并提交内测申请,内测申请用户分为我的用户企业用户两种,申请人应根据本身的用户类型任选一种进行申请, 内测申请提交后需等待系统审核,待系统审核经过后将向申请者发送激活邮件,申请用户可根据【激活邮件】中的激活连接来激活帐, 账户激活后便可登陆系统使用。算法

应用服务发布数据库

应用服务是指在区块链服务网络中已经发布并运行的区块链应用,用户能够经过服务网络门户发布本身的区块链应用服务,应用服务分为公开和非公开两种(内测期间发布的服务默认为非公开,如需公开服务需提交公开申请,后台运营人员进行审核,只有审核经过后服务才可在服务门户的应用商店中进行查看),此处就不一一截图了,就概述一下应用服务发布总体流程:bootstrap

  • 登陆区块链服务门户之后,进入我发布的应用->我发布的服务页面;
  • 点击建立新服务按钮,进入建立新服务页面,根据提示输入相应的信息;
  • 点击下一步按钮开始上传链码包(上传链码包可使用本身开发的链码包或直接使用服务网络提供的预制链码包),再定义服务功能及角色(表示链下业务系统调用链码所对应的权限)、选择发布的城市节点(表示当前发布的服务所对应的链码部署在哪些城市节点)、付费周期以及是否使用云服务等信息;
  • 继续点击下一步按钮,进入到设置接入方式页面,输入网站地址、移动终端接入以及API服务接入等信息(接入方式均为链下接入的相关信息),若是暂时不须要设置接入方式,可跳过此页面继续点击下一步按钮,进入服务帐单页面进行肯定(服务网络内测其间,全部资源均无偿使用)
  • 点击肯定后,在我发布的应用->我发布的服务列表页面能够看到该条新建立的服务,且该服务的状态为“待初审”状态,发布者需等待运营和运维人员进行审核和发布,服务发布后发布者默认不参与服务。

应用服务参与api

在服务网络内测期间,全部发布的服务均为非公开,若是本身或其余用户想要参与已经发布的服务,可经过在我发布的应用->我发布的服务列表中邀请参与者,将邀请参与者的连接地址发给须要参与服务的用户,应用参与服务总体流程以下:数组

  • 根据邀请的连接地址,进入服务信息页面,点击申请参与应用按钮,进入服务角色及城市节点选择页面;
  • 选择须要使用的服务角色和城市节点(角色是指用户参与服务后链下业务系统访问链上所对应的权限;城市节点是指用户的链下业务系统经过该城市节点与链上进行数据交互)。用户选择服务角色之后,系统会显示角色对应的功能使用费,选择城市节点的时候申请新证书或选择已有的证书。
  • 点击肯定按钮,提示接入城市节点、接入方式以及费用信息:
  • 确认参与服务的接入城市节点、接入方式以及费用信息(内测期间,全部资源均免费)后,在我参与的应用->我参与的列表页面能够查看到所参与的应用服务,该应用服务的状态为待发布者审核,等待应用服务的发布者对参与者进行审核。
  • 服务网络内测期间只要发布者对服务参与申请审核经过后,服务参与信息的状态更新为已确认。至此,参与应用服务成功。
  • 应用服务参与成功之后,链下业务系统就能够调用城市节点所对应的节点网关,将数据推送上链和从获取上链数据以及链上区块信息,调用节点网关所对应的参数可进入我参与的服务->我参与的->查看->接入的城市节点和服务接入配置参数部分进行查看,接入的城市节点用于接入的城市节点证书进行下载以及城市节点网关的调用地址进行展现,应用服务接入配置参数用于对链下业务系统调用城市节点网关的相关参数进行展现,此部分的细节描述参考“数据交互”部分

应用管理

应用服务发布之后,可进入我发布的应用->我发布的服务管理列表中对已经发布的服务进行统一管理,管理列表具体包含如下功能:

  • 邀请参与者:主要用于将应用参与的邀请连接地址发给其它用户,其它用于能够经过此邀请连接地址参与此服务;
  • 申请公开:主要是内测期间,全部发布的服务默认均为非公开,若是须要将服务公开,则能够经过此功能提交公开申请;
  • 服务升级:主要用于对应用服务的链码包进行升级;
  • 配置升级:主要用于对应用服务的配置资源进行升级,如部署的城市节点以及节点的资源的配置信息;
  • 历史版本:主要用于对服务升级之后的历史版本进行查询;
  • 运行信息:主要用于对应用服务的部署节点以及节点资源信息和链上数据(来源于链下业务系统经过调用节点网关接口将数据推送上链)进行监控;
  • 设置接入方式:主要用于对应用服务的链下业务系统的接入进行配置;
  • 查看:主要用于对应用服务的基本信息、链码及部署信息、服务角色信息、审批记录信息以及接入方式等信息进行查看。

应用链码开发

链码(ChainCode)又称为智能合约,是用计算机语言描述合约条款、交易的条件、交易的业务逻辑等,经过调用智能合约实现交易的自动执行和对帐本数据的操做。一个区块链应用能够部署多个链码,每一个链码包含多个方法。

链码支持多种语言编写,包括golang、java、node.js。每一个链码程序都必须实现Chaincode接口,链码包含:Init ,Invoke,Query三个基本操做:

  • Init 链码初始化的方法,在链码实例化或者升级的时候调用一次,以便链码能够执行任何须要的 初始化,包括应用程序状态的初始化。
  • Invoke接收和处理链下业务系统调用事务处理提案,其参数包含调用的链码程序中函数的名称和具体业务处理数据参数。即在Invoke中根据不一样的方法参数调用其余分支处理响应的业务。Invoke能够简单的理解为链码方法的入口。
  • Query提供查询链码数据的方法,该方法只做为查询使用,不提供操做链上数据的操做。可在Query操做时调用,亦可在Invoke方法中做为某些方法的分支被调用。该方法能够不实现。

下面以通用数据链码包为例详细说明一下。

通用数据链码包是咱们为应用开发者提供对业务数据进行增删改查基本操做的链码(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等参数信息,下面对相关参数进行概要说明。

userCode应用发布者或者参与者的登陆名(也就是登陆门户的用户名)。

appCode参与应用的惟一标识。应用建立时,系统自动生成的惟一标识。

tid用户与参与的应用之间关联的惟一标识。

chainCode区块链服务网络中,运维部署的链码的名称。须要注意的是,这里的链码名称不是服务发布时的链码名称。

funcName调用链码的方法名称。

agrs调用链码方法的参数集合。字符串类型的数组,参与者须要与应用发布者联系,获取方法对应的参数。

参数获取页面以下图所示:

  • 节点用户证书:在请求节点网关过程当中须要https证书、请求报文签名证书(即用户身份证书)和响应结果验签证书。

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为例)

相关文章
相关标签/搜索