注意:
环境搭建部分参考: https://www.cnblogs.com/studyzy/p/7437157.html
第一部分的环境搭建强烈建议大家看上面的链接, 博主也是看这篇文章搭建的, 写的很好!
强烈建议大家第一部分看原版!!!!!!!!!!!
百度下载即可, 完全免费!
网络设置:
将22端口转发到主机的2222端口, 之后就可以在主机上使用2222端口访问虚拟机的SSH的22端口了
ubantu 16.04下载地址
语言需要全部选择英文, 否则在后期的安装中会莫名报错, 导致安装不成功!
设置用户名为:
用户名: ubantu 密码: ubantu
安装服务器软件
其他请参考网上的ubantu安装教程, 百度很多的!
由于官网需要,所以可以使用国内的网站(版本1.9 )
请下载1.9+, 而不能是1.9或1.9以下, 否则ca服务将不能被安装!!! 坑!
Go下载地址
放入/usr/local目录下
解压
sudo tar -C /usr/local -xzf go1.9.linux-amd64.tar.gz
编辑用户变量
vi ~/.profile
添加以下内容:
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$HOME/go/bin
编辑保存并退出vi后,记得把这些环境载入:
source ~/.profile
文件应该是/etc/profile才好使
我们把go的目录GOPATH设置为当前用户的文件夹下,所以记得创建go文件夹
cd ~
mkdir go
(不知道为什么vi一直不能改文件,所以我将文件下载下来后, 再覆盖)
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get -y update
sudo apt-get -y install docker-ce
安装校验:
sudo docker version
结果展示:
Client:
Version: 17.03.0-ce
API version: 1.26
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 07:52:04 2017
OS/Arch: linux/amd64
Server:
Version: 17.03.0-ce
API version: 1.26 (minimum version 1.12)
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 07:52:04 2017
OS/Arch: linux/amd64
Experimental: false
sudo usermod -aG docker ubantu
注销重启:
sudo systemctl restart docker
Docker-compose是支持通过模板脚本批量创建Docker容器的一个组件。在安装Docker-Compose之前,需要安装Python-pip,运行脚本:
sudo apt-get install python-pip
然后是安装docker-compose
地址: https://github.com/docker/compose/releases
curl -L https://get.daocloud.io/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
sudo mv ~/docker-compose /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
我们可以使用Git命令下载源码,首先需要建立对应的目录,然后进入该目录,Git下载源码:
mkdir -p ~/go/src/github.com/hyperledger
cd ~/go/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
由于Fabric一直在更新,所有我们并不需要最新最新的源码,需要切换到v1.0.0版本的源码即可:
cd ~/go/src/github.com/hyperledger/fabric
git checkout v1.0.0
sudo groupadd docker
#添加docker用户组
sudo gpasswd -a $USER docker
#将登陆用户加入到docker用户组中
newgrp docker
#更新用户组
docker ps
#测试docker命令是否可以使用sudo正常使用
这个其实很简单,因为我们已经设置了Docker Hub镜像地址,所以下载也会很快。官方文件也提供了批量下载的脚本。我们直接运行:
cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0
这样就可以下载所有需要的Fabric Docker镜像了。由于我们设置了国内的镜像,所以下载应该是比较快的。
下载完毕后,我们运行以下命令检查下载的镜像列表:
docker images
我们仍然停留在e2e_cli文件夹,这里提供了启动、关闭Fabric网络的自动化脚本。我们要启动Fabric网络,并自动运行Example02 ChainCode的测试,执行一个命令:
./network_setup.sh up
这个做了以下操作:
编译生成Fabric公私钥、证书的程序,程序在目录:
fabric/release/linux-amd64/bin
基于configtx.yaml生成创世区块和通道相关信息,并保存在channel-artifacts文件夹。
基于crypto-config.yaml生成公私钥和证书信息,并保存在crypto-config文件夹中。
基于docker-compose-cli.yaml启动1Orderer+4Peer+1CLI的Fabric容器。
在CLI启动的时候,会运行scripts/script.sh文件,这个脚本文件包含了创建Channel,加入Channel,安装Example02,运行Example02等功能。
最后运行完毕,我们可以看到这样的界面:
如果您看到这个界面,这说明我们整个Fabric网络已经通了。
我们仍然是以现在安装好的Example02为例,在官方例子中,channel名字是mychannel,链码的名字是mycc。我们首先进入CLI,我们重新打开一个命令行窗口,输入:
docker exec -it cli bash
运行以下命令可以查询a账户的余额:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
可以看到余额是90:
然后,我们试一试把a账户的余额再转20元给b账户,运行命令:
peer chaincode invoke -o orderer.example.com:7050 --tls true --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 mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}'
运行结果为:
现在转账完毕, 我们试一试再查询一下a账户的余额,没问题的话,应该是只剩下70了。我们看看实际情况:
果然,一切正常。最后我们要关闭Fabric网络,首先需要运行exit命令退出cli容器。关闭Fabric的命令与启动类似,命令为:
cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli
./network_setup.sh down
至此,Fabric环境搭建完毕!
java链接时需要用到ca服务, 而官方的例子中并没有加载ca, 所以需要手动添加!
正常java客户端连接fabric网络需要使用该网络的7050/7051/7052/7053/7054
7050: 连接Orderer
7051: 连接Peer
7052: 未知(应该是不需要这个端口的)
7053: 连接PeerEventHub
7054: 连接ca
正常启动fabric网络的e2e_cli例子时, 我们在ubantu中输入命令:
netstat –ano
会发现只有前面几个被占用, 而7054没有使用, 经百度需安装ca服务(go版本必须1.9+):
参考自:
https://github.com/hyperledger/fabric-ca
原来的例子中没有ca, 需要自己安装:
参考自: https://blog.csdn.net/zhayujie5200/article/details/80221361
进入目录
/home/ubantu/go/src/github.com/hyperledger
下载ca服务
git clone https://github.com/hyperledger/fabric-ca.git
git checkout v1.1.0
下载之后如下图:
然后进入到该目录下的[fabric-ca]文件夹
make fabric-ca-server
make fabric-ca-client
会在…/fabric-ca/bin目录下生成fabric-ca-server和fabric-ca-client。接着进入bin目录对CA服务端进行初始化(格式: fabric-ca-server init –b 账号:密码):
初始化后在目录下生成:
msp :包含keystore,CA服务器的私钥
ca-cert.pem :CA服务端的证书
fabric-ca-server.db :CA默认使用的嵌入型数据库 SQLite
fabric-ca-server-config.yaml :CA服务端的配置文件
进入目录
参考自: https://blog.csdn.net/weixin_34015336/article/details/87153974
/home/ubantu/go/src/github.com/hyperledger/fabric/examples/e2e_cli
修改文件[docker-compose-cli.yaml], 添加ca容器
ca0:
image: hyperledger/fabric-ca
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
#/home/ubantu/go/src/github.com/hyperledger/fabric/fabric-ca/bin/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca0
- FABRIC_CA_SERVER_TLS_ENABLED=false
ports:
- "7054:7054"
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/${PRIVATE_KEY} -b admin:adminpw -d'
volumes:
- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: ca0
需要注意:
缩进要求极其严格!!如下图 (错误缩进会直接报错)
修改当前目录(e2e_cli)下的[network_setup.sh]文件
folder="crypto-config/peerOrganizations/org1.example.com/ca"
privName=""
for file_a in ${folder}/*
do
temp_file=`basename $file_a`
if [ ${temp_file##*.} != "pem" ];then
privName=$temp_file
fi
done
echo $privName
直接粘贴就行,否则很容易报语法错误, 不要作任何修改
如图:
此时启动后连接仍会报错, 需要关闭tls认证, 在生产环境中需要对tls进行特殊处理!
将在e2e/base内的两个文件里面分别做出如下修改
docker-compose-base.yaml ---- > ORDERER_GENERAL_TLS_ENABLED=false
peer-base.yaml ---- > CORE_PEER_TLS_ENABLED=false
对e2e/docker-compose-cli.yaml内的文件中同理修改
CORE_PEER_TLS_ENABLED=false
https://gitee.com/xugy/fabric-sdk-java-object/tree/master
将项目下载到本地, 导入到IDEA中
此时启动会报错:
出现问题:
com.google.guava
guava
23.6-jre
org.apache.httpcomponents
httpcore
4.4.8
在类FabricManager.java中修改obtainChaincodeManager()方法
private ChaincodeManager obtainChaincodeManager() throws IOException, NoSuchAlgorithmException, InvocationTargetException,
InstantiationException, InvalidKeySpecException, InvalidArgumentException, TransactionException,
IllegalAccessException, CryptoException, NoSuchProviderException, NoSuchMethodException, ClassNotFoundException {
FabricConfig fabric = new FabricConfig();
ChaincodeManager chaincodeManager = null;
chaincodeManager = fabric
.setUser("Admin")
.setChannelArtifactsPath(getChannelArtifactsPath("aberic"))
.setCryptoConfigPath(getCryptoConfigPath("aberic"))
.setPeers("Org1", "Org1MSP", "org1.example.com")
.addPeer("peer0.org1.example.com", "peer0.org1.example.com", "grpc://127.0.0.1:17051", "grpc://127.0.0.1:17053", "http://127.0.0.1:17054")
.setOrderers("example.com")
.addOrderer("orderer.example.com", "grpc://127.0.0.1:17050")
// .setChaincode("mychannel", "marble1", "github.com/hyperledger/fabric/aberic/chaincode/go/marbles02", "1.0")
.setChaincode("mychannel", "mycc", "github.com/hyperledger/fabric/core/chaincode/shim", "1.0")
.getChaincodeManager();
return chaincodeManager;
}
上面是配置了链接状态(我虚拟机中将子系统的7050映射到主机的17050中, 其他端口同理!)
链码地址:
此处重复上面的启动内容
给目录进行授权
sudo chmod 777 *(文件夹/文件名)
进入实例项目目录
cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/
运行实例
./network_setup.sh up
测试:
Ctrl + C 退出当前窗口
打开docker命令窗口
docker exec -it cli bash
查询账户a的余额
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
退出docker命令窗口, 并查看端口占用情况
exit
netstat –ap
将证书进行复制到java项目的src和target(防止文件复制不成功)目录中:
不复制的话会报错:
启动
强烈建议读本文章前, 阅读以下参考文章:
快速搭建一个Fabric 1.0的环境 - 深居蓝
Fabric CA的部署与使用 - Physicaloser
Fabric中集成ca - weixin_34015336
若还是未能成功, 请在下方评论提出问题!