从0搭建Hyperledger Fabric和Java Demo

Fabric环境搭建

注意:

环境搭建部分参考:  https://www.cnblogs.com/studyzy/p/7437157.html
第一部分的环境搭建强烈建议大家看上面的链接, 博主也是看这篇文章搭建的, 写的很好! 
强烈建议大家第一部分看原版!!!!!!!!!!!

1. 安装virtualBox虚拟机

百度下载即可, 完全免费!

网络设置:

将22端口转发到主机的2222端口, 之后就可以在主机上使用2222端口访问虚拟机的SSH的22端口了

从0搭建Hyperledger Fabric和Java Demo_第1张图片

2. 安装Ubantu 16.04

ubantu 16.04下载地址
从0搭建Hyperledger Fabric和Java Demo_第2张图片
语言需要全部选择英文, 否则在后期的安装中会莫名报错, 导致安装不成功!
设置用户名为:

用户名: ubantu 密码: ubantu

安装服务器软件
从0搭建Hyperledger Fabric和Java Demo_第3张图片
其他请参考网上的ubantu安装教程, 百度很多的!

3. 安装Go

由于官网需要,所以可以使用国内的网站(版本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一直不能改文件,所以我将文件下载下来后, 再覆盖)

4. 安装Docker

(1) 安装一些必要的系统工具

sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

(2) 安装GPG证书

curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

(3) 写入软件源信息

sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

(4) 更新并安装 Docker-CE

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

从0搭建Hyperledger Fabric和Java Demo_第4张图片
修改为当前用户:

sudo usermod -aG docker ubantu

注销重启:

sudo systemctl restart docker

5. 安装Docker-Compose

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

6. 下载Fabric源码

我们可以使用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

7. Fabric Docker镜像下载

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

得到的结果如下:
从0搭建Hyperledger Fabric和Java Demo_第5张图片

8. 启动Fabric网络并完成ChainCode测试

我们仍然停留在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等功能。
最后运行完毕,我们可以看到这样的界面:
从0搭建Hyperledger Fabric和Java Demo_第6张图片
如果您看到这个界面,这说明我们整个Fabric网络已经通了。

9. 手动测试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"]}'

运行结果为:
从0搭建Hyperledger Fabric和Java Demo_第7张图片
现在转账完毕, 我们试一试再查询一下a账户的余额,没问题的话,应该是只剩下70了。我们看看实际情况:
在这里插入图片描述
果然,一切正常。最后我们要关闭Fabric网络,首先需要运行exit命令退出cli容器。关闭Fabric的命令与启动类似,命令为:

cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli
./network_setup.sh down

至此,Fabric环境搭建完毕!

2. Fabric Java Demo

java链接时需要用到ca服务, 而官方的例子中并没有加载ca, 所以需要手动添加!

1. 为fabric网络安装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

1. 部署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

下载之后如下图:
从0搭建Hyperledger Fabric和Java Demo_第8张图片
然后进入到该目录下的[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服务端的配置文件

2. 配置随项目启动

进入目录
参考自: 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

在这里插入图片描述
需要注意:
缩进要求极其严格!!如下图 (错误缩进会直接报错)
从0搭建Hyperledger Fabric和Java Demo_第9张图片
修改当前目录(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

直接粘贴就行,否则很容易报语法错误, 不要作任何修改
如图:
从0搭建Hyperledger Fabric和Java Demo_第10张图片

2. 关闭tls认证

此时启动后连接仍会报错, 需要关闭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

在这里插入图片描述
从0搭建Hyperledger Fabric和Java Demo_第11张图片
从0搭建Hyperledger Fabric和Java Demo_第12张图片
从0搭建Hyperledger Fabric和Java Demo_第13张图片

3. 样板java项目

1. 导入

https://gitee.com/xugy/fabric-sdk-java-object/tree/master
将项目下载到本地, 导入到IDEA中

2. 错误处理

此时启动会报错:
出现问题:

  1. 找不到sk文件 + No peers go get config block
    每次启动都需要将fabric中的例子的两个文件夹复制到项目中:
    从0搭建Hyperledger Fabric和Java Demo_第14张图片
    注意: 需要将原来的项目中的文件进行删除后再导入
  2. java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
    添加依赖


    com.google.guava
    guava
    23.6-jre


    org.apache.httpcomponents
    httpcore
    4.4.8

3. 修改项目

从0搭建Hyperledger Fabric和Java Demo_第15张图片
从0搭建Hyperledger Fabric和Java Demo_第16张图片

4. 项目配置

在类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中, 其他端口同理!)
从0搭建Hyperledger Fabric和Java Demo_第17张图片
链码地址:
从0搭建Hyperledger Fabric和Java Demo_第18张图片

4. 启动网络/java项目

1. 启动fabric网络

此处重复上面的启动内容

给目录进行授权

sudo chmod 777 *(文件夹/文件名)

进入实例项目目录

cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/

运行实例

./network_setup.sh up	

从0搭建Hyperledger Fabric和Java Demo_第19张图片
测试:
Ctrl + C 退出当前窗口
打开docker命令窗口

docker exec -it cli bash	

查询账户a的余额

peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

退出docker命令窗口, 并查看端口占用情况

exit
netstat –ap

从0搭建Hyperledger Fabric和Java Demo_第20张图片

2. 启动java项目

将证书进行复制到java项目的src和target(防止文件复制不成功)目录中:
从0搭建Hyperledger Fabric和Java Demo_第21张图片
在这里插入图片描述
不复制的话会报错:
在这里插入图片描述
启动
从0搭建Hyperledger Fabric和Java Demo_第22张图片

3. 启动效果

从0搭建Hyperledger Fabric和Java Demo_第23张图片

强烈建议读本文章前, 阅读以下参考文章:

快速搭建一个Fabric 1.0的环境 - 深居蓝
Fabric CA的部署与使用 - Physicaloser
Fabric中集成ca - weixin_34015336

若还是未能成功, 请在下方评论提出问题!

你可能感兴趣的:(fabric)