LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资讯 > 使用BSN一天学会区块链开发-golang篇

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

2019-12-11 高山168 来源:区块链网络

使用BSN一天学会区块链开发-golang篇 | 火星技术帖



作者: 时跃堂,曹国波


《使用BSN 一天学会区块链开发》系列文章可以帮助具有一定开发经验的开发者,在不需要学习区块链开发语言的情况下,在区块链服务网络(BSN)上完成区块链应用的开发。


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


注册和登录


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




根据页面中的提示填写内测申请信息并提交内测申请,内测申请用户分为 个人用户和 企业用户两种,申请人应根据自己的用户类型任选一种进行申请, 内测申请提交后需等待系统审核,待系统审核通过后将向申请者发送激活邮件,申请用户可根据【激活邮件】中的激活链接来激活账, 帐户激活后即可登录系统使用。


应用服务发布


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


登录区块链服务门户以后,进入 我发布的应用->我发布的服务页面;

点击 创建新服务按钮,进入创建新服务页面,根据提示输入相应的信息;

点击下一步按钮开始上传链码包(上传链码包可以使用自己开发的链码包或直接使用服务网络提供的预制链码包),再定义服务功能及角色(表示链下业务系统调用链码所对应的权限)、选择发布的城市节点(表示当前发布的服务所对应的链码部署在哪些城市节点)、付费周期以及是否使用云服务等信息;

继续点击 下一步按钮,进入到 设置接入方式页面,输入网站地址、移动终端接入以及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


签名算法:


1、将userCode+ appCode+ chainCode+ funcName的值以及args中每一项数据拼接成字符串A;


2、对字符串A使用用户证书的私钥进行SHA256WITHECDSA签名。


请求参数




响应参数




数据交互


应用服务参与审核通过之后,链下业务系统就可以通过节点网关与链上数据进行数据交互,调用节点网关需要节点网关接入地址、节点网关请求参数以及证书等信息,此部分数据可以通过 我参与的应用-> 我参与的->查看明细页面进行获取,下面对这三方面的参数进行一一说明;


节点网关接入地址:为链下业务系统调用链上所对应的城市节点入口,所有与链上的数据交互都是通过此地址进行访问,如下图所示:



节点网关请求参数:如果需要通过节点网关接入地址与链上进行数据交互,肯定需要按照节点网关接口调用规范,节点网关接口调用需要userCode、appCode、tid、chainCode、funcName、agrs等参数信息,下面对相关参数进行概要说明。

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


*appCode : 参与应用的唯一标识。应用创建时,系统自动生成的唯一标识。


*tid : 用户与参与的应用之间关联的唯一标识。


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


*funcName : 调用链码的方法名称。


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


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




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

*https 请求证书 :为保障数据传输层的安全,需要使用https请求。


*请求报文签名证书: 用户私钥证书。


*响应结果验签证书: 网关公钥证书。


用户身份证书的下载可以通过我参与的应用->我参与的->查看->接入的城市节点部分进行下载,也可以通过进入我的身份证书-证书查看列表中找到对应的应用信息,进行证书下载。下载的证书文件包含https证书、用户证书(私钥证书、公钥证书(网关对报文的验签))、网关证书(网关公钥证书)。证书下载页面如下图所示






业务系统开发


业务系统就是链下业务系统,需要与链上进行数据交互的系统,下面根据预置链码包的golang开发实例(可从门户下载)着重说一下与网关交互的说明。


项目环境准备:


1 、JetBrains GoLand/VS Code(可以使用您习惯的IDE)


2 、Go 1.12.5


项目介绍:




上图为项目的目录结构:


1. Certs:主要用于存放用户的公私证书、网关的公钥证书以及请求网关时所需要的Https公钥证书


bsngate_https.crt:节点网关API的Https公钥证书(用于对请求网关API地址所需加载的公钥证书)

gateway_public_cert.crt:网关公钥证书(用于对网关响应的数据采用椭圆曲线算法进行验签)

private_key.pem:用户私钥证书(用于对请求网关的数据采用椭圆曲线算法进行签名)

public_cert.pem:用户公钥证书(目前没有用到)

2. common:主要用于存放公共库,本示例中用于对ecdsa椭圆曲线算法工具类进行定义


ecdsa.go:用于对ecdsa椭圆曲线算法工具类进行定义

3. model :主要用于对请求网关和网关的响应报文数据结构进行定义


request.go :用于对请求节点网关API的数据报文进行定义

response.go:用于对节点网关API响应的数据报文进行定义

4. main.go:main文件是示例程序的入口以及包含调用节点网关API的相关业务逻辑代码。


流程说明:

硬核科普:掌握数字资产投资的风险管理技巧

