Hyperledger入门学习教程

本文是作者“零基础”入门Hyperledger系列的日记性质的文章。笔者在区块链开发方面零基础,按照文中的顺序学习,三天内能够基本理解Hyperledger系列代码库的功用。


第一步:基础常识(0 hours)

区块链基础

区块链这个概念最近非常火,稍微对这方面有所关注的人都对区块链的核心思路有所了解。在笔者心目中,区块链,一个基于密码学的去中心化系统,该系统拥有不可篡改、匿名等特点。这一层面的理解,读者可以参考知乎上关于区块链的科普文章,在这里就不详细讲解了。

GO语言【可选】

除了比特币是用C++写的之外,大部分的区块链项目都是用GO语言写的,因为GO语言同时具有C++语言的效率,以及Java语言的安全性,广为高性能项目开发者所喜爱。后续的代码阅读需要对GO语言有基础的了解。当然,如果你只需要部署项目的话,Hyperledger已经有足够简单的脚本以致于不需要懂GO语言也能学会。

菜鸟教程:https://www.runoob.com/go/go-tutorial.html
C语言中文网教程:http://c.biancheng.net/golang/

第二步:阅读Hyperledger书籍 (2 hours)

尝试了解:Hyperledger的历史、存在意义以及算法基础。

网络对于Hyperledger的教程文章并不多,而且质量也并不太好,所以想要系统性的搞清楚联盟链有什么东西,可以看有关的书籍。我看的是下面这本书,由于微信阅读的免费卡真的厉害,在kindle上面30+RMB的书在微信阅读都是免费的——

笔者花了一个晚上的时间过了这本书的前几章,觉得重要的知识点有——

  • 区块链的分布式储存技术特性使得其本身就是一个很健壮的分布式数据库。
  • 一些有助于理解区块链原理的算法
    • 哈希算法,包括SHA-384, SHA-512等
    • Merkle树:用于对树形结构数据求得Hash值,高效,支持部分校验
    • 非对称加密:椭圆曲线,RSA加密算法
    • 共识机制:工作量证明(POW),股权证明(POS),委托权益证明(DPOS),拜占庭共识算法(PBFT),投注共识机制(Casper),消逝时间证明(POET)……
  • 智能合约的意义,智能合约本质是一段用某种计算编程语言编写的程序,这段程序可以运行在区块链系统提供的容器中。智能合约代码储存在区块链中,结合区块链提供的防篡改防伪造的特性,智能合约能够和区块链本身非常天然的融合在一起。
  • 区块链,特别是公链,有“性能慢”,“数据不易弹性扩展”,“技术社区不成熟”的缺点。
  • Hyperledger(超级账本)本身是Linux基金发起的推荐区块链技术和交易认证的开源项目。后来已经转变为一个开源的代码库集合,包含9个正式项目和50多个相关模块。其中,笔者最为关注的有
    • Hyperledger-Fabirc:Hyperledger核心项目,一个可灵活配置的分布式共享账本。
    • Hyperledger-Explorer: 一个基于Node.js的区块链配置管理,节点查询的工具。
    • Hyperledger-Burrow:一个智能合同机,采用了部分以太坊虚拟机(EVM)的技术规范。提供了共识引擎,合约引擎的接口。

第三步:理解Hyperledger的相关概念 (2 hours)

Hyperledger官方文档:https://hyperledger-fabric.readthedocs.io/en/master/key_concepts.html
民间总结:https://hackernoon.com/hyperledger-fabric-the-20-most-important-terms-made-simple-2753f925db4

这一步我们需要尝试了解Hyperledger的常用术语,包括Consensus、Policy、Peers、Ledger等概念。

这些概念非常重要,原因是在后续的部署中,我们可能遇到类似于peer chaincode invoke 这样的命令,如果读者连这些名词的具体含义都没有了解的话,在后续的部署中会觉得很难受。

读者可以现在先对这些概念有一个初步的映像,在后续部署过程中遇到的时候,再有针对性的去阅读。

这些概念,可以在Hyperledger Fabric的文档中了解。

重要知识点——

Policy
policy,是一系列规则,描述了决策该如何指定,结果是如何产生的。可以类比于我们平常的“保险协议”,定义了理赔的范围、时间等信息。事实上,hyperledger-fabric的policy和比特币、以太坊等项目的policy有所不同,后者的policy是固定的,过去、现在、未来都不会变。但是hyperledger-fabric则支持网络的所有者,不仅可以在网络运行之前制定规则,还可以在网络运行的时候修改规则。

Peers
peers,对等节点,是网络上的最基本的元素。区块链网络的对等节点内部储存了账单以及智能合约的拷贝。Peer可以被创建、启动、暂停、删除,并且他们暴露了一系列API供管理人员以及服务需求商调用。

