二十分钟教你如何将区块链应用与函数计算相结合

前言

本篇文章适合对区块链应用感兴趣或是想要通过函数计算服务进一步开发区块链应用的新人。本文将结合阿里云区块链服务、阿里云函数计算服务、阿里云日志服务 以及社区应用 Marbles,手把手教大家如何将阿里云区块链服务与阿里云函数计算服务相结合,并进一步提供业务上的结合场景,供大家开拓思路。

本文分为以下几部分:

  • 函数计算与区块链
  • Marbles 区块链应用介绍
  • Marbles 区块链应用结合函数计算进行扩展示例
  • 区块链应用与函数计算在业务上结合的场景与价值探讨

函数计算与区块链

函数计算

函数计算是事件驱动的全托管计算服务。使用函数计算,无需采购与管理服务器等基础设施,只需编写并上传代码。函数计算为用户准备好计算资源,弹性地可靠地运行任务,并提供日志查询、性能监控和报警等功能。借助函数计算,可以快速构建任何类型的应用和服务,并且只需为任务实际消耗的资源付费。

下图为函数计算工作流程:

区块链

区块链可以理解为去中心的分布式记账系统,其是一种 分布式、去中心化的计算与存储架构 。区块链通过某种方式来记录数据,使用户可以信任区块链系统记录的数据。区块链中的记账节点会按照一致性协议记账。记账节点愿意按照一致性协议记账,是因为在一致性协议的设计中,诚实的记账节点会得到相应的奖赏,且诚实的记录比恶意篡改记录的收益更大。

依托于区块链网络的可信度,衍生出了智能合约的概念。什么是智能合约呢?现实生活中,买家与卖家要进行一笔交易,为了保证交易的顺利进行,双方会签订一份合约,合约中会声明双方各自的身份、权利以及义务。当交易出现纠纷时,买家与卖家根据当时签订的合约通过法律的手段解决纠纷。这种方式的不足之处在于解决纠纷的过程需要第三方权威来仲裁以及需要大量时间。那么,假使我们现在有一位可信公正的交易代理人。卖家将商品交给代理人,买家与代理人双方之间一手交钱一手交货。若买家拒绝购买,代理人会将商品归还给买家。买家也不会付了钱拿不到商品。智能合约就可以充当这样的代理人,其为区块链上一个包含合约代码和存储空间的虚拟账户,合约的代码控制智能合约的行为,合约的账户存储合约的状态。

由于有了智能合约,DApp (Decentralized Application 即去中心化应用)也应运而生。DApp 是运行在区块链网络上的应用软件,其上运行的代码我们称之为智能合约。

Marbles 区块链应用介绍

Marbles 区块链应用是一个 资产转移 应用演示。在 Marbles 区块链应用中多个用户可以创建并相互转移弹珠。 ( 即弹珠就是资产转移中的资产 )

marbles

上图中:

  • Amy、Alice、Ava 所在的小长方形是她们每个人的账户
  • 小长方形中的圆形弹珠是每个人账户中的资产,弹珠的颜色和大小是资产的属性
  • 点击小长方形中的加号是为某个账户创建弹珠(资产)
  • 将某个小长方形中的弹珠拖拽到右上方的垃圾桶中,是为某个账户删除弹珠(资产)
  • 将某个弹珠从一个小长方形拖拽到到另一个小长方形,是弹珠(资产)的转移
  • 每一步的操作会在下方的 BLOCKS 创建一个新的小正方形,这个小正方形就代表包含交易内容的区块

Marbles 区块链应用代码分成三部分:

  1. 链码 - 区块链网络中,对等节点所运行的代码。链码在此次介绍的 Marbles 应用中的主要作用是处理创建以及转移弹珠的逻辑。
  2. 客户端 - 浏览器中运行的代码,负责 Marbles 应用页面的渲染与交互。
  3. 服务端 - 服务器中运行的代码,充当 Marbles 应用与区块链网络之间的桥梁,其与客户端以及区块链网络中运行着链码的节点进行通信。

在 Marbles 应用中,当客户端发送消息给服务端,服务端与区块链网络通信的时序图大体上如下图所示:( 读者对详细过程感兴趣,可以阅读 Github IBM-Blockchain/marbles )
其中,Peer 节点(对等节点) 存在于区块链网络中,拥有账本并且可安装链码。Orderer 节点负责接收包含签名的交易,对未打包的交易进行排序生成区块,广播给 Peer 节点。


