Hyperledger Fabric学习笔记——7.链码安装实例化执行

Posted polarday.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hyperledger Fabric学习笔记——7.链码安装实例化执行相关的知识,希望对你有一定的参考价值。

1.智能合约

  • 执行环境:以太坊虚拟智能合约执行环境EVM,fabric执行环境是docker

  • 链码

    • 是应用层和区块链底层的中间点
    • 每一个链码执行环境是一个独立的docker
    • 使用GRPC协议与背书节点通信,只有背书节点才能运行智能合约
  • 链码的生命周期

    • 打包:智能合约的编写和编译
    • 安装:将打包好的文件,上传到背书节点
    • 实例化:实际安装,执行Init方法,只执行一次,构造函数
    • 升级:升级和修复链码
    • 交互:自己定义的方法的调用
  • 链码的交互流程

  • 系统链码(CC:chaincode)

    • LSCC:管理链码的生命周期
    • CSCC:配置管理链码,管理链的配置
    • QSCC:查询账本存储,是一个区块索引的外部服务
    • ESCC:交易背书的链码,交易执行后的链码进行封装签名,给客户端返回背书交易结果
    • VSCC:交易验证的链码
  • 链码编程的接口

    • Init():链码初始化,只执行一次
    • Invoke() :链码的业务逻辑的编写
    • 上面2个方法参数一样,参数是SDK的接口
  • 链码SDK的接口

    • 写代码再看
  • 一些注意点

    • 分布式多机多节点执行,链码会执行多次
    • 不写随机函数,交易会无效,多次执行不一样
    • 不写系统时间,多机时间不一定一样

2.网络搭建配置的实现

  • crypto-config.yaml:用于配置节点的个数,参考firstnetwork编写
  • 编写好后,传到linux对应目录
  • 进入deploy目录,设置工作目录为当前目录
    export FABRIC_CFG_PATH=$GOPATH/src/fabric_asset/deploy
  • 指定按照yaml文件生成配置
    cryptogen generate --config=./crypto-config.yaml

  • configtx.yaml:用于区块联盟中的组织信息,配置名字和证书等的位置,参考firstnetwork编写

  • 编写好后,传到linux对应目录

  • 创建用于存放配置的目录
    mkdir config

  • 生成系统链的创世区块
    -profile:指定联盟配置
    -outputBlock:指定存放的位置
    configtxgen -profile OneOrgsOrdererGenesis -outputBlock ./config/genesis.block

  • 生成通道的创世交易
    -profile:指定业务联盟
    -outputCreateChannelTx:指定存放路径
    -channelID:指定创建名字
    configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./config/mychannel.tx -channelID mychannel

  • 生成两个组织锚节点的交易信息
    configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./config/Org0MSPanchors.tx -channelID mychannel -asOrg Org0MSP
    configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./config/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP


  • 新建docker-compose.yaml文件并移动到deploy目录下

3.启动网络

  • 启动docker,后台运行(要以管理员身份运行)
    docker-compose up -d

  • 查看orderer节点的运行日志
    docker logs orderer.example.com

  • 与客户端交互操作
    docker exec -it cli bash

  • 创建通道
    -o:指定与哪个orderer节点通信
    -c:指定创建的通道名称
    -f:指定使用的文件
    peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/config/mychannel.tx

  • 加入通道
    peer channel join -b mychannel.block

  • 查看peer加入的通道列表
    peer channel list

  • 指定主节点
    peer channel update -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/config/Org1MSPanchors.tx


  • 安装链码
    -n:安装的名字
    -v: version
    -l:使用语言
    -p:path
    peer chaincode install -n badexample -v 1.0.0 -l golang -p github.com/chaincode/badexample
  • 克隆一个会话,交互执行peer0,查看安装的链码
    docker exec -it peer0.org1.example.com bash
    cd /var/hyperledger/production/chaincodes/
  • 链码实例化
    peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n badexample -l golang -v 1.0.0 -c '"Args":["init"]'
  • 链码交互执行
    peer chaincode query -C mychannel -n badexample -c '"Args":[]'
  • 多次执行查询,得到的结果不同,因为invoke()中使用了随机数,不要这么做

4.网络关闭

  • 退出客户端
    exit
  • 在deploy目录下关闭docker
    docker-compose down