如果有人告诉你,相比于您被自己心爱的小狗偶尔不小心咬伤致死,其实您被雷击致死的概率更小,您会相信吗?如国家安全委员会所显示,人一生中死于狗咬的机率是1:112,400,而死于雷击的机率是1:161,856。尽管雷击看起来可能更致命,但实际情况却更为复杂。让我们看看其中原因。


1656年,法国数学家布莱斯·帕斯卡尔(Blaise Pascal)在一封名为“Gambler’s Ruin”的信中首次讨论到的一个基本的统计概念告诉我们,不断暴露于危险事件的可能性可能会改变我们对单个事件的认知。我们一生中更容易接触狗,这一事实使狗咬最终比雷击更为致命(除非您是利用气象超能力与超级反派作战的X战警成员)。


Gambler’s Ruin(又被称为赌徒破产理论)在单个事件的概率与最终事件的概率之间提供了统计联系。这个概念是交易的基础之一。在这种概率游戏中,无论我们是否意识到,我们的策略是获胜还是失败总是存在一种概率。因此,我们使用的策略是有可能导致破产的。但是破产会如何发生?或者说何时才会发生?更重要的是,在知道这些问题的答案后我们又能做些什么?


由贝尔实验室的科学家 John L Kelly Jr. 于1961年发明的著名凯利公式可以帮助我们找到这些问题的答案。


一个简单的抛硬币游戏

让我们设想一个简单的抛硬币游戏。 如果掷出正面(H ),则投注者将获得全部投注,否则,如果掷出反面(T ),则投注者失去全部赌注。 设结果 H 的概率为p , T 的概率为 q = 1- p 。 现在假设我们有一个 p > 0.5 的不公平硬币,这意味着抛掷出 H 的可能性比 T 高 。 每次抛掷的奖励 ? 是一个随机变量,


硬核科普:掌握数字资产投资的风险管理技巧


其中 ? + 和 ? – 分别代表获胜和亏损的下注倍数。 让我们先假设每掷一次都是赢了或是输了全部赌注,即? + = 1和? – = -1。


抛硬币的回报 R 的期望值为

硬核科普:掌握数字资产投资的风险管理技巧


那玩家应该每次下注多少呢? 假设 C0 是玩家的初始资产(或金额),并且他/她每次都下注资产的某部分 f 。 经过 N 次下注后,最终净值 C N 为

硬核科普:掌握数字资产投资的风险管理技巧


最佳赌注大小的推导 – 凯利赌注

让我们研究上述简单抛硬币游戏的最佳下注大小。第一个问题是,我们想要实现什么样的最优化?在本文中,我们希望最大化预期的长期增长率,即每次独立抛掷的平均对数回报。我们希望以使 E [log(1+ f? )] 为最大化的方式选择 f 。因为


硬核科普:掌握数字资产投资的风险管理技巧


将上述表达式的一阶导数设置为 0 并对其进行求解,得出 f = 2 p ?1。这是实现最大预期长期增长的赌注大小。 我们将其称为凯利赌注 fKelly = 2 p ? 1。


凯利赌注对于任何? +和?– 的一般形式可以同样的推导为


硬核科普:掌握数字资产投资的风险管理技巧


投币游戏的实现与模拟

我们根据上述规则以 CoinTossGame 进行了仿真实验。


以下是实验模拟的参数:


win_rate: p 获胜的概率;


profit: ?+, 当结果对应于赢时的下注乘数;


loss: ?–, 当结果对应于损失时的下注乘数;


number_of_tosses: N, 游戏运行一次的抛掷次数;


number_of_runs: 游戏的运行次数;


bet_size: f:下注部分


starting_capital: C0:初始资产


以下每列代表一轮游戏,并显示当前游戏中资产的对数。


硬核科普:掌握数字资产投资的风险管理技巧


硬核科普:掌握数字资产投资的风险管理技巧


硬核科普:掌握数字资产投资的风险管理技巧


首先,我们用随机抛硬币的方式进行10 轮,每轮抛掷 30 次,其中获胜概率 p 为 70%,profit = 1,loss = -1。通过计算凯利赌注大小为 2 p ? 1 = 2·0.7 ? 1 = 40% 或 0.4。


硬核科普:掌握数字资产投资的风险管理技巧


过度下注,下注不足和凯利下注的特征

我们模拟多次重复下注,并看看不同下注大小所得的资产特征。我们将分别模拟过度下注,下注不足和凯利下注的情况。


过度下注


现在,我们将模拟下注码数超出理想下注的情况,以看看此下注模式对最终净值的影响。首先,让我们仿真1000 条资产曲线,每一条曲线来自下注大小为 80%(这是我们最佳凯利下注 (40%) 的两倍)的100 次抛掷。


硬核科普:掌握数字资产投资的风险管理技巧


硬核科普:掌握数字资产投资的风险管理技巧