Ledger
Ledger 是账单的意思,ledger被储存在peer节点中,通过一系列方式保证了账单的同步。

Chaincode
chaincode,合约代码,和ledger一样储存在peer节点中,而chaincode定义了用来访问ledger的代码。

Orderer
orderer,请求者,可以理解为用户和整个peers网络节点的一个终结。orderer在整个联盟统一的条件下被加入联盟链,拥有权限创建一个交易,并且让所有peers同步这个交易。

第三步:Hyperledger Fabric部署 (4 hours)

首先按照入门教程中的引导,我们可以使用fabric-samples这个库中提供的脚本,在docker环境中跑一个简易的Hyperledger版本。具体来说,我们接下来,将使用fabric-samples/test-network的脚本,一步一步建立起一个网络,这个网络能够记录一系列车辆的信息。

首先我们搭建环境,在工作目录执行

这一个指令干了三件事情——

  • 倘若工作目录下没有fabric-samples,则从github将这个库clone下来
  • 从github的fabric仓库下载可执行文件,放在fabric-samples/bin目录下
  • 从dockerhub上面拉取需要的docker镜像文件

这一步指令可能存在翻墙的问题,如果遇到了的话,可能就需要根据具体情况“挂代理”“改hosts”或“设镜像”。

接下来我们按照测试网络搭建教程中的命令执行指令。这些指令将一步一步建立起整个联盟链,推荐直接去看原文。

进入测试网络的目录

开启网络,建立网络中的三个节点

  • orderer.example.com
  • peer0.org1.example.com
  • peer0.org2.example.com

这三个节点每一个都是一个独立的docker容器,其中peer节点一定要依附于某个组织,而orderer节点可以独立存在。命令输出见附录A

接下来使用命令建立一个channel:

命令输出见附录B

接下来,使用命令建立一个ChainCode(这里因为要下载GO包,叒需要翻墙了)

该指令首先安装chaincode的依赖库,然后将chaincode分别安装到两个peer中,接着再将chaincode部署到channel中。具体输出见附录C,可以看到,一些“汽车”的数据被加入了我们的账本——

现在,一切初始化操作已经就绪,我们可以开始与我们的网络进行交互。首先确认位于test-network目录,配置环境变量——

接下来,我们使用一个命令查询账本中的数据:

结果与deployCC的输出结果相同。

使用下面的命令可以对账本进行修改,

虽然命令的功能可以从字面意思翻译出来,我们还是可以用help命令自习看一看具体每个参数可以怎么用。

peer命令本身可以看做是一个入口命令,里面分为了peer node操作节点,peer channel 操作频道,peer chaincode 操作合约代码。

其中peer chaincode进一步又有installinvoke等子命令。

在之后的第四步中,我们会使用./first-network而非现在的./test-network,所以需要将现在的网络关闭。结果如附录d。

第四步,部署hyperledger-explorer

项目仓库:https://github.com/hyperledger/blockchain-explorer
非官方安装教程:https://medium.com/coinmonks/hyperledger-explorer-quick-start-50a49c6d7957
官方安装教程:https://github.com/hyperledger/blockchain-explorer#Database-Setup

hyperledger-explorer的部署需要依赖挺多的东西的,单纯安装环境就需要比较长的时间。这一步推荐同时看官方/非官方教程,因为非官方教程有些地方有点过时。

修改nodejs版本

安装PostgreSQL、jq

开启Fabric,由于在上一步已经启动了一个Fabric网络,其中临时设置了一些环境变量,所以这里推荐重启终端以消除影响

首先安装GO库

接着启动./first-network,这一步需要逐一输出有没有报错,如果有报错的话,不应该继续下去。

下载blockchain-explorer

开启PostgreSQL,并初始化数据库

查看配置文件vim ./blockchain-explorer/app/platform/fabric/config.json 由于配置文件默认引用了./connection-profile/first-network.json,所以我们需要按照官方文档的指引,稍微修改一下这一部分,包括——

  • 修改配置文件中fabric-path这个字符串为./fabric-samples所在的真实绝对路径。
  • 修改配置文件中以_sk结尾的文件为真实文件名,在我这里是priv_sk

安装npm依赖包

如果安装正确,应该能够通过所有测试。最后执行命令

这个命令没有控制行输出,所有输出被丛定祥到./logs目录下,如果没有成功运行,可以在这个目录的./app/app.log日志里面找原因。如果成功运行,则在http://127.0.0.1:8080/#/这里可以看到浏览器。(这个字号以及右上角的图标栏是真的丑)

附录

A. 命令./network.sh up输出

B. 命令./network.sh createChannel输出

C. 命令./network.sh createChannel的输出结果

D. 命令./network.sh down 运行结果

First-Network的./byfn.sh up运行结果

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据