《HyperLedger Fabric 2.3 联盟链搭建》 课程学习笔记

课程平台:51CTO
课程讲师:大头娃
课程介绍:从零开始讲解了联盟链的搭建和链码的操作。让大家真正掌握联盟链的搭建与链码部署、调用流程。

一、Hyperledger Fabric联盟链介绍

1.1使用场景

区块链的数据是公开的,但是在有些行业例如:银行、医疗。这些私人数据不能完全公开,或者建立权限机制进行有选择性的公开。默认在区块链中所有的节点都需要维护账本,并审核与其他成员的交易进展,这个过程低效而昂贵。Hyperledger则不同,采用超级节点来完成记账功能。

1.2产生背景

公有链缺点:
1.数据完全公开
2.所有节点参与运算成本大
3.不支持私下机密交易

根据以上缺点,Hyperledger的设计以产业应用为重点,解决现有缺点,扩展了行业先行原有的功能。
Hyperledger对传统区块链模型进行了革新,其中包括管理参与者的访问许可权.换句话说: Hyperledger是有权限的共享账本.Hyperledger为身份识别、审核、即隐私提供了一个安全,健康的模型.从而缩短运算周期.实现有效扩展.应对行业内各种要求.

一个覆盖众多网络的世界
我们希望能够出现众多的区块链网络,使得每个网络账本都能执行不同的业务,基于这一期望值,而出现了Hyperledger,现在单一普遍的通用网络已经出现.
但是网络与网络之间的通信还尚未有实例.会员就是在个个网络中的通,Hyperledger,除了能够实现这种网络独立运行之外.
还有寻址系统.能够通过一个账本的交易.发现并利用另一个本中正当的交易与智能合约

1.3联盟链优缺点

优点
(1)可控制性强
与公有链相比,其由于节点一般都是海量的,一旦形成区块链,那么区块数据将不可篡改,比如比特币节点太多,想要篡改区块数据几乎是不可能的;而联盟链中只要联盟内的所有机构中的大部分达成共识,即可将区块数据进行更改。
(2)半中心化
联盟链在某种程度上只属于联盟内部的成员所有,因其节点数量是有限的,所以很容易达成共识。
(3)交易速度快
从本质上讲联盟链还是私有链,但因为它节点数量限制,达成共识容易,因此交易时速度也是非常快的。
(4)数据不会默认公开
与公有链不同,联盟链的数据只限于联盟内部机构及其用户才有权限进行访问。
缺点
(1)由于联盟链半中心化结构的原因,它很容易被恶意玩家所攻击。可能出现多个参与者合谋的情况。
(2)缺少行业统一标准,在解决方案上免不了会有各种障碍,但是目前整个生态距离联盟链的统一框架还是很遥远。
(3)对于大型的综合性企业,由于他们在应用场景方面灵活性差。要想启动一个新的联盟,必须要经过所有成员的协议批准,然而,大型企业流程多,约束条件繁杂,因此多个大型企业之间建立这种通用网络非常缓慢。

1.4联盟链基本架构


Fabric系统是通过组织来划分的,每个组织内都包含承担不同功能的Peer节点,每个Peer节点又可以担任多种角色。所有的组织共用一个统一的Orderer集群。

1.Endorser Peer(背书结点)︰每个链码在实例化的时候都会设置背书策略(Endorsement policy),指定哪些节点对交易背书才有效。
2.Leader Peer (主节点)∶主节点负责和Orderer排序服务节点通信,从排序服务节点处获取最新的区块并在组织内部同步。
3.Committer Peer(记账节点)︰负责验证从排序服务节点接收的区块里的交易,然后将块提交(写入/追加)到其通道账本的副本。
4.Anchor Peer(锚节点)︰在一个通道( channel )上可以被所有其他peer发现的peer5.Order Peer(排序节点)︰排序服务节点接收包含背书签名的交易,对未打包的交易进行排序生成区块,广播给Peer主节点。

1.5 基本要求

