区块链环境配置教程
一、安装CentOS
本例中采用虚拟化软件VMware Workstation安装CentOS 7.3(最小安装minimal)。实际应用中,单个服务器一般都设定为单一功能,比如Web服务器,数据库服务器,LDAP服务器等,或者多台服务器分布式部署云计算组件如Hadoop等,单个服务器只需要操作系统的基本功能,因此CentOS最小化安装符合需求,如果需要额外的功能,可以在使用过程中增加。云服务提供商(例如阿里云)提供的云服务器操作系统一般是CentOS minimal。
本例CentOS安装环境如下:
主机(Host Machine):CPU 8核,内存16G,操作系统Windows 10专业版64位
虚拟化软件:VMware Workstation 14 pro
到 https://www.centos.org/ 下载安装包,本例是CentOS-7-x86_64-DVD-1804.iso
1.1 安装前VMware设置
1、在VMware菜单“编辑-首选项”可以设置虚拟机默认放置的目录,应选择有足够空间的硬盘分区。本例中是 D:\MyVM(根据自己喜好设置虚拟机存放的位置)
2、创建虚拟机采用“自定义(高级)”配置,虚拟机名称(自己设置)。
3、选择安装来源时,载入CentOS的ISO后,VMware会自动识别出操作系统类型和版本。也可以选择“稍后安装操作系统”不采用简易安装,而采用手动安装。
4、为虚机分配处理器1个,内核数量2个,2G/4G(根据自己电脑内存大小)内存。本例中的这个虚机作为实验环境,将安装多种应用,因此配置较高。实验用虚机一般1核2G内存即可,可租用的轻量级云服务器一般是1核1G内存。实际应用虚机则根据需要分配资源,计算单元则对CPU要求较高,内容服务器则对内存要求较高。
5、使用NAT网络(默认选项),虚机没有与主机同级的IP地址。
桥接,NAT,仅主机模式,三者的简要区别如下:
(1)桥接:虚机与主机在网络中地位一样,虚机拥有与主机同级的独立IP地址。
(2)NAT:虚机共享主机的IP地址访问Internet,同一个主机中的各个虚机在同一网段中,可互相访问。外部无法直接访问虚机,但可通过主机的转接访问虚机。
(3)仅主机模式:同一主机中的各个虚机可互相访问,虚机无法访问Internet,外部也无法访问虚机。
6、I/O类型:默认LSI Logic,磁盘类型:默认SCSI,选择磁盘:创建新虚拟磁盘。
7、分配20G虚拟磁盘空间,存为单独文件(非默认选项)。
8、指定虚机磁盘文件,保持默认。
9、开始安装时,可能会提示要更改BIOS设置以支持64位操作系统之类的,按照提示修改主机BIOS设置,再回来安装。
注意:一般新的电脑无需设置自动支持64位虚拟化,有些电脑需要在BIOS里设置以支持64位虚拟化,有些更旧的电脑完全不支持64位虚拟化,则无法在VMware里安装64位的操作系统。
设置完成如上图,点击“完成”开始安装。
1.2 安装过程
注意:安装过程中,鼠标点击虚机界面即可进入虚机操作,组合键ctrl + alt 可使鼠标返回主机。在VMware Workstation窗口的左下角会有提示。
1、安装过程与在真实裸机上安装一样,初始界面按键“i”选择“Install CentOS”,然后回车进入安装过程。
2、选择语言:保持默认 English - Englisth (United States)
3、如下图所示,设置安装选项:
Date & Time 选到 Asian / Shanghai
Language Support 可以把中文,简体中文(中国)选上
Software Selection 保持Minimal Install不变
Installation Destination 需要点开,默认是自动配置磁盘,不需要修改,直接点“Done”按钮返回即可,黄色的感叹号才会消失,此界面右下角“Begin Installation”按钮才会亮起。
Network & Hostname 点进去,如果有显示有线网络ens33之类的,打开ON
KDUMP可以设置为Disabled,保持默认也可以。
设置完成后,点击右下角“Begin Installation”按钮开始安装。
4、安装的过程中给root用户设置密码(4geT%not),非必需。如果密码太弱,需点击两次确定才能完成操作。
新建一个用户admin(密码d00r%Key),勾选“Make this user administrator”,今后的常用登录用户。如果密码太弱,需点击两次确定才能完成操作。
安装完成,点击“Reboot”重新启动。
5、系统是最小化安装,没有GUI,默认以admin登录,安装完成。
非必需:虚机屏幕有时候不匹配VMware的窗口,需要拉动窗口的滚动条才能看见全部的虚机屏幕内容。从VMware菜单“电源 - 关闭客户机”,然后再开启此虚机,可解决这个问题。
1.3 忘记密码
下面是CentOS 7的root密码修改
开机按esc
选择CentOS Linux (3.10.0-693…) 按 e 键
光标移动到 linux 16 开头的行,找到 ro 改为 rw init=sysroot/bin/sh
按 Ctrl+x 执行
进入后输 chroot /sysroot
输入 passwd
根据提示输入2次新密码
完成后输入 touch /.autorelabel 更新系统信息
exit
reboot 重启
重启过程慢,耐心等等
重启后用新密码登录
二、基本系统设置
2.1 安装后设置
2.1.1 关于用户
目前系统里有2个用户,root是超级管理员,一般不用此账号登录;admin是常用用户,系统管理员。
系统提示符为 # 表明用户为root,提示符为$ 表明用户为其他用户。
每个用户都有自己的主目录,以 ~表示,root用户是 /root,其他用户是 /home/用户名。例如admin输入命令 cd ~ 则会进入其主目录 /home/admin
admin需要执行root权限的命令时,可以用 sudo 临时获得权限,也可以用 su 切换身份为root。
使用sudo时,需要输入admin用户自己的密码,使用 su时,需要输入root用户的密码,使用“sudo su”则可以使用admin自己的密码切换到root用户身份,在root用户没有设置密码时,这个方法很好用。
1、使用sudo不需要输入密码
$ sudo visudo -f /etc/sudoers
如下修改内容,在 %wheel ALL=(ALL) ALL 前加注释符#,去掉 %wheel ALL=(ALL) NOPASSWD:ALL 前的注释符。保存退出就行了。
这是针对wheel这个组的设置,这个组的成员都不需要输入密码就可以使用sudo,admin是wheel组的成员。
传统修改方法是在 root ALL=(ALL) ALL 下面增加一行 admin ALL=(ALL) NOPASSWD:ALL 但在这里会被 %wheel ALL=(ALL) ALL 覆盖掉。原因是在安装过程中,创建 admin用户时使其成为管理员,便成为了 wheel组的成员。系统只允许wheel组的用户来执行“su”命令登录为root用户,而让其他组的用户即使执行“su”、输入了正确的root密码,也无法登录为root用户。
用visudo编辑sudoers文件是正确的做法。有些做法是增加文件sudoers的写权限,用vi修改,再去掉其写权限。可能会出现文件权限错乱,如下恢复sudoers文件的正确属性:
$ sudo chmod 0440 /etc/sudoers
2.2.2 连接网络,更新系统
查找配置网络文件
$ ls /etc/sysconfig/network-scripts/
看到有形如 ifcfg-ens33 或 ifcfg-eth0 这样的文件,修改
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33
把 ONBOOT=no 改成 yes 即可,保存退出。
重启网络服务,应用设置,就可以联网了。安装时选择的是NAT方式,因此是使用主机的IP地址连接到Internet。
$ sudo systemctl restart network.service
更新系统
$ sudo yum update
首先会查询要更新哪些内容,询问是否OK,确认后开始更新。
安装必备系统组件perl,gcc,kernel-devel,wget,yum-utils,net-tools
$ sudo yum -y install perl gcc kernel-devel wget $ sudo yum -y install yum-utils $ sudo yum -y install net-tools yum install -y install unzip zip
更新完毕后,可以重新启动一下系统
$ sudo systemctl reboot
2.2 网络设置
安装net-tools包,以便后续使用ifconfig命令
$ sudo yum -y install net-tools
三、区块链的环境搭建
搭建Hyperledger fabric环境
搭建过程
3.1 Go安装。(官网地址:https://golang.google.cn/dl/ )
- 下载安装包
箭头所指地址+自己系统所对应的版本。使用wget命令。
以我自己安装的为例,图中椭圆框中即为我所安装版本。
所以下载命令为:
wget https://golang.google.cn/dl/go1.18.5.linux-amd64.tar.gz
- 解压安装包到指定路径
将下载的压缩包通过下面命令进行解压,一定注意大小写(否则可能导致安装失败)
tar -xzvf go1.18.5.linux-amd64.tar.gz -C /usr/local/
- 设置环境变量
使用vi /etc/profile 编辑profile文件。
添加以下内容到profile 文件中(gopath应提前创建好,或者配置完成后别忘了创建)
#go setting export GOROOT=/usr/local/go export GOPATH=/usr/local/gopath export PATH=$PATH:$GOROOT/bin
保存并退出。
source /etc/profile #使文件立即生效。
在gopath路径下使用mkdir创建三个文件,即mkdir src bin pkg。
其中bin存放编译后的可执行文件;pkg存放编译后的包文件;src存放项目源文件。
查看是否安装成功
go version
编辑hello.go文件测试.
vi /usr/local/gopath/src/hello.go
在hello.go中编写如下代码:
package main import "fmt" func main() { ` `fmt.Println("Hello world!") }
保存并退出。
go run hello.go
显示Hello world!正确执行。截止到此,安装GO语言环境完成。
3.2 docker安装
第一种方式:curl -fsSL https://get.docker.com/ | sh 比较快捷,但是可能会因为无法访问国外的镜像而出错。如果不能安装,就是用第二种方式。
第二种方式(推荐):
如果以前安装过docker,请先卸载或删除所有依赖关系。如果没装过跳过此过程。
yum list installed | grep docker;查看所有安装的docker程序
yum -y remove+要删除程序的完整名称(如果安装的比较多,这个过程可能有点麻烦)
rm -rf /var/lib/docker:删除镜像容器。
输入Docker version出现如下图所示字样,表明已卸载干净。
然后开始安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装阿里镜像源 yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin #(默认安装的是最新版的)
查看版本信息
systemctl start docker #启动docker systemctl enable docker #将docker设置为开机自启,以便后续操作不会出错。
安装docker-compose
因为上面安装docker的命令中docker-compose-plugin是以插件的形式安装docker compose,现在是独立安装docker compose。
独立安装后的docker compose 命令为 : docker-compose xxx
插件安装后的docker compose命令为: docker compose xxx
如果是Linux系统建议单独安装一下。
1.下载docker-compose
命令:
curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86\_64 -o /usr/local/bin/docker-compose
也可以下载别的版本,只需将命令行中v2.11.2换成自己想装的版本即可。
2. 给docker-compose文件添加可执行权限
命令:
chmod +x /usr/local/bin/docker-compose
3. 添加软连接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
4.查看版本
Docker-compose version
3.3 nodejs安装
去这个网站https://nodejs.org/dist/找到自己想安装的版本。
复制整个网址,使用以下命令下载,例如我下载的:
Wget https://nodejs.org/dist/v16.14.1/node-v16.14.1-linux-x64.tar.gz
2.解压
tar -xzvf node-v16.14.1-linux-x64.tar.gz -C /usr/local/ cd /usr/local mv node-v10.19.0-linux-x64/ nodejs
3.vi /etc/profile 增加环境变量
export NODE\_HOME=/usr/local/nodejs export PATH=$NODE\_HOME/bin:$PATH
保存并退出
source /etc/profile 使文件立即生效。
4. 查看版本
node -v npm -v
5.设置淘宝镜像源
npm config set registry https://registry.npm.taobao.org
6.which node、 whereis node 查看有无 node、npm等命令
7. 安装全局 pm2
npm install -g pm2
8. 查看 有无 pm2命令 , pm2 版本
下载源代码
因为要用到git,所以需要先安装git。
yum install git
下载相关镜像文件。
在想要安装fabric的目录下运行以下命令来下载fabric (时间可能会有点久)
git clone https://github.com/hyperledger/fabric.git
(git clone克隆时出现fatal: unable to access ‘https://github.com/**‘: TCP connection resset by peer)
解决方法:
##发生这种情况是git设置了代理,取消代理即可
[root@hya ~]# git config --global --unset http.proxy [root@hya ~]# git config --global --unset https.proxy
下载完成后会得到一个fabric文件夹,进入fabric/scripts目录可以看到一个bootstrap.sh脚本(注意刚开始是没有fabric-samples这个文件夹的,是执行脚本后生成的)
直接执行bootstrap.sh脚本,就会自动进行fabric相关镜像的下载 (时间有点久,如果出现长时间停顿,可能需要重启虚拟机后重新执行脚本)
当相关镜像全部下载完成后,会自动罗列出下载的内容
构建网络
Fabric 1.x.x版本的应该是进入fabric/scripts/fabric-samples/first-network/
Fabric2.x.x版本的进入fabric/scripts/fabric-samples/test-network/
执行以下命令,开启测试网络:
./network.sh down ./network.sh up
创建信道
./network.sh createChannel
下载go依赖
export GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct
查看是否切换成功:
go env
进入链码所在路径:
cd /usr/local/go/fabric/scripts/fabric-samples/asset-transfer-basic/chaincode-go
下载依赖:
go mod vendor
四、在通道上启动链码chaincode(智能合约)
切换回 /fabric-samples/test-network 目录:
./network.sh deployCC -ccn basic -ccp …/asset-transfer-basic/chaincode-go -ccl go
如果出现下图所示情况:
解决方案
下载并安装EPEL
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -ivh epel-release-latest-7.noarch.rpm
# 检查是否已添加至源列表
yum repolist
安装jq
yum install jq
五、与网络交互
首先确保自己位于test-network目录下。
进入CLI容器,进行invoke交互,需要几行命令设置CLI的路径:
export PATH=${PWD}/../bin:$PATH export FABRIC\_CFG\_PATH=$PWD/../config/
先设置为org1的环境变量进行交互:
export CORE\_PEER\_TLS\_ENABLED=true export CORE\_PEER\_LOCALMSPID="Org1MSP" export CORE\_PEER\_TLS\_ROOTCERT\_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CORE\_PEER\_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp export CORE\_PEER\_ADDRESS=localhost:7051
用下面的命令初始化账本:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'
使用下面的命令查找账本:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
通过命令改变一笔资产的所有者:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'
六、关闭测试网络
./network.sh down
到此区块链的基础环境配置已全部结束,感谢您的浏览!!!!!!!!!!!!