上图中:Client 以及 Server 是上文中所说的客户端以及服务端。

  1. 当用户创建或转移弹珠时,Client 客户端触发相应事件,并向 Server 服务端发起请求。
  2. Server 接收到事件信息后,首先会构建提案(也就是交易),提案是将事件信息进行封装,比如:此次交易的两方以及交易内容是什么。
  3. Server 将构建好的提案发送给区块链网络中的一个 Peer 节点,由 Peer 节点来对提案进行模拟,校验其合法性。为什么要这么做呢?因为链码的作用就是处理交易逻辑,而链码安装在 Peer 节点上,并没有安装在 Server 上。
  4. 如果 Peer 节点模拟提案成功,认为其合法,则会对提案进行背书,并向 Server 返回背书后的提案。背书可以理解为,当我们去购买东西并忘记带现金,付给对方一张 别人 给的支票。对方怀疑支票不可兑现的时候,我们在支票上签字并表明若这张 他人 给的支票不能兑换,则可以来找我们要现金。这个签字的动作就是背书,声明对事物或被认可人的支持。
  5. Server 将背书后的提案发送给 Orderer 节点。
  6. Orderer 节点对提案进行排序并打包进区块,将区块广播给区块链网络中的所有 Peer 节点。

Marbles 区块链应用结合函数计算进行扩展示例

假设说,现在有这么一个业务场景,需要在每次 Marbles 应用有事件发生时,要对事件进行相应处理,且这部分的处理代码会 经常迭代 。那么,在区块链应用更新需要较多时间的情况下,通过函数计算来处理是较为方便的。( 具体缘由在下一节将会继续探讨 )

接下来,笔者将带着大家模拟这个业务场景,扩展 Marbles Server 端代码。在每次事件发生时,将事件信息打包并通过函数计算的 HTTP 触发器,由函数计算来对事件信息做相应处理。

1. 准备工作

开通阿里云日志服务、函数计算服务、区块链服务

2. 在阿里云区块链服务中创建组织、创建联盟

3. 在阿里云区块链服务中创建通道

  • 点击相应组织
  • 点击通道
  • 点击添加通道,填写名称与组织,并创建
  • 点击新创建的通道右侧的待审批链接,同意审批

4. 部署 Marbles 应用以及链码

参考 阿里云区块链服务开发指南
注意事项:nodejs 版本为 v8

5. 下载并配置阿里云函数计算开发工具 fun

  • fun 是一个 Node.js 编写的命令行工具,通过 npm 进行安装:$ npm install @alicloud/fun -g
  • 通过在命令行输入 fun config,根据提示依次配置 Account IDAccess Key IdAccess Key Secret 以及 Default Region Name。可参考:服务地址 、 创建 AccessKey
  • 配置 template.yml

在项目根目录下创建一个 template.yml 文件:

ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:marblesFC: # 服务名称Type: 'Aliyun::Serverless::Service'Properties:Description: 'fc test'LogConfig:  # 日志配置Project: test-log-project  # 日志 ProjectLogstore: test-log-store   # 日志 LogStoreprocessEvent: # 函数名Type: 'Aliyun::Serverless::Function'Properties:Handler: httpTrigger.handler # 文件名.方法名Runtime: nodejs8CodeUri: './'Timeout: 60Events:http-test: # 触发器名Type: HTTP # 触发器类型Properties:AuthType: ANONYMOUSMethods: ['GET', 'POST', 'PUT']test-log-project:  #  LogProject 名称Type: 'Aliyun::Serverless::Log'Properties:Description: 'just for test'test-log-store:    # LogStore 名称Type: 'Aliyun::Serverless::Log::Logstore'Properties:TTL: 10ShardCount: 1

上述文件做了如下事项:

  1. 在函数计算中创建了 marblesFC 服务
  2. 为 marblesFC 服务配置了 test-log-project 日志 Project 以及 test-log-store 日志 LogStore
  3. 在 marblesFC 服务中创建了 processEvent 函数,并为其设置入口函数为 httpTrigger.js 文件中的 handler 方法
  4. 为 processEvent 函数配置了 HTTP 触发器,触发器名为 http-test
  5. 创建了 test-log-project 日志 Project 以及 test-log-store 日志 LogStore
  • 在项目根目录下创建 httpTrigger.js 文件