(1)网络权限的需求
发行机关根据网络的目的来确定适当的访问权限,而这种权限需要进行身份识别,然后才能在网络进行交易。网络公开运行,且容易融入到移动应用中。它能够私有运行,只有通过权限验证才能熟悉其情况。而且可以根据需求来设置不同级别的权限。
(2)隐私及机密的重要性
我们相信任何区块链架构有一个基本要求,那就是网络上任何一方的身份及行为模式,都不允许未经授权的人通过账本来打探情况。我们也希望能够保证区块链用户的业务逻辑和其它交易参数的机密性。做到除了合约涉及的利益相关方,没有其它人能够访问这些数据。

1.6 Hyperledger专业名词介绍

chainCode-链码
实际上就是公有链中的智能合约,链码是一个运行在账本上的软件,它可以对资产进行编码,其中的交易指令(或者业务逻辑),也可以用来修改资产。
Channel-通道
通道构建在Fabric网络上的私有区块链。实现了数据的隔离保密,通道指定的账本在通道中是与所有对等节点共享的,并且交易方必须通过该通道的正确验证才能与账本进行交互,通道是由一个"配置块"来定义的。
Gengsis Block -创世区块
Genesis Block是初始化区块链网络或者channel的配置区块.也是区块链上的第一个区块
Fabric-ca证书
Fabric-ca是默认的证书管理组件,它向网络成员及其用户颁发基于PKl的证书。
客户端(App)
客户端应用使用SDK来跟Fabric网络打交道。首先,客户端从CA获取合法的身份证书来加入到网络内的应用通道。超级账本Fabric已经拥有了多种语言的SDK。这些SDK封装了对底层gRPC接口的调用,可以提供更完善的客户端和开发支持,包括Node.Js、Python、Java、Go等多种实现。
Invoke -调用
用于调用chainCode内的函数,ChainCode invoke就是一个交易,Proposal,然后执行模块化的流程(背书、共识、验证、提交)。invoke的结构就是一个函数和一个参数数组。
Ledger-账本
Ledger是一个channel的chain,和由channel中每个peer维护的数据库。

二、Go语言基础语法

老师说也可以参考菜鸟教程
第2章02 Go代码体系介绍

//定义了包名,此文件属于哪个包,每个o程序都包含一个名为main的包
package main
// go编译器当前程序需要引用那些包(系统包,第三方包,用户自定义)
import "fmt"
//main函数,go语言的入口必须在main包
func main()
	/*Println:面数主要用于输出内容
	2:go基于面数式编程
	*/
	fmt.Println( "Hello, world! ")
	fmt.Print("Hello,world!")
	fmt.Printf("%s d","Hello,world", 2018)


问题1:如果运行出错“go: cannot find GOROOT directory: c: \\go
”,需要配置GOROOT根目录。配完之后需要重启。
第2章03数组、循环
第2章04函数
第2章05指针
第2章06结构体
第2章07接口、new使用
第2章08自定义包

go语言总结

package mainimport(
	"fmt"
	"reflect"
)
func main()
	fmt.Println( "main().. ........")
	// go根据赋的值判断变量类型
	var e,f = 123,"hello"
	fmt.Println("e: ", e," f:",f)
	//隐式声明(一旦赋值成功,则变量类型将确定)
	x,y := fn01()
	fmt.Print1n("x: ", x," y:", y)
	fmt.Println(fn02())
	a, b := fn03(1020)
	fmt.Println("a: ", a, "a type:", reflect.Typeof(a), " b:", b)
	fno4(123)


func fno1()(intint) 
	return 23


//定义号返回的变量(理解为函数局部变量)
func fn02()(sum int) 
	//var sum int
	//已经声明不需要重复声明
	sum = 100
	return



//支持返回指针类型
func fno3(×, y int)(*intint)
	sum :=x+y
	//返回变量地址,返回变量的值
	return &sum,sum


//可变参数
func fno4(nums ...int)
	total := 0
	//可变参数就是数组(返回元素的索引和索引对应的值)
	for _, num := range nums 
		//fmt.Println("i: ",i)
		total += num
	
	fmt.Println(total)



运行结果:

三、Shell快速入门

菜鸟教程搜索:shell教程,跟着教程学一点基础

3.1 第一个shell 脚本

linux常见目录结构:

/bin目录存放可执行的文件, root和一般账号都可用
/boot这个目录存放开机使用的文件,例如: linux内核和系统启动文件.. ldev存放所有设备文件.包括硬盘、分区、鼠标、键盘、USB等
/etc存放系统所有配置文件,
/home:用户主目录的,当你创建一个用户时,默认的用户文件夹就在该目录下
/mnt*如果需要挂载某些设备,一般建议存放到此目录中
/root: root用户的目录
/usr:注意usr并不是user的缩写,而是Unix Software Resource的缩写,"“Unix操作系统软件资源"放在该目录,而不是用户的数据

