本文作者:陈进坚
个人博客:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
简书:https://www.jianshu.com/u/8ba9ac5706b6
联系方式:jian1098@qq.com
环境安装
安装docker
必须是CE(社区)版,如果装企业版的只能卸载重装,否则会出错;如果已安装可跳过,下面是CentOS
安装步骤
- 设置仓库
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
- 安装docker-ce
1 | yum install docker-ce |
- 查看版本
1 | docker -v |
Ubuntu
安装docker
1 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun |
安装docker-compose
如果已安装可跳过
下载
去
https://github.com/docker/compose/releases
查看最新版本,替换下面的链接,后面不要带-rc
的
1 | curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose |
- 添加权限
1 | chmod +x /usr/local/bin/docker-compose |
- 查看版本
1 | docker-compose --version |
安装go语言环境
需要 go1.11
以上版本,如果已安装可跳过
- 安装程序
到官网https://golang.google.cn/dl/
复制最新的下载地址,然后下载压缩包
1 | wget https://dl.google.com/go/go1.13.1.linux-amd64.tar.gz |
解压
1 | tar zxvf go1.13.1.linux-amd64.tar.gz -C /opt/ |
- 配置环境
1 | mkdir go #创建项目目录 |
将下面的GOPATH路径修改为你的项目路径,然后将3条命令添加到文件的最后,保存;第一个是工作目录,第二个是go程序目录
1 | export GOROOT=/opt/go |
执行下面的命令使环境变量生效
1 | source /etc/profile |
查看配置好的go环境变量
1 | go env |
查看版本
1 | go version |
安装python
需要python 2.7.x
版本,一般系统已自带有,如果没有,可以按下面的步骤安装
到https://www.python.org/ftp/python/
选择合适的版本,以下例子基于python 2.7.9,其他版本同理
下载
1
wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
安装
依次执行下面5行命令即可
1
2
3
4
5tar -zxvf Python-2.7.9.tgz
cd Python-2.7.9
./configure --prefix=/usr/local/python-2.7.9
make
make install查看版本
1
python --version
安装node.js及npm
如果你将用Node.js的Hyperledger Fabric SDK开发Hyperledger Fabric的应用程序,则需安装Node.js的8.9.x版本
依次执行下面的命令即可,要装其他版本可以修改10.x
为你要的版本
1 | curl -sL https://rpm.nodesource.com/setup_10.x | bash - |
查看版本
1 | node -v |
如果你想要其他版本的Node.js的话,那么执行命令可以用下面的命令将已安装的Node.js移除,然后重新安装即可
1 | yum remove nodejs |
搭建fabric环境
参照官方文档https://hyperledger-fabric.readthedocs.io/en/latest/install.html
,2.2及以后版本参考https://hyperledger-fabric.readthedocs.io/en/release-2.2/test_network.html
,步骤如下
安装示例、二进制文件和 Docker 镜像
下面的命令下载并执行一个 bash 脚本,该脚本将下载并提取设置网络所需的所有特定于平台的二进制文件,并将它们放入fabric-samples
文件夹中;然后,该脚本会将从 Docker Hub 上下载 Hyperledger Fabric docker 镜像到本地 Docker 注册表中,并将其标记为 ‘latest’。
1 | curl -sSL http://bit.ly/2ysbOFE | bash -s # 服务器需要科学上网 |
如果要指定版本需要加一个 Fabric、Fabric-ca 和第三方 Docker 镜像的版本号
1 | curl -sSL http://bit.ly/2ysbOFE | bash -s -- 1.4.2 1.4.2 0.4.15 |
如果你的服务器无法科学上网,可以到http://note.youdao.com/noteshare?id=4fb074480d296adf1e931c734e18d3bd&sub=2C7210BDD6D04349B332CD66131C58ED
获取脚本,然后保存到bootstrap.sh
文件中,然后添加权限chmod +x
bootstrap.sh `执行脚本即可
1 | chmod +x bootstrap.sh |
执行完后会得到fabric-samples
目录
生成网络构件
2.2以前的版本进入/fabric-samples/first-network
目录,2.2以后的版本的目录在fabric-samples/test-network
,执行下面的命令,然后输入Y继续,注意2.2
版本及之后的版本不需要执行
1 | ./byfn.sh generate |
上面的命令为我们的各种网络实体生成证书和秘钥。创世区块 genesis block
用于引导排序服务,也包含了一组配置 Channel 所需要的配置交易集合
关闭网络
执行下面的命令,然后输入Y继续
2.2以后的版本的目录在fabric-samples/test-network
,2.2以前的版本进入fabric-samples/first-network
1 | ./byfn.sh down //2.2以前的版本 |
上面的命令会结束掉你所有的容器,移除加密的材料和四个构件,并且从 Docker 仓库删除链码镜像
启动网络
执行下面的命令,然后输入Y继续
1 | ./byfn.sh up # 默认golang启动 |
2.2及以后的版本将./byfn.sh
换成./network.sh
即可
上面的命令会编译 Golang 智能合约的镜像并且启动相应的容器。Go 语言是默认的链码语言,但是它也支持 Node.js 和 Java 的链码,详情可以看官方文档https://hyperledger-fabric.readthedocs.io/zh_CN/release-1.4/build_network.html
;
这一步会启动所有的容器,然后启动一个完整的 end-to-end 应用场景,并且会打印下面的日志
1 | Continue? [Y/n] |
等两分钟后命令会自动结束然后打印下面的日志
1 | Querying chaincode on peer1.org2... |
如果启动报错,建议先执行一次关闭网络操作清空数据
至此,fabric的环境搭建完成
名词解释
fabric ca
数字签名授权,任何一个操作都需要数字签名证书
fabric peer
节点,区块存储好的位置
ordering服务
创建区块,验证和排序服务
channel
每个channel都是独立的fabric实例,数据不互通
一个peer可以有多个channel,一个channel可能有多个peer
chaincode
智能合约,也称链码,chaincode属于某个channel
生命周期
- 安装install
- 实例化init
- 调用invoke
MSP
membership service provider,会员服务提供者,管理peer的身份和访问许可,每个peer都有自己的MSP证书
工作流程
提案
通过sdk向各个peer发起更新数据提案
背书
endorsing,足够多的peer发回响应给sdk
更新申请
sdk将更新申请发送给orderer
调用更新
orderer节点验证更新操作(消息队列)和数字证书没问题后各个peer执行更新数据
Chaincode链码
- 开发者必须同时实现chaincode的
Init
和Invoke
方法,chaincode编写完需要通过peer
的chaincode install
命令安装 - fabric 的数据以键值对的形式存放在
peer
的levelDB
中,可以切换为couchDB
链码的生命周期
- install:将已编写完成的链码安装在网络节点中。
- instantiate:对已安装的链码进行实例化。
- upgrade:对已有链码进行升级。链代码可以在安装后根据具体需求的变化进行升级。
- package:对指定的链码进行打包的操作。
- singnpackage:签名。
链码结构
node.js
1 | const shim = require('fabric-shim'); |
用NodeJs编写链码
创建目录
1 | mkdir /root/fish/chaincode/fishcc |
安装依赖
1 | cd /root/fish/chaincode/fishcc |
编写合约代码
1 | vi index.js |
示例:江苏省农牧厅渔业管理系统
1 |
|
用Golang编写链码
示例:两个账户转账与查询
1 | package main |
参考文档
视频:
https://www.bilibili.com/video/BV1554y1q7iE
https://www.bilibili.com/video/[BV1zt411H7qX](https://www.bilibili.com/video/BV1zt411H7qX)/
文档