var getRawBody = require('raw-body')
module.exports.handler = function (request, response, context) {// get request infogetRawBody(request, function (err, data) {var params = {path: request.path,queries: request.queries,headers: request.headers,method: request.method,body: data,url: request.url,clientIP: request.clientIP,}// you can deal with your own logic hereconsole.log(JSON.stringify(params.queries))// set responsevar respBody = new Buffer.from(JSON.stringify(params));// var respBody = new Buffer( )response.setStatusCode(200)response.setHeader('content-type', 'application/json')response.send(respBody)})
};
  • 在项目根目录下执行 fun deploy 进行部署
  • 在阿里云函数计算控制台中,进入到 marblesFC 服务下的 processEvent 函数,在代码执行页面记录下调用 HTTP 触发器的地址

6. 修改 Marbles Server 端代码

  1. 打开 Marbles 源代码根目录文件夹下的 app.js 文件
  2. 添加 var https = require('https'); https模块
  3. 修改 setupWebSocket 函数

  function setupWebSocket() {console.log('------------------------------------------ Websocket Up ------------------------------------------');wss = new ws.Server({ server: server }); // start the websocket nowwss.on('connection', function connection(ws) {// -- Process all websocket messages -- //ws.on('message', function incoming(message) {console.log(' ');console.log('-------------------------------- Incoming WS Msg --------------------------------');logger.debug('[ws] received ws msg:', message);var data = null;try {data = JSON.parse(message); // it better be json} catch (e) {logger.debug('[ws] message error', message, e.stack);}// --- [5] Process the ws message  --- //if (data && data.type == 'setup') { // its a setup request, enter the setup codelogger.debug('[ws] setup message', data);startup_lib.setup_ws_steps(data); // <-- open startup_lib.js to view the rest of the start up code} else if (data) { // its a normal marble request, pass it to the lib for processinghttps.get("此处填写触发 HTTP 触发器的 URL 地址?type="+data.type, function(res){console.log('test http trigger');});ws_server.process_msg(ws, data); // <-- the interesting "blockchainy" code is this way (websocket_server_side.js)}});// log web socket errorsws.on('error', function (e) { logger.debug('[ws] error', e); });// log web socket connection disconnects (typically client closed browser)ws.on('close', function () { logger.debug('[ws] closed'); });// whenever someone connects, tell them our app's statews.send(JSON.stringify(ws_server.build_state_msg())); // tell client our app state});// --- Send a message to all connected clients --- //wss.broadcast = function broadcast(data) {var i = 0;wss.clients.forEach(function each(client) { // iter on each connectiontry {logger.debug('[ws] broadcasting to clients. ', (++i), data.msg);client.send(JSON.stringify(data)); // BAM, send the data} catch (e) {logger.debug('[ws] error broadcast ws', e);}});};ws_server.setup(wss, null);}

7. 启动 Marbles

在控制台中进入 Marbles 项目,通过 gulp marbles_baas 启动 Marbles 应用

8. 创建弹珠或转移弹珠

试着在浏览器中创建弹珠或者用鼠标拖拽转移弹珠

9. 查看日志

对 Marbles 应用做了相应操作后,进入阿里云日志服务 test-log-project Project 下的 test-log-store LogStore,查看日志

我们看到当 Marbles Server 接收到事件后,会触发 HTTP 触发器,由函数计算 FC 来对事件做相应处理。( 简单起见,demo 的处理目前仅仅是记录日志,读者们可以自行扩展 )

区块链应用与函数计算在业务上结合的场景与价值探讨

通过制作上面的 demo,相信大家现在对于如何将区块链应用与函数计算相结合有了一定的认识。接下来,就让我们一起探讨下,区块链应用与函数计算在业务上有哪些结合的场景与价值。

下图是最原始的 Fabric SDK 时序图

为了让读者方便理解,我们仍旧使用 Marbles 应用的时序图,读者可以将 Marbles 应用中的 Server 理解为 Fabric SDK 时序图中的 Application,

在笔者看来,函数计算可以与区块链应用相结合的场景主要有以下三点:

1. 处理事件

处理事件的场景刚刚在 demo 中各位读者想必已经体验过了。那么,为什么笔者倡导用函数计算来处理事件呢?

通过函数计算可以将每一次的事件进行相应的处理,处理完成后发送给日志服务。同时,还可以在函数计算中设定定时触发器,在指定时间内,再次统计事件的信息,由此对区块链状态进行一个数据分析。

而关于这种方式的统计逻辑,很有可能是需要经常迭代的。因此,不适合将其逻辑放入区块链应用中,而是更适合放在小巧易迭代的函数计算场景中。

2. 附加业务

考虑一个这样的场景:现在 X 公司推出了一款新的支付 App,为了鼓励用户使用该公司的 App,该公司对外宣传当用户用该公司的 App 成功完成交易后,该公司会送大量优惠券以及积分。若该 App 是一款区块链应用,那么把优惠活动的业务逻辑放在哪里最合适呢?

笔者目前觉得是放在 Orderer 将交易打包成区块并广播的时候最合适,因为优惠活动的业务逻辑是经常会变化的,这类业务逻辑可以统称为附加业务,将附加业务抽象为一个个函数并放在函数计算中,容易更新迭代。

3. 验证交易

Peer 节点在模拟提案时,若是有复杂多变的逻辑,可以放入函数计算中,由 Peer 节点来负责调用。

以上三点就是笔者对于如何将区块链服务与函数计算相结合的思考,有不准确的地方,欢迎大家指出。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring项目启动加载xml配置文件替换数据库提高响应速度

文章目录1. pom依赖2. xml配置文件3. 获取参数工具类4. 根据beanId从SpringBootIOC获取类实例工具类5. 测试类6. 浏览器控制台验证1. pom依赖 <properties><!--全局版本控制--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><…

目标检测算法图解:一文看懂RCNN系列算法

在生活中&#xff0c;经常会遇到这样的一种情况&#xff0c;上班要出门的时候&#xff0c;突然找不到一件东西了&#xff0c;比如钥匙、手机或者手表等。这个时候一般在房间翻一遍各个角落来寻找不见的物品&#xff0c;最后突然一拍大脑&#xff0c;想到在某一个地方&#xff0…

不懂数据库的码农不是好程序员!

毋庸置疑&#xff0c;现在是“一切皆数”的时代&#xff0c;放眼目前炙手可热的大数据、人工智能等创新技术&#xff0c;如果没有数据加以支撑&#xff0c;一切的一切将毫无用武之地&#xff0c;更不必谈信息化、智能化and so on&#xff0c;而数据库作为存储和承载数据的重要场…

基于深度学习模型WideDeep的推荐

本实验选用数据为UCI开源数据集&#xff0c;仅用于学习&#xff0c;请勿商用&#xff09; Wide&Deep推荐算法出自一篇论文《Wide&Deep Learning for RecommenderSystems》&#xff0c;Wide&Deep由两部分组成&#xff0c;分别是Wide和Deep。先来说wide&#xff0c;…

RabbitMQ非root用户安装(Linux环境)

文章目录一、用户操作1. 创建fismq用户并设置密码2. 给fismq用户设置目录权限二、Erlang 操作2.1. Erlang下载2.2. Erlang 上传并解压2.3. 验证rabbitmq依赖是否安装2.4. 安装rabbitmq依赖2.5. Erlang 编译、安装2.6. Erlang 配置环境变量2.7. Erlang 验证三、RabbitMQ3.1. Rab…

深度学习目标检测系列:faster RCNN实现|附python源码

目标检测一直是计算机视觉中比较热门的研究领域&#xff0c;有一些常用且成熟的算法得到业内公认水平&#xff0c;比如RCNN系列算法、SSD以及YOLO等。如果你是从事这一行业的话&#xff0c;你会使用哪种算法进行目标检测任务呢&#xff1f;在我寻求在最短的时间内构建最精确的模…

mysql冷热数据LRU_浅析MySQL的lru链表

一、简述传统的lru链表lru&#xff1a;least recently used相信大家对lru链表是不陌生的&#xff0c;它算是一种基础的数据结构吧&#xff0c;而且想必面试时也被问到过什么是lru链表&#xff0c;甚至是让你手写一个lru链表。想必你已经知道了mysql的buffer pool机制以及mysql组…

报应!GitHub上线围剿Python计划,已有4万人跟进,你呢?

人红是非多&#xff0c;最近Python就遇到了这样的问题。与国际技术社区上一片「形势大好」对比鲜明的是&#xff0c;国内技术圈却一直存在对Python&#xff0c;「力挺」和「吃瓜」两派阵营&#xff0c;针锋相对&#xff0c;最近就悄然上线一个争议性疑问&#xff1a;围剿Python…

生物智能与AI——关乎创造、关乎理解(上)

几百万年前&#xff0c;第一次人类智能的星火出现在非洲大陆&#xff0c;并且持续发展&#xff0c;最终在大约10万年前在智人的大脑中达到顶峰。作为现代人类&#xff0c;我们只能想象我们的古代祖先在窥视夜空时所经历的事情&#xff0c;以思考物理现实的本质&#xff0c;以及…

Spring Cloud Config 规范

Spring Cloud Config 规范 首先Spring Cloud 是基于 Spring 来扩展的&#xff0c;Spring 本身就提供当创建一个Bean时可从Environment 中将一些属性值通过Value的形式注入到业务代码中的能力。那Spring Cloud Config 要解决的问题就是&#xff1a; 如何将配置加载到 Environm…

RabbitMQ开机启动 Centos7环境

文章目录8.1. 创建启动脚本8.2. 赋予启动脚本可执行权限8.3. 加入开机启动并指定用户8.4. 赋予可执行权限8.5. 重启MQ服务器测试8.6. 查看MQ服务运行状态8.7. 浏览器验证MQ管控台8.1. 创建启动脚本 操作说明&#xff1a;使用fismq用户操作&#xff0c;使用root用户权限的地方我…

微信几亿人在线的点赞、取消点赞系统,用Redis如何实现?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | solocoder责编 | 阿秃点赞功能大家都不会陌生&#xff0c;像微信这样的社交产品中都有&#xff0c;但别看功能小&#xff0c;想要做好需要考虑的东西还挺多的&#xff0c;如海量数据的分布式存储、分布式缓存、多IDC的数据一…

年度大盘点:机器学习开源项目及框架

我们先来看看Mybridge AI 中排名靠前的顶级开源项目&#xff0c;再聊聊机器学习今年都有哪些发展&#xff0c;最后探寻下新的一年中会有哪些有值得我们期待的事情。 顶级的开源项目 BERT BERT&#xff0c;全称为Bidirectional Encoder Representations from Transformers&am…

centos7以普通用户开机启动某个服务或者指定脚本

文章目录1. 执行命令格式规范2. 添加到/etc/rc.d/rc.local3. 赋予可执行权限扩展知识&#xff1a;开头添加这句 source /etc/profile 原因为 下面几点1. 执行命令格式规范 #开机切换到fismq用户执行/app/start.sh su fismq -c "/app/rabbitmq_server-3.8.3/sbin/start_ra…

Andrew Ng教你如何引领公司进入AI时代

AI&#xff08;人工智能&#xff09;技术就像100年前的电力一样&#xff0c;正准备改变每个行业。从现在到2030年&#xff0c;它将创造约13万亿美元的GDP增长。虽然它已经在谷歌&#xff0c;阿里巴巴&#xff0c;微软等领先的科技公司中创造了巨大的价值&#xff0c;但其他许多…

IBM Cloud Paks:云端追光者也!

作者&#xff1a;阿秃 现如今&#xff0c;“企业上云”已毫无争议。 据知名云管理服务商RightScale 发布的2019年全球云计算市场调查显示&#xff0c;在众多云平台中混合云的采用率比重最高&#xff0c;达到了惊人的58%。可以想见&#xff0c;市场对混合云的庞大需求正吸引越…

生物智能与AI——关乎创造、关乎理解(下)

无监督学习&#xff0c;迁移学习和工程设计 AI系统与人类学习之间的另一个主要差异在于AI系统所需的大量标记数据才可以达到人类级别的性能。例如&#xff0c;最近的语音识别系统在11940小时的语音训练后才能对齐转录。如果我们每天大声地听到另一个人类阅读文本两个小时&…

如何利用tcpdump抓包?

文章目录一、基本使用1. 安装tcpdump2. 使用方法二、案例实战2.1. 企业案例背景2.2. 抓包实战三、网卡接口获取3.1. centos7.x使用3.2. centos6.x使用一、基本使用 1. 安装tcpdump yum install tcpdump -y2. 使用方法 tcpdump -i 网卡接口 协议 -n 注&#xff1a;协议可以接…

Gartner 发布2019年超融合魔力象限:新增深信服一员!

近日&#xff0c;国际权威研究分析机构Gartner公布了2019全球《超融合基础设施魔力象限》报告。 报告显示国内仅有三家云计算厂商进入2019超融合基础设施魔力象限&#xff0c;分别是深信服、华为、华云数据。其中深信服超融合&#xff08;sangfor aCloud&#xff09;凭借技术优…

深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

在之前的文章中&#xff0c;介绍了计算机视觉领域中目标检测的相关方法——RCNN系列算法原理&#xff0c;以及Faster RCNN的实现。这些算法面临的一个问题&#xff0c;不是端到端的模型&#xff0c;几个构件拼凑在一起组成整个检测系统&#xff0c;操作起来比较复杂&#xff0c…