硬核科普:掌握数字资产投资的风险管理技巧


我们可以看到,在游戏运行多次之后,过高的赌注更有可能导致破产。原因是连续亏损的可能性总是存在的,在这种情况下,过度下注只会使资产净值几何级下降。


下注不足


接下来,我们以下注大小为 20%模拟100次抛掷的1000条资产曲线,这是我们40%凯利下注的一半。 在这种情况下,我们下注不足。


硬核科普:掌握数字资产投资的风险管理技巧


硬核科普:掌握数字资产投资的风险管理技巧


硬核科普:掌握数字资产投资的风险管理技巧


正如我们所观察到的,在下注时,相对较多次的模拟会下得到不错的最终资产。但是,由于我们下注不足,这意味着我们正在过分安全地进行游戏,也同时意味着我们的资金增长率会受到限制。


凯利投注


最后,我们仿真1000条资产曲线,每一条曲线来自凯利下注的100次抛掷。


硬核科普:掌握数字资产投资的风险管理技巧


硬核科普:掌握数字资产投资的风险管理技巧


可以看到,通过凯利下注,我们可以实现最佳结果。


过度下注、下注不足和凯利下注的最终资产分布

下图显示了最终资产的(对数标度)分布,分别为过度下注,下注不足和凯利下注。


硬核科普:掌握数字资产投资的风险管理技巧


上图显示,即使我们单次获胜率较高(70%),在过度下注的情况下,由于可能发生的连续损失会几何性的减少我们的资产,这很可能导致我们在多次下注之后破产。


投注不足时,我们破产的机会较小,但我们无法优化资产增长。


通过凯利投注,我们拥有最高的预期长期增长率(即预期的最终对数资产),但与投注不足的情况相比,最终资产更分散地聚集在正区域附近。


非对称关系 – 应用(半)凯利以更好地调整赌注大小

让我们针对不同的下注大小重复上述模拟过程,以便我们可以观察到预期长期增长率与下注大小的详细变化。 这次,我们将模拟1000次投掷1000次,起始资本= 100。


硬核科普:掌握数字资产投资的风险管理技巧


硬核科普:掌握数字资产投资的风险管理技巧


让我们绘制预期的长期增长率与下注大小的关系。


硬核科普:掌握数字资产投资的风险管理技巧


硬核科普:掌握数字资产投资的风险管理技巧


我们可以清楚地看到赌注大小和增长率之间的不对称关系。根据定义,预期的长期增长率将通过凯利投注最大化。只要下注的大小超过凯利,长期预期增长率就会下降得更快,而下注不足则不会导致太严重的结果。不论单次获胜概率如何,这种不对称关系都是存在的。


硬核科普:掌握数字资产投资的风险管理技巧


凯利赌注大小 f Kelly 是产生最大预期长期增长率的最佳赌注大小。现在我们了解到,如果投注者以大于凯利作下注,那么他或她很可能会被淘汰。我们还可以看到,过分安全行事并不是一个坏主意,因为它仍然会带来相对积极的结果。


这引起了我们的注意,即使我们以70%的胜率下注,如果我们过度下注,我们最终可能会在连续亏损的情况下破产。这个原理甚至适用于难以预测的游戏。


在交易中的潜在应用

在量化交易中,我们不可避免地假设过去的事情会为我们提供信息,以便我们在将来做出更好的决策。策略回测可以帮助我们确定策略收益的概率分布。


然而,我们必须确保上述的分布足够稳定以获得可靠的凯利公式计算。一种方法是使用移动窗口方法动态地估计概率分布。使用高斯方法可以很容易地估计抛硬币的结果,但是金融市场的预测更具挑战性。


我们必须记住金融市场要比简单的抛硬币游戏要复杂得多。在金融市场中,价格不会随机波动。价格回报分布通常是高度偏斜,并且这些分布的参数对于模型构建而言不够稳定(或统计上不稳定)。


结论

为了在不确定的情况下取得最佳表现,我们必须对概率有所了解,因为这有助于我们通过理解和运用凯利公式来估算最实际的策略。


即使您对自己在游戏中的优势充满信心,在这个概率的世界中您需要做好破产的准备,特别是当您面临更大风险的时候。


本页面由【支点】排版引擎优化,未改动原文。

1. 修改调用网关所对应的请求参数


2. 拼接待签名的字符串,对字符串使用用户私钥证书进行 SHA256WITHECDSA 签名加密(调用ecdsa.go下的SignECDSA方法进行签名,并生成base64格式的mac值)


3. 发起post请求,并且附加HTTPS证书


4. 获取返回报文中的mac值,对返回报文中的mac值,使用网关的公钥证书进行验签,验签内容与传参时签名字符串。


—-

编译者/作者:高山168

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...