免责声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。
小编:记得关注哦
来源:区块链服务网络BSN
作者: 时跃堂,曹国波
《使用BSN 一天学会区块链开发》系列文章可以帮助具有一定开发经验的开发者,在不需要学习区块链开发语言的情况下,在区块链服务网络(BSN)上完成区块链应用的开发。
本文主要介绍用户如何通过链下业务系统使用golang语言与链上数据进行交互而进行的相关操作流程说明,但在说明链下业务系统与链上进行数据交互之前,首先对用户如何在区块链服务门户注册、应用发布服务、应用服务参与以及应用管理进行一一说明。
注册和登录
打开区块链服务网络网址:www.bsnbase.com,点击登录页面中的【内测申请】按钮进入内测申请页:
根据页面中的提示填写内测申请信息并提交内测申请,内测申请用户分为 个人用户和企业用户两种,申请人应根据自己的用户类型任选一种进行申请, 内测申请提交后需等待系统审核,待系统审核通过后将向申请者发送激活邮件,申请用户可根据【激活邮件】中的激活链接来激活账, 帐户激活后即可登录系统使用。
应用服务发布
应用服务是指在区块链服务网络中已经发布并运行的区块链应用,用户可以通过服务网络门户发布自己的区块链应用服务,应用服务分为公开和非公开两种 (内测期间发布的服务默认为非公开,如需公开服务需提交公开申请,后台运营人员进行审核,只有审核通过后服务才可在服务门户的应用商店中进行查看),此处就不一一截图了,就概述一下应用服务发布整体流程:
应用服务参与
在服务网络内测期间,所有发布的服务均为非公开,如果自己或其他用户想要参与已经发布的服务,可通过在 我发布的应用->我发布的服务列表中邀请参与者,将邀请参与者的链接地址发给需要参与服务的用户,应用参与服务整体流程如下:
应用管理
应用服务发布以后,可进入 我发布的应用->我发布的服务管理列表中对已经发布的服务进行统一管理,管理列表具体包含以下功能:
应用链码开发
链码(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
签名算法:
1、将userCode+ appCode+ chainCode+ funcName的值以及args中每一项数据拼接成字符串A;
2、对字符串A使用用户证书的私钥进行SHA256WITHECDSA签名。
请求参数
响应参数
数据交互
应用服务参与审核通过之后,链下业务系统就可以通过节点网关与链上数据进行数据交互,调用节点网关需要节点网关接入地址、节点网关请求参数以及证书等信息,此部分数据可以通过 我参与的应用->我参与的->查看明细页面进行获取,下面对这三方面的参数进行一一说明;
*userCode:应用发布者或者参与者的登录名(也就是登录门户的用户名)。
*appCode:参与应用的唯一标识。应用创建时,系统自动生成的唯一标识。
*tid:用户与参与的应用之间关联的唯一标识。
*chainCode:区块链服务网络中,运维部署的链码的名称。需要注意的是,这里的链码名称不是服务发布时的链码名称。
*funcName:调用链码的方法名称。
*agrs:调用链码方法的参数集合。字符串类型的数组,参与者需要与应用发布者联系,获取方法对应的参数。
参数获取页面如下图所示:
*https请求证书:为保障数据传输层的安全,需要使用https请求。
*请求报文签名证书:用户私钥证书。
*响应结果验签证书:网关公钥证书。
用户身份证书的下载可以通过我参与的应用->我参与的->查看->接入的城市节点部分进行下载,也可以通过进入我的身份证书-证书查看列表中找到对应的应用信息,进行证书下载。下载的证书文件包含https证书、用户证书(私钥证书、公钥证书(网关对报文的验签))、网关证书(网关公钥证书)。证书下载页面如下图所示
业务系统开发
业务系统就是链下业务系统,需要与链上进行数据交互的系统,下面根据预置链码包的golang开发实例(可从门户下载)着重说一下与网关交互的说明。
项目环境准备:
1、JetBrains GoLand/VS Code(可以使用您习惯的IDE)
2、Go 1.12.5
项目介绍:
上图为项目的目录结构:
1. Certs:主要用于存放用户的公私证书、网关的公钥证书以及请求网关时所需要的Https公钥证书
2. common:主要用于存放公共库,本示例中用于对ecdsa椭圆曲线算法工具类进行定义
3. model :主要用于对请求网关和网关的响应报文数据结构进行定义
4. main.go:main文件是示例程序的入口以及包含调用节点网关API的相关业务逻辑代码。
流程说明:
1. 修改调用网关所对应的请求参数
2. 拼接待签名的字符串,对字符串使用用户私钥证书进行 SHA256WITHECDSA 签名加密(调用ecdsa.go下的SignECDSA方法进行签名,并生成base64格式的mac值)
3. 发起post请求,并且附加HTTPS证书
4. 获取返回报文中的mac值,对返回报文中的mac值,使用网关的公钥证书进行验签,验签内容与传参时签名字符串相同
5. 并将验证结果输出到控制台
详细说明