超级账本(hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,加入成员包括:荷兰银行(ABN AMRO)、埃森哲(Accenture)等十几个不同利益体,目标是让成员共同合作,共建开放平台,满足来自多个不同行业各种用户案例,并简化业务流程。由于点对点网络的特性,分布式账本技术是完全共享、透明和去中心化的,故非常适合于在金融行业的应用,以及其他的例如制造、银行、保险、物联网等无数个其他行业。通过创建分布式账本的公开标准,实现虚拟和数字形式的价值交换,例如资产合约、能源交易、结婚证书、能够安全和高效低成本的进行追踪和交易。
Hyperledger Fabric 构建于一种模块化架构之上,该架构将交易处理分为 3 个阶段:分布式逻辑处理和协商(“链代码”)、交易订购,以及交易验证和提交。这种分离提供了一些优势:不同节点类型之间需要的信任和验证水平更低,网络可伸缩性和性能得到了优化。
目前超级账本项目( Hyperledger Fabric )支持在Mac及各大主流Linux下运行,现主要讲解以下在 Centos7 下搭建 超级账本的 开发验证环境。
1、安装Docker
目前开源社区Docker最新版本为 18.03.1,社区分为开源版本(docker-ce)和企业版本(docker-ee)。 需要配置Docker官方源才可以安装最新版本,此处我们安装开源社区版本 docker-ce。
具体操作安装步骤可参考我另一篇文章
需要安装 Docker 及 Docker-compose,验证这两项安装成功即可。
2、安装Go语言运行环境
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go语言于2009年11月由Google正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后追加Windows系统下的实现。Go语言具有 部署简单、并发性好、良好的语言设计、执行性能好 等特点。
CentOS 7 下安装 Go语言运行环境可参考我另一篇文章 。
3、安装NVM及Node.js
nvm全称Node Version Manager ,是 Nodejs 版本管理器,它让我们能方便的对 Nodejs 的版 本进行切换。 nvm 的官方版本只支持 Linux 和 Mac。 Windows 用户,可以用 nvm-windows。
fabric暂时不支持7.x,需要安装6.9.x 或 6.x高的版本,通过 nvm 安装指定 版本的node。
现安装Node.js 6.5.9 版本。
具体步骤可以参考。
至此 Docker、Docker-compose、Go、Node.js 基础运行环境已经全部安装完成。
4、Hyperledger各个项目的架构和分工
Hyperledger是架构,Fabric是基于该架构的一个官方开源项目,是 Hyperledger 底层区块链的落地实现。
Fabric 是Hyperledger 的最核心项目,提供了最核心的区块链服务。
以上链接是Hyperledger 超级账本所有项目的信息,官网中提供了各种其他项目,这些项目都是围绕 Fabric 开发,或者为 Fabric 提供服务,如下图:
用于支持整个Hyperledger架构,官方还提供了一些列实用工具,如下图:
为了更好的学习 Fabric ,官方提供了一些小示例共初学者学习,可以通过学习这些小示例,熟悉搭建Hyplerledger区块链环境,学习其基本开发逻辑和理解超级账本中的一些重要概念。
以下主要讲解如何在之前搭建的环境中 正确运行 Fabiric Samples,并在控制台下与智能合约进行交互。
5、Fabiric Samples 下载并安装
运行Fabric最基础的运行环境为 Docker、Go、Node.js ,配置完基础运行环境后,在对Fabric网络进行配置,主要配置步骤如下:
- 准备网络内各项配置。包括网络成员的组织结构和身份证书(可使用crypyogen工具完成);生成系统通道的初始化区块文件(创世区块配置文件),新建应用通道的配置更新交易文件以及可能需要的锚节点配置更新文件(使用configtxgen工具完成)
- 使用系统通道的初始化配置区块文件启动排序节点,排序节点启动后自动按照指定配置创建系统通道。
- 不同的组织按照配置角色分别启动 peer 节点。这个时候系统中不存在应用通道,peer节点并没有加入到网络中。
- 使用新建应用通道的配置更新交易文件,向系统通道发送交易,创建新的应用通道。
- 让对应的 Peer 节点加入所创建的应用通道中,此时Peer节点加入网络,可以进行交易了。
- 用户通过客户端向网络中安装链码,链码容器启动成功后用户即可对链码进行调用,将交易发送到网络中。
以下详细介绍每个步骤的具体操作:
1、下载 Fabiric Samples
Fabric Samples 的 Git 地址为:https://github.com/hyperledger/fabric-samples
目前 Fabric Samples 最新版本为 1.1 ,但是1.1 版本在安装过程中会遇到一些问题,暂时无法解决,所以现使用 1.0 版本。
在左侧版本选择处选择 1.0 版本,并下载:
wget https://github.com/hyperledger/fabric-samples/archive/release-1.0.zip
解压后,在CentOS 中的路径为:
/root/dev/hyperledger/fabric-samples-release-1.0
2、下载平台特定的二进制工具文件
Fabric Samples 我们使用的是1.0版本,所有此处二进制文件也使用1.0版本,如果是 Fabric Samples V1.1,则此处二进制文件也要使用 1.1。
下载地址为:
下载 其中的 hyperledger-fabric-darwin-amd64-1.0.5.tar.gz 文件,将解压后的bin目录放置在fabric-samples-release-1.0 目录下,如下图:
[root@localhost fabric-samples-release-1.0]# pwd/root/dev/hyperledger/fabric-samples-release-1.0[root@localhost fabric-samples-release-1.0]# lsbalance-transfer fabcar LICENSEbasic-network first-network MAINTAINERS.mdbin high-throughput README.mdchaincode hyperledger-fabric-linux-amd64-1.0.5.tar.gz scriptschaincode-docker-devmode
3、安装Docker images
打开 https://goo.gl/byy2Qj ,并将内容保存至init.sh 文件,放置于 fabric-samples-release-1.0 目录中。
如下图:
编辑文件,注释其中关于下载平台二进制文件的一行(因为之前我们已经下载了),如下图:
为 init.sh 授予可执行权限,并执行:
[root@localhost fabric-samples-release-1.0]# ./init.sh 1.0.5
执行需要花费几分钟时间。
4、配置超级账本网络信息
进入first-network 目录,接下来所有的操作,都在此目录下进行。
cd first-network
打开 docker-compose-cli.yaml 文件,注释掉
command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME} ${DELAY}; sleep $TIMEOUT'
这句代码,如下图:
以下操作主要为网络配置操作,可以保存为sh文件,批量执行:
# 配置网络基础数据./byfn.sh -m generate#生成创世区块../bin/cryptogen generate --config=./crypto-config.yamlexport FABRIC_CFG_PATH=$PWD ../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block#⽣成应⽤通道的配置信息export CHANNEL_NAME=mychannel../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME#⽣成锚节点配置更新⽂件../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP#操作⽹络,编辑 docker-compose-cli.yaml ,注释掉 command 命令(注释步骤之前已经完成了)CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=600 docker-compose -f docker-compose-cli.yaml up -d
以下为Docker 操作,主要目标为 创建和加⼊通道
进⼊ Docker 容器
docker exec -it cli bash
在Docker容器中创建通道
export CHANNEL_NAME=mychannelpeer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
加⼊通道
peer channel join -b mychannel.block
链上代码 (链码) 安装链码(此处安装的代码并非本地的代码)
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
实例化链码
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR('Org1MSP.member','Org2MSP.member')"
查询
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
可以看到返回结果如下:
Query Result:100
现操作A转账给B 10 块钱
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'
查询 a 账户的金额
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
查询结果仅剩90块,如下:
Query Result: 90