第一个脚本文件

mkdir test
cd test
sudo vim demo01.sh
#首先在vim打开文件界面后,按一次字母“i”  vim模式转为 INSERT,处于可编辑状态
#写入文件demo01.sh的内容如下两行:其中#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell

#!/bin/bash
echo "Hello World !"
#写完之后,按“ESC”退出插入模式回到命令模式,然后按“:wq”保存退出

#给脚本文件添加执行权限
sudo chmod +x demo01.sh
#执行脚本文件
./demo01.sh 
#输出结果为:Hello World !

文件权限解析

3.2 变量与参数传递

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。

vi demo01.sh可以对脚本文件进行编辑,内容如下:

#!/bin/bash
echo "Hello World !"
url="http: // www.163.com"
echo $url
str="url is \\n $url"
echo  $str
str='url is \\n $url'
echo $str
echo 'shell传递参数案例'
echo "file name is $0"
echo"第二参数为:$1"
echo "总共传递 $# 个参数"

#执行结果说明,双引号内支持变量和转义符,而单引号不支持

3.3 数组、for循环

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。
与大部分编程语言类似,数组元素的下标由 0 开始。
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式:array_name=(value1 value2 … valuen)

#!/bin/bash
arr=('A' 'Bug' 3.14 100)
#显示数组
echo "第1个元素为$arr[0]"
echo "第2个元素为$arr[1] ,长度为$#arr[1]"
echo "数组成员为: $arr[*],数组的长度为$#arr[*]"
for loop in $arr[*]
do
    echo "this value is $loop"
done

if [ $1 == $2 ]
then
  echo "a==b"
else
  echo "a!=b"
fi

3.4 函数文件包含

(1)函数

#!/bin/bash

funWithReturn()
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    #注意,加法外面是两层小括号
    return $(($aNum+$anotherNum))

funWithReturn
echo "输入的两个数字之和为 $? !"


(2)文件包含
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

Shell 文件包含的语法格式如下:

. filename   # 注意点号(.)和文件名中间有一空格
或
source filename

注:被包含的文件不需要拥有执行权限

#文件fn.sh,这个即为被包含文件,不用为其赋予执行权限
#!/bin/bash
funcDemo()
  echo "参数1为:$1"
  echo "参数2为:$2"
  echo "请输入一个数值:"
  read num
  return $(($1 +$2 + $num))



#文件callfn.sh
!/bin/bash
#引入同目录的sh文件
source ./fn.sh
funcDemo 1 2
echo "result: $?"


#终端执行
gan@gan-virtual-machine:~/Gantest$ vi fn.sh
gan@gan-virtual-machine:~/Gantest$ vi callfn.sh
gan@gan-virtual-machine:~/Gantest$ chmod u+x callfn.sh 
gan@gan-virtual-machine:~/Gantest$ ./callfn.sh 
参数1为:1
参数2为:2
请输入一个数值:
3
result: 6

3.5 case

var='yes'
case $var in
"yes")
	echo 'your choose is yes'
	;;
"no")	
	echo'your choose is no'
	;;
*)
	echo 'your choose is error'
	;;
esac
#短路模式
[ -d $1 ] && rm -r $1
#动态获取当前参数数量
echo $#
#吧所有参数左移动1位
shift 1
echo $#


四、fabric安装

4.1 Ubuntu安装

VMWare版本:VMware® Workstation 16 Pro 16.2.3 build-19376536
Ubuntu版本:Ubuntu 22.04 LTS【好像是发行版,我就是想装最新的,哈哈哈。大头娃老师用的是20.04版本】

当然要先安装VMWare啦,然后新建虚拟机==》按照提示步骤,一步步安装就好啦~22.04版本的Ubuntu可好看了,而且VMtools都自己就装好了。
下载安装自行百度啦~

4.2 Ubuntu基础命令与配置

1、更换下载源

