共计 6262 个字符,预计需要花费 16 分钟才能阅读完成。
什么是区块链?简略来说区块链就是一个分布式的记账本,或者分布式的数据库。
区块链的数据结构是一个链表,交易数据被存储到链表的区块中,区块链的第一个区块叫创世区块,除了创世块以外,每个区块还蕴含前一个区块的哈希指针,这个哈希指针的值是依据前一个区块的理论数据计算出来的。哈希指针指向前一个区块,前面的区块能够查找后面所有区块的信息。
账本的数据结构就是这样的一个链表,那么分布式的含意是什么呢?
区块链的泛滥参与者组成了一个涣散自治的 P2P 网络,咱们把区块链网络的参与者叫做节点,每个节点都领有一个账本拷贝,所有账本的信息都是统一的,在区块链里没有核心节点。每当有新的交易进来,所有节点的账本都会更新,并且最终保持一致。更新的形式不是去批改某个区块的值,而是保留交易记录。比方在比特币零碎中,它没有用户资产记录这样的概念,不像一般数据库那样用一条数据存储资产,比特币用户资产的值是通过把所有的交易记录串联聚合后失去的,账户里资产的起源能够始终向上追溯,直到创世块为止。区块链里的交易数据依据具体场景,能够是任何须要记录的信息。
智能合约
为了反对信息的继续更新,以及对账本进行治理(写入交易,进行查问等),区块链网络引入了智能合约来实现对账本的拜访和管制。智能合约不仅仅可用于在区块链网络中打包信息,它们也能够被用于主动的执行由参与者定义的特定交易操作。
比方智能合约能够规定物流中的运输费用,依据物流的快慢收取不同的费用,依据货物的达到工夫进行主动转账等。上传到区块链网络中的的智能合约会被打包到某一个区块中,因而智能合约一旦写入区块链,也是不可更改的。
共识机制
区块链网络中交易信息同步的过程,确保交易只有取得适当参与者批准后才更新,所有的参与者都会将同样的信息依照同样的程序更新,这样的过程叫做共识。共识机制是区块链的外围之一。
区块链的第一个利用比特币,采纳的是 Proof of Work(工作量证实)的共识机制。简略介绍一下比特币的共识机制,算法的具体细节大家能够去查白皮书。节点收到一个交易后,会依据判断规范对该交易进行有效性校验,有效的交易会被废除。通过有效性验证之后的交易将会被播送给其余节点。其余节点会做同样的独立校验,当无效的交易达到整个网络所有节点时,即全网达成了“该交易无效”的共识。每个节点都会收到很多无效然而还未被打包到区块中的交易,这些交易被组装成 Merkle Tree,Merkle Tree 的第一个交易比拟非凡,叫做 coinbase,由节点本人创立,将挖矿处分领取到矿工本人的地址。挖矿处分包含新创建的比特币和打包进该区块所有交易的手续费总额。而后节点计算一个合乎难度的哈希值,挖矿就是通过批改参数一直计算区块哈希值,直至达到难度要求,也就间接证实了该节点付出了对应的工作量,这就是工作量证实。笔者的另一篇文章 300 行 ABAP 代码实现一个最简略的区块链原型里用了一个 ABAP 办法 CL_ABAP_MESSAGE_DIGEST=>CALCULATE_HASH_FOR_CHAR 来计算区块的哈希值。
当节点计算出一个合乎难度的区块哈希时,即阐明该矿工挖矿胜利了,该节点将该区块组装到本地的区块链,同时也将此区块播送给其余节点。其余节点接管到该区块后会验证该区块是否无效,有可能有两个节点同时挖出了新的区块 B1 和 B2,它们的上一个区块都是同一个区块 P。有的节点可能会先收到 B1,有的会先收到 B2,这时区块链呈现了暂时性的两个分叉。要突破这种场面,要看下一个区块是基于 B1 生成还是基于 B2 生成。如果基于 B1,B1 这条链就变成了最长链,其余蕴含 B2 的节点会从新抉择最长链,而 B2 作为孤块被抛弃掉。
到目前为止,咱们能够将区块链看做是一个共享的,去中心化的多备份零碎,通过智能合约更新交易数据,同时借助共识的合作流程使网络中所有的节点保持一致。
这里的交易能够指代任何数据,例如:数字货币,合同,记录或者其它任何信息。
区块链的类型
- 私有链:网络中的节点能够任意接入,网络中数据读写权限不受限制,所有节点都参加共识过程。比特币,以太坊等数字货币都属于私有链。
- 公有链:网络中的节点被一个组织管制,由其独享该区块链的写入权限,公有链和其余的分布式存储没有太大区别。
- 联盟链:多个公司或组织通过受权接入,由某些节点参加共识过程。Hyperledger Fabric 属于联盟链。
什么是 Hyperledger Fabric?
Hyperledger Fabric 是 Linux 基金会发动的 Hyperledger 我的项目之一。Hyperledger Fabric 专为在企业环境中应用而设计的开源的基于区块链的分布式账本。Hyperledger Fabric 可用于寰球供应链治理、金融交易、资产记账、人力资源、保险、衰弱和数字音乐等畛域。
Hyperledger Fabric 中的账本子系统 (ledger) 包含两个组件:世界观 (world state) 和事务日志(transaction log)。世界观记录了账本在特定工夫点的现状,是一个键值数据库。交易日志记录产生世界状态以后值的所有交易,是世界观的更新历史。账本的世界观的底层数据库能够更换,能够抉择应用 levelDB 或 couchDB。
Hyperledger Fabric 是第一个反对以通用语言编写智能合约的区块链平台,能够应用 java,nodejs 和 go 语言来编写智能合约。Hyperledger Fabric 中的智能合约也叫链码(chain code)。
和其余私有区块链平台最大的不同,Hyperledger Fabric 是公有的并且须要受权能力接入,它领有一个 MSP(Membership Service Provider) 模块专门提供成员治理服务。
CA(Certificate Authority) 负责权限治理,成员身份相干证书治理 (Enrollment CertificateAuthority) 和保护交易相干证书治理 (Transaction Certificate Authority) 等等。
Hyperledger Fabric 提供了建设 channel 的性能,这容许参与者为交易新建一个独自的账本。当网络中的一些参与者是竞争对手时,这个性能变得尤为重要。因为这些参与者并不心愿所有的交易信息——比方提供给局部客户的特定价格信息——都对网络中所有参与者公开。只有在同一个 channel 中的参与者,才会领有该 channel 中的账本,而其余不在此 channel 中的参与者则看不到这个账本。
Hyperledger Fabric 应用独立的排序节点 (order) 来提供共识服务,负责排序交易,提供全局确认的交易程序。
应用程序通过 SDK 拜访 Hyperledger Fabric。
最新版 Hyperledger Fabric 的设计中,依据性能将节点角色解耦开,让不同节点解决不同类型的工作负载。从业务逻辑上又将节点分为背书节点 (Endorser) 和提交节点(Committer)。
- Endorser peer:负责对来自客户端的交易进行合法性和权限查看(模仿交易),通 过查看则签名并返回后果给客户端。
- Committer peer:负责保护账本,将达成统一程序的批量交易后果进行状态查看,生成区块,执行非法的交易,并写入账本,同一个物理节点能够同时负责 endorser 和 committer 两个角色。
Hyperledger Fabric 交易流程:共识
共识流程次要分 Proposal,Packaging 和 Validation 三个阶段。
Proposal
利用提交一个交易 proposal,而后将其提交给所有的背书节点,后者接到后,将其作为输出执行链码生成相应的交易 proposal 响应。此时并不会更新 Ledger,而是对交易 proposal 响应签名,并将其返回给利用。利用收到签名后的响应,共识流程的第一阶段就实现了。
Packaging
这个阶段是 order 节点对交易进行排序打包。Order 节点从各个利用接管交易 proposal 响应,而后对这些交易进行排序,排序之后打包成区块。
Validation
共识流程的最初一个阶段,由 order 节点将区块分发给所有和它连贯的节点,这些节点将确认区块中的交易都通过背书节点签名,而后将确认后的区块更新到 ledger 中。
整个流程称为共识,所有节点都已对交易内容和程序达成统一,这一过程由 order 节点管制。共识是一个多步骤的过程,只有在整个流程实现时才会更新账本,可能每个节点的更新工夫稍有不同。
构建一个 Hyperledger Fabric 平台绝非易事,既须要硬件基础设施的投入,也须要全方位的开发和经营治理(DevOps)。除了平台自身,一套残缺的解决方案,还包含设施接入,访问控制,服务监控等治理性能。
SAP Cloud Platform(下文简称 SCP)提供了开箱即用的 Hyperledger Fabric Service,为开发者提供了弱小的服务反对:
- 直观敌对的可视化监控与操作界面,帮忙开发者按需申请区块链网络,创立治理节点、渠道,而无需思考底层硬件资源。
- 简略易用的智能合约开发与测试环境,不便开发者对利用代码进行治理。
- 平安,隐衷性方面的保障,并对相干资源进行了性能优化。
上面是具体的实战步骤,该步骤应用 go 语言开发一组微服务,这组微服务蕴含读和写两个 API,可能将数据写入架设于 SAP 云平台上的超级账本服务。
简略地说,应用程序通过智能合约接口同超级账本进行读写操作。咱们将开发一个 Hello World 的智能合约,部署到 SAP 云平台上。出于简略起见,咱们没有开发利用,而是简略地在 SAP 云平台的 API 管制台上间接生产这个 Hello World 的智能合约,对云平台上的超级账本进行读和写。
关上超级账本我的项目 Fabric 的 github 仓库地址:
https://github.com/hyperledge…
发现 Fabric 我的项目是 Google 的编程语言 GoLang 开发的,因而咱们这个练习也应用 Go 语言来进行智能合约的开发。
- 从 Google 网站上将 Go 语言 1.11 版的二进制包下载到本地,解压到 /usr/local 目录下:
sudo tar -C /usr/local -xzf /home/vagrant/Downloads/go1.11.linux-amd64.tar.gz
将该目录配置到环境变量 PATH 中去:
- Fabric 我的项目曾经将智能合约同超级账本的通信封装到一个名叫 shim 的接口中,咱们只须要在咱们编写的智能合约代码中间接调用该 shim 接口即可。
咱们应用 import 将这个 shim 接口的依赖引入进来,在第 14 行定义一个构造体,蕴含 ID 和 Value 两个字段。这个构造体即是待写入超级账本的数据结构,ABAP 参谋能够将其视为 ABAP 数据字典里定义的构造体。
第 46 行定义的办法 Invoke 是这个最简略的智能合约的外围代码,cc *MessageStore 这个语法和 C 语言很像,定义了一个类型为 MessageStore 的指针变量 cc。这个指针变量同 C++ 的 this 指针和 ABAP 的 me 援用作用相似,在办法被调用时,指向了办法的调用者。
Invoke 前面括号里的 stub shim.ChaincodeStubInterface 定义了该办法的输出参数(形参)stub, 类型为 shim.ChaincodeStubInterface。
这个 Invoke 办法不会通过应用程序显式调用,而是通过超级账本程序回调:当办法被调用时,指针 cc 和输出参数 stub 曾经主动被 Fabric 框架赋上了对应值。在 Invoke 办法运行的上下文里,通过输出参数 stub 判断出以后回调的场景是读还是写,而后进入对应的分支。分支外部调用咱们本人开发的 write 和 read 办法同超级账本进行交互。
这种通过同一个回调函数外部的 switch case 来解决多个场景的做法,ABAP 和 Java 开发者应该都不生疏。比方下图是通过 InvocationHandler 实现 Java 动静代理的例子,其中 invoke 办法的逻辑构造和本文智能合约代码的构造十分类似。
对于 ABAP 和 Java 里各种动态代理和动静代理的写法,请参考我的博客:
Various Proxy Design Pattern implementation variants in Java, ABAP and JavaScript
- 将开发好的智能合约源文件构建成可执行文件。这一步确保在部署智能合约到 SAP 云平台之前,先在本地开发环境将所有潜在谬误全副检测出并修复。
- 登录 SAP 云平台,在 Service Marketplace 里点击 Hyperledger Fabric 的超链接:
创立一个新的 Service 实例:
创立过程中须要填写 channel 的 ID 和密匙。
区块链分为私有链,公有链和联盟链,而超级账本属于联盟链。在联盟链里,有一个专门的称为 MSP(Membership Service Provider)的模块,提供成员治理服务,只有受权用户能力接入区块链网络。这里我当时在 SAP 云平台上创立了一个渠道并进行认证,因而此处间接输出一个非法的渠道 ID 和密匙。对于 SAP 云平台上超级账本渠道的创立和成员受权接入的步骤,请参考这篇 SAP 帮忙文档。
Service 实例创立结束后,点击 Create Service Key 按钮创立 key,目标是生成用于 OAuth 认证的 clientId 和 clientSecret,不便接下来的 API 调用。
点击 Service 实例的 Referencing Apps 面板,点击按钮 Open Dashboard:
点击 Deploy Chaincode,抉择本地构建好的 zip 包,进行上传并部署。这个按钮同 SAP 云平台 CloudFoundry 环境部署本地利用的逻辑雷同。
部署胜利后,点击 Test Chaincode 超链接进入 API 控制台。
该控制台集成了 Swagger 框架,在调用 post 申请进行超级账本的写操作和 get 申请进行读操作之前,先要点击 Authorize 按钮进行身份认证:
输出第四步创立 Service Key 后生成的 clientID 和 clientSecret 进行认证:
认证胜利后,能够在 Swagger 的控制台里调用 post 和 get 申请了。
首先发送 post 申请,申请负载就是一个简略的 json 对象,id 为 i042416,value 为 Hello World:
post 申请在 SAP 云平台上的超级账本执行胜利,返回 200 响应码:
紧接着执行 get 申请,输出方才写入的数据 id: i042416:
get 申请可能将之前通过 post 申请写入账本的数据胜利读出来:
登录 SAP 云平台超级账本控制台,能看到之前通过 post 写入的数据曾经退出到区块链尾部的区块了。点击区块能够查看数据明细:
在超级账本控制台的 API Calls 和 Logs 面板里也能看到每次超级账本读写的详细信息。
总结
SAP 云平台的超级账本服务,胜利地帮忙了心愿应用这项区块链技术的企业防止了硬件基础设施的投入,同时屏蔽了大部分超级账本平台治理的底层细节。通过 SAP 云平台提供的控制台,即可实现对超级账本进行设施接入,访问控制,服务监控等治理性能。同时,通过 Go 语言编写的智能合约一旦部署到 SAP 云平台,生成的 Restful API 可能被其余编程语言不便地生产。调用这些 API 写入超级账本区块链中的数据将无奈再被篡改。应用 SAP 云平台的超级账本服务,利用开发人员能够无需将过多精力破费在超级账本体系架构自身,从而可能专一于应用逻辑的编写下来。