Ubuntu Server搭建Hyperledger Fabric 2.1学习环境
最近在学习Hyperledger Fabric,它是由 Linux 基金会发起创建的开源区块链分布式账本。
Hyperledger Fabric是一个开源区块链实现,开发环境建立在 VirtualBox 虚拟机上,部署环境可以自建网络,也可以直接部署在 BlueMix 上,部署方式可传统可 Docker 化,共识达成算法插件化,支持用 Go 和 JavaScript 开发智能合约,尤以企业级的安全机制和 membership 机制为特色。
今天来聊聊怎么搭建一个基于Ubuntu Server的Hyperledger Fabric吧。
01 基本环境配置
建议用虚拟机装一个Ubuntu Server版本即可,不要装图形界面,那个太卡了。Ubuntu Server版本安装的时候注意,选择英文版本的,中文简体安装会出错。
安装好后记得换源成阿里云的,这里换的时候由于虚拟机上不支持复制黏贴,只能手动输入一下啦:
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
换源后把下面的软件装上:
- ssh
- git
- go
- node.js
- docker
- docker-compose
注意大部分只需要sudo apt-install即可安装,go、docker这种百度一下就知道怎么装了,就不展开讲了。nodejs记得给升级到最新版本。
02 fabric环境搭建
现在网上关于fabric的教程大部分是基于1.4版本的,今天来演示下搭建2.1版本的Fabric环境进行学习。
2.1 下载fabric源码
进入GO的目录创建hyperledger文件夹:
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger/
然后下载fabric的源码,注意这里用码云Gitee的链接,GitHub的太慢了得下到明年去:
git clone https://gitee.com/mirrors/fabric.git
不知道为啥我这gitee也好慢啊。。。
将 fabric 切换至 2.1 版本:
cd fabric/
git branch -a
git checkout release-2.1
记得加个sudo,没有管理员权限啥都干不了。
2.2 下载fabric-samples源码、fabric镜像
cd scripts/
sudo ./bootstrap.sh
然后就进入了漫长的等待了。fabric-samples是从GitHub上下载的,可能会比较慢。下载完成后会列出所有下载的docker镜像。
2.3 网络测试
上面的工作完成后,当前目录多了一个fabric-samples文件夹,我们进去该目录下的test-network目录测试下搭建的环境是否成功:
cd fabric-samples/
cd test-network/
然后启动我们的测试网络:
sudo ./network.sh up
记得加sudo保平安哦。开始了一堆代码之后出现:
说明创建成功了。
03 Fabcar测试
fabcar是一个小demo,我们这里运行它测试下看看。我们回到fabric-samples目录下,然后进入/fabcar目录中,先把网络给清理一下,然后启动:
sudo ./networkDown.sh
sudo ./startFabric.sh
可能存在的问题
问题1
当然了你可能会遇到问题,比如找不到go命令等,这是因为sudo命令会重置当前的环境变量,导致设置go找不到。
Error: failed to normalize chaincode path: failed to determine module root: exec: "go": executable file not found in $PATH
!!!!!!!!!!!!!!! Chaincode packaging on peer0.org1 has failed !!!!!!!!!!!!!!!!
根据网上解决sudo环境变量问题的方法,在自己的shell配置文件中如下设置
vim ~/.bashrc 添加如下
alias sudo='sudo env PATH=$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH'
然后刷新下让配置生效:
source ~/.bashrc
问题2
安装golang fabric api依赖包的时候,长时间无响应,最后报如下错误:
go: github.com/hyperledger/fabric-contract-api-go@v1.0.0: Get https://proxy.golang.org/github.com/hyperledger/fabric-contract-api-go/@v/v1.0.0.mod: dial tcp 172.217.27.145:443: i/o timeout ~/fabric-samples/test-network Finished vendoring Go dependencies ++ peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go/ --lang golang --label fabcar_1 ++ res=1 ++ set +x Error: failed to normalize chaincode path: 'go list' failed with: go: github.com/hyperledger/fabric-contract-api-go@v1.0.0: Get https://proxy.golang.org/github.com/hyperledger/fabric-contract-api-go/@v/v1.0.0.mod: dial tcp 172.217.27.145:443: i/o timeout: exit status 1 !!!!!!!!!!!!!!! Chaincode packaging on peer0.org1 has failed !!!!!!!!!!!!!!!!
ERROR !!! Deploying chaincode failed
解决办法:
golang1.13.x 可以直接执行:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
finally,终于成功了:
04 SDK交互
在上一步执行成功后,会输出各个语言环境下的SDK交互实例,比如JavaScript是这样的:
JavaScript:
Start by changing into the "javascript" directory:
cd javascript
Next, install all required packages:
npm install
Then run the following applications to enroll the admin user, and register a new user
called appUser which will be used by the other applications to interact with the deployed
FabCar contract:
node enrollAdmin
node registerUser
You can run the invoke application as follows. By default, the invoke application will
create a new car, but you can update the application to submit other transactions:
node invoke
You can run the query application as follows. By default, the query application will
return all cars, but you can update the application to evaluate other transactions:
node query
可以选择javascript,typescript,javago语言与网络交互,这里用javascript试试。进入fabcar中的javascript目录中,这里得切换到root用户,我也不知道sudo为什么还存在权限问题,执行:
cd javascript/
su
npm install
安装相关的依赖。完成后我们按照合约流程依次启动:
注册管理员账号:
sudo node enrollAdmin.js
注册用户:
sudo node registerUser.js
我们接下来,执行一笔交易
sudo node invoke.js
查询交易后的状态:
sudo node query.js
完成啦!!!至此,Fabric的环境已经搭建完成。大家可以在上面愉快的学习了。
参考资料
最新超详细的 Hyperledger Fabric2.2 环境搭建部署
https://blog.csdn.net/shengsikandan/article/details/107656060
fabric2.1.0 打包chaincode 报错
https://blog.csdn.net/qq_32247229/article/details/108860823
go 提示failed to normalize chaincode path
https://www.jason-z.com/post/165
ubuntu16.04下搭建fabric 1.4.3环境
https://blog.csdn.net/Sun_Hui_/article/details/100928155
- PySide——Python图形化界面入门教程(三)
- 用代码生成Glitch Art风格的抖音字体
- PySide——Python图形化界面入门教程(四)
- PySide——Python图形化界面入门教程(五)
- PySide——Python图形化界面入门教程(六)
- Python写的嗅探器——Pyside,Scapy
- 使用sklearn构建含有标量属性的决策树
- 利用Python sklearn的SVM对AT&T人脸数据进行人脸识别
- C/C++网络编程时注意的问题小结
- PHP防止SQL注入的方法
- HTML5离线缓存攻击测试
- IE的BHO通过IHTMLDocument2接口获得网页源代码
- 【C++】小心使用文件读写模式:回车('r') 换行('n')问题的一次纠结经历
- 【C】用C语言提取bmp图片像素,并进行K-means聚类分析——容易遇到的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用C++跟你聊聊“桥接模式”
- 用C++跟你聊聊“单例模式”,类的“计划生育”
- django-HttpResponse,render,redirect
- django-ForeignKey,OneToOneField,ManyToManyField
- 用C++跟你聊聊“备忘录模式” ,如果能重来,我要···
- 数据库(一)--通过django创建数据库表并填充数据
- springmvc之异常处理中ExceptionHanderExceptionResolver
- 【tensorflow2.0】损失函数losses
- 如何在python文件中测试sql语句
- 用C++跟你聊聊“适配器模式”
- 【tensorflow2.0】评价指标metrics
- 数据库(二)--多对多相关操作
- 【tensorflow2.0】优化器optimizers
- 数据库(三)--多对多,一对多,一对一
- 【tensorflow2.0】回调函数callbacks