点击左下角九个点进入搜索界面->在搜索框输入“software”->点击出现的“Software & Updates”,进入更换下载源的界面->点击download对应的框->找到阿里云源(老师说这个比较稳定)->choose server->输入密码认证->close->reload。




等它加载完成后,可通过命令查看下载源是否更换成功:

cat /etc/apt/sources.list

2、Linux基本命令

创建文件 touch 文件名.文件后缀
删除文件 rm 文件名.文件后缀
创建目录 mkdir 目录名
删除目录 rmdir 目录名
删除带文件的目录 rm -r 目录名/
移动文件 mv 文件当前绝对路径  想要移动到的目录的绝对路径
		mv /home/hong/abc.txt  ../    #将abc.txt移动到上一级目录
移动文件并重命名 mv 当前文件名 目标文件名
root@ubuntu:/home# ls
abc.txt hong
root@ubuntu:/home# mv abc.txt aaa.txt
root@ubuntu:/home# ls
aaa.txt hong

#解压zip、tar压缩文件
root@ubuntu:/home/hong/Desktop# ls
fabric-2.1.1.zip fabric-2.3.0.tar.gz
root@ubuntu:/home/hong/Desktop# tar xzf fabric-2.3.0.tar.gz -C .
root@ubuntu:/home/hong/Desktop# tar xzf fabric-2.3.0.tar.gz -C ../
root@ubuntu: /home/ hong/Desktop# cd ..
root@ubuntu:/ home/hong# ls
Desktop Downloads fabric-2.3.0 Pictures  emplates Documents examples.desktop Music Public Videos
root@ubuntu :/home/hong#rm -r fabric-2.3.0/
root@ubuntu:/home/ hong# ls
Desktop Downloads Music Public Videos Documents examples.desktop Pictures Templates
root@ubuntu :/home/hong# cd Desktop/
root@ubuntu :/home/hong/Desktop# ls
fabric-2.1.1.zip fabric-2.3.0 fabric-2.3.0.tar.gz

root@ubuntu: /home/hong/Desktop# unzip fabric-2.1.1.zip -d .
#这种-d方式会覆盖原来有的文件,如果这个目录下有重名文件,解压出来直接覆盖
root@ubuntu: / home/ hong/Desktop# ls
fabric-2.1.1 fabric-2.1.1.zip fabric-2.3.0 fabric-2.3.0.tar.gz

4.3 Docker介绍与安装

1、docker简单介绍

Fabric不是直接在Linux上的,是基于Docker容器的搭建的。
docker仓库:在这个仓库中有很多组件、环境,我们要用的fabric的组件就在上面。
菜鸟教程上有简单介绍:Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

我们可以在鲸鱼内部对沙箱进行任意的测试、调试,而不会影响海洋其他内容。当调试完成之后,我们可以将鲸鱼沙箱整体拷贝移植,移植到不同操作系统,无需重新配置测试。docker容器就相当于鲸鱼。
联盟链的不同超级节点配置其实是一样的,所以可以借助docker容器完成,先在docker中测试完成,其他节点就拷贝移植就好啦~

docker与VM的区别:
VM

引入docker

综上:
docker是软件层面的虚拟化,比较轻量级,用于软件环境的复制移植和测试。
VM是操作系统层面的虚拟化,比较笨重,用于操作系统层面的测试。

2、docker 安装

(1)安装docker与查看docker版本

sudo apt install docker.io

可用docker命令查看,docker安装成功会有子命令介绍。

查看docker版本

gan@gan-virtual-machine:~$ sudo docker version
Client:
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.17.3
 Git commit:        20.10.12-0ubuntu4
 Built:             Mon Mar  7 17:10:06 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.3
  Git commit:       20.10.12-0ubuntu4
  Built:            Mon Mar  7 15:57:50 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.9-0ubuntu3
  GitCommit:        
 runc:
  Version:          1.1.0-0ubuntu1
  GitCommit:        
 docker-init:
  Version:          0.19.0
  GitCommit:        

(2)docker配置
A、镜像拉取与删除演示——以hello-world为例

#拉取hello-world镜像,这样子是默认拉取最新版,如果想选特定版本就在后面加上版本号即可
sudo docker pull hello-world
#用docker images命令可以看到,我们拉取镜像成功啦,执行结果如下
sudo docker images
#REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
#hello-world   latest    feb5d9fea6a5   8 months ago   13.3kB
#删除镜像  后面跟的是镜像ID,因为同一个名字的镜像有不同版本,你可以装多个版本,所以会有多个同名的镜像,只有镜像ID才能唯一标识镜像
sudo docker rmi feb5d9fea6a5
#Untagged: hello-world:latest
#Untagged: hello-world@sha256:13e367d31ae85359f42d637adf6da428f76d75dc9afeb3c21faea0d976f5c651
#Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
#Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
#再次查看,发现镜像删除成功啦
sudo docker images
#REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

B、配置docker加速器

在网页输入“https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors”,用支付宝或者淘宝扫一扫打开阿里云,确认登陆。然后就有加速器网址啦,也有加速器配置指导。

gan@gan-virtual-machine:~$ cd /etc/docker
gan@gan-virtual-machine:/etc/docker$ ls
key.json
#发现etc/docker目录下没有daemon.json这个文件,所以我们需要新建一个

没事,我们跟着阿里云界面提示的,Ubuntu安装命令来,直接复制那一段粘贴到Ubuntu命令终端。

gan@gan-virtual-machine:/etc/docker$ sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'

  "registry-mirrors": ["https://m6juudzz.mirror.aliyuncs.com"]

EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
[sudo] password for gan: 

  "registry-mirrors": ["https://m6juudzz.mirror.aliyuncs.com"]

gan@gan-virtual-machine:/etc/docker$ ls
daemon.json  key.json
gan@gan-virtual-machine:/etc/docker$ cat daemon.json 

  "registry-mirrors": ["https://m6juudzz.mirror.aliyuncs.com"]

配置好加速器后,需要重启docker,然后我们再次拉取镜像试一下加速器是否配置成功

#先查看docker当前状态:active (running)  运行中
gan@gan-virtual-machine:/etc/docker$ service docker status
#关闭docker
gan@gan-virtual-machine:/etc/docker$ service docker stop
#再次查看docker当前状态:inactive (dead) 关闭
gan@gan-virtual-machine:/etc/docker$ service docker status
#此时再重新启动
gan@gan-virtual-machine:/etc/docker$ service docker start
#再次查看docker状态就又变成运行中啦


#然后重新拉取hello-world镜像,如果成功,说明加速器配置应该没问题
gan@gan-virtual-machine:/etc/docker$ sudo docker pull hello-world
#Using default tag: latest
#latest: Pulling from library/hello-world
#2db29710123e: Pull complete 
#Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
#Status: Downloaded newer image for hello-world:latest
#docker.io/library/hello-world:latest

4.4 docker常用命令

1:查看版本: docker version
2:查看系统信息: docker info显示 Docker系统信息,包括镜像和容器数。
3: docker images //显示镜像列表
4: docker run hello-world(图文讲解)
//1∶客户端首先要连接Docker服务器。2:从Docker服务器中pull镜像。3:从lmage中创建容器,一个镜像可以创建多个容器。4: Docker守护进程将输出流式传输到Docker客户端,后者将其发送到您的终端。
5: docker rmi hello-world ===> docker images
6: docker pull nginx:1.18.0 //通过官网下载指定版本
7: docker run [-d] nginx //后台运行镜像
8: docker ps //l查看已运行镜像列表-a列表所有的容器,-f过滤,-q只列表容器的id。
9: docker run -d -p 8080:80 nginx //启动时候配置端口映射
10: docker stop containerID //只要能识别ID一位数也行-r尽量先删除容器在删除镜像2.1 docker rmi nginx:1.18.0 #删除已下载的镜像rm是删除容器(镜像运行的称为容器)
11:启动、关闭服务service docker status|start|stop

(1)镜像与容器

#拉取镜像
root@gan-virtual-machine:~# docker pull hello-world
#运行容器
root@gan-virtual-machine:~# docker run hello-world
#查看当前正在运行的容器,发现没有,因为hello-world就是下图中所示,打印几个步骤出来,执行完成后自动关闭容器。
root@gan-virtual-machine:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

#删除docker镜像失败
root@gan-virtual-machine:~# docker rmi feb
Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 2d9ba30d106c

#查看所有镜像,包括未处于运行状态的容器
root@gan-virtual-machine:~# docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
2d9ba30d106c   hello-world   "/hello"   37 minutes ago   Exited (0) 37 minutes ago             condescending_tu
#想要删除镜像需要先删除其对应的容器,和删除类之前要删掉对应的对象一个道理。
#删除容器2d9ba30d106c。后面接的容器ID,只要能够区分就行,不用写完整的ID,如果第一位就能区分,打一个字母也是可以的
root@gan-virtual-machine:~# docker rm 2d9
#查看容器
root@gan-virtual-machine:~# docker ps -a
#CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
#容器已经删掉了,此时删除镜像
root@gan-virtual-machine:~# docker rmi feb
#查看镜像,确保删除成功
root@gan-virtual-machine:~# docker images

(2)Nginx部署
在docker仓库可以查看版本

#找到1.19.6版本【因为老师用的这个版本啦~】,复制镜像拉取命令
#不加版本号的话,会默认拉取最新的版本,其实装最新版也是可以哒~
docker pull nginx:1.19.6


可以通过localhost:端口号,访问Nginx,其实就类似于Tomcat那种,服务器的界面。

但是我的是这样的:【小白的崩溃就在和老师不一样的一瞬间】


(3)小插曲
因为我访问Nginx页面访问不了,所以我搜了一下问题,发现我还是访问不了,我就回过头看,只有这一步和老师不一样。
su命令切换管理员

我没有成功,v_v。

然后我就百度,

ubuntu初始root密码
安装完Ubuntu后可能没有设置root密码,不知道密码自然就无法进入根用户下。
到网上搜了一下,原来是这么回事:
Ubuntu的默认root密码是随机的,即每次开机都有一个新的root密码。
解决方法:
我们可以在终端输入命令“sudo passwd”,然后输入当前用户的密码后"Enter"。
终端会提示我们输入新的密码并确认,此时的密码就是root新密码。
修改成功后,输入命令 su root,再输入新的密码就ok了。

反正最后发现,不是因为管理员的问题。重启docker客户端,重启容器就行~

4.5 fabric组件下载

1、浓缩版:fabric组件下载拉取命令

先切换到管理员身份,再运行下述命令哦~

//在GitHub下载fabric2.3.0的tar.gz文件后,拖到Ubuntu中,并且解压到/opt目录下,进入解压后的目录
root@ubuntu:/home/hong/Desktop# tar xzf fabric-2.3.0.tar.gz -C /opt
root@ubuntu:/opt/fabric-2.3.0/scripts# apt install curl
//如果有报错“E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)”的话,可以不用移除/var/lib/dpkg/lock这个目录,然后重新安装apt install curl,如果没有报错,跳过下面这条语句
root@ubuntu:/opt/fabric-2.3.0/scripts# rm /var/lib/dpkg/lock
//安装,拉取下载组件,获得bin、config、test-等目录
root@ubuntu:/opt/fabric-2.3.0/scripts# ./bootstrap.sh 
//安装docker-compose
root@ubuntu/opt/fabric-2.3.0/scripts# :apt install docker-compose
//启动Fabric服务
root@ubuntu:/opt/fabric-2.3.0/scripts/fabric-samples/test-network# ./network.sh up
//可以看下,现在在运行的docker容器
root@ubuntu:/opt/fabric-2.3.0/scripts/fabric-samples/test-network# docker ps -a
//然后试一下终止网络命令——>本质就是销毁之前启动的docker容器的过程
root@ubuntu:/opt/fabric-2.3.0/scripts/fabric-samples/test-network# ./network.sh down
//组件下载这部分就完成啦



补充一个小技巧
关闭自动锁屏,这样在下载资源的时候不会因为长时间不在Ubuntu界面而锁屏导致暂停下载
这是20.04版本的Ubuntu需要关闭那个Lock

我装的新版本,没有这个选项好像,如果有的话可能设置的位

以上是关于Hyperledger Fabric学习笔记——7.链码安装实例化执行的主要内容,如果未能解决你的问题,请参考以下文章

Hyperledger Fabric学习笔记——5.fabric共识排序

《HyperLedger Fabric 2.3 联盟链搭建》 课程学习笔记

Hyperledger Fabric基础环境搭建

区块链与密码学第3-7讲:Hyperledger Fabric技术框架详解

学习Hyperledger Fabric 实战联盟链

[转帖]Hyperledger Fabric 学习一:简介