目录
启动测试网络
测试网络的组件
创建通道
启动通道上的链码
与网络交互
销毁网络
后续步骤
使用证书颁发机构启动网络
幕后发生了什么?
Fabric v2.0中引入了测试网络,作为“first-network”示例的长期替代。
在安装Fabric时会使用脚本下载fabric-samples、二进制文件和docker镜像,但脚本中第一步“git checkout v${VERSION}”时会出错pathspec 'v2.0.1' did not match any file(s) known to git. fabric,手动查看后发现确实没有2.0的版本。
示例网络使用Docker构成一个组构网络。因为节点是在Docker组合网络中隔离的,所以测试网络没有配置为连接到其他运行的fabric节点。
使用命令进入,在这个目录中,您可以找到一个带注释的脚本network.sh,它使用本地机器上的Docker映像建立一个Fabric网络。
cd fabric-samples/test-network
可以通过命令移除之前运行的东西。然后,您可以通过命令来启动网络
./network.sh down
./network.sh up
启动命令创建一个由两个peer节点和一个order节点组成的Fabric网络。当您运行./network.sh up时,没有创建通道,不过我们将在下面的步骤中实现。如果命令成功完成,您将看到创建节点的日志:
查看所有运行中的docker容器
docker ps -a
如果有别的docker容器在,可以停止后删除。https://blog.csdn.net/Michel4Liu/article/details/80889977
每个Fabric网络包括一个排序服务。虽然peer节点验证交易并将交易打包到区块链账本中,但它们不会决定交易的顺序或将交易块包含到新块中。在分布式网络中,节点间可能彼此距离很远,并且当一个交易被创建时没有共同的视图。就交易的顺序达成一致是一个代价高昂的过程。
排序服务使节点可以集中精力确认交易并将其提交到分类账。在排序节点从客户端接收经过认可的事务后,它们对事务的顺序达成一致,然后将它们添加到块中。然后将这些块分配给对等节点,这些节点将这些块添加到区块链分类账中。订购节点还操作定义Fabric网络功能的系统通道,例如如何生成块以及节点可以使用哪个版本的Fabric。系统通道定义了哪些组织是联盟的成员。
示例网络使用由订购组织操作的单节点Raft排序服务。您可以看到在您的机器上作为orderer.example.com运行的订购节点。测试网络只使用单个节点排序服务,但一个真实的网络将有多个排序节点,由一个或多个排序组织操作运转。不同的排序节点将使用Raft共识算法来对网络上交易的顺序达成一致。
现在我们的机器上已经运行了peer和orderer节点,我们可以使用脚本为Org1和Org2之间的事务创建一个Fabric通道。通道是特定网络成员之间通信的私有层。通道只能由被邀请到该通道的组织使用,并且对于网络的其他成员是不可见的。每个通道都有一个单独的区块链分类账。被邀请的组织“加入”他们的伙伴到通道来存储通道分类账并验证通道上的交易。
如果你想在一个步骤中打开网络并创建一个通道,你可以同时使用up和createChannel模式:
./network.sh up createChannel [-c channel1]
创建通道之后,可以开始使用智能合约与通道账本进行交互。由网络成员运行的应用程序可以调用智能契约来创建分类账上的资产,以及更改和转移这些资产。应用程序还可以查询智能契约来读取分类账上的数据。
为了确保交易是有效的,使用智能契约创建的交易通常需要多个组织的签名才能提交给通道分类账。多个签名对于Fabric的信任模型是不可或缺的。为一笔交易要求多个背书,可以防止某个渠道上的组织篡改其同行的分类账,或使用未达成一致的业务逻辑。要签署交易,每个组织需要调用并执行节点上的smart契约,然后对输出签名。如果输出是一致的,并且已经有足够多的组织签名,交易就可以提交到账本上。指定需要执行smart契约的通道上的集合组织的策略称为背书策略,它是作为chaincode定义的一部分为每个chaincode设置的。
使用network.sh创建通道后,可以使用以下命令启动通道上的chaincode:
./network.sh deployCC [-c channelName]
执行该命令时出现错误
go: github.com/hyperledger/[email protected]: 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
根据大佬的文章,更换代理即可
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
然后重新部署链码,提示拒绝访问,使用sudo发现环境变量重置了,没找到可用的办法(我好菜啊)
然后决定更改/opt/go的所有者,使用如下命令即可
sudo chown -R xl go
然后又出错了,折腾半天想起来,后来起之后忘了createChannel了……
终于成功了
常用命令
#查看所有docker容器
docker ps -a
#查看所有docker镜像
docker images
deployCC子命令将在peer0.org1.example.com和peer0.org2.example.com上安装fabcar链码,然后使用通道标志在指定的通道上部署链码(如果没有指定通道,则部署在mychannel)。如果您是第一次部署chaincode,脚本将安装chaincode依赖项。默认情况下,脚本安装fabcar chain代码的Go版本。但是,您可以使用语言标记-l来安装chaincode的Java或javascript版本。您可以在fabric-samples目录的chaincode文件夹中找到Fabcar的chaincode。
在您启动测试网络之后,您可以使用对等的CLI来与您的网络进行交互。peer CLI允许您调用已部署的智能契约、更新通道或从CLI安装和部署新的智能契约。确保您正在从test-network目录进行操作。使用以下命令将二进制文件添加到您的CLI路径。其中${PWD}的意思为当前路径。
export PATH=${PWD}/../bin:${PWD}:$PATH
您还需要设置FABRIC_CFG_PATH来指向fabric-samples中的
core.yaml文件:
export FABRIC_CFG_PATH=$PWD/../config/
完整的环境变量如下,我当时在配环境变量的终端可以生效,但是在另一个终端不行,折腾好久重启就ok了……
#安装目录
export JAVA_HOME=/opt/java/jdk1.8.0_241
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export GOPATH=/opt/go/go
export FabricSamples=$HOME/workspace/go/src/github.com/hyperledger/fabric-samples
export TestNetwork=$FabricSamples/test-network
export PATH=$PATH:/home/xl/.local/bin:$JAVA_HOME/bin:$GOPATH/bin:$FabricSamples/bin:$TestNetwork
#Fabric test network
export FABRIC_CFG_PATH=$FabricSamples/config/
# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=$TestNetwork/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=$TestNetwork/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:7051
执行结果如下
注:有可能出现下面的错误,可能是环境变量配置文件中有笔误。我当时就是test-network的路径配错了,导致CORE_PEER_MSPCONFIGPATH错了
当网络成员想要转移或改变账本上的资产时,就会调用链码。使用以下命令调用fabcar链码来更改账本上汽车的主人:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C channel1 -n fabcar --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":"changeCarOwner","Args":["CAR9","Dave"]}'
如果命令成功,您应该看到以下响应
注意:如果您部署了Java chaincode,请运行invoke命令,并使用以下参数:'{"function":"changeCarOwner","Args":["CAR009","Dave"]}'用Java编写的Fabcar chaincode使用的索引与用Javascipt或Go编写的chaincode不同。
因为fabcar chaincode的背书策略要求事务由Org1和Org2签名,所以chaincode invoke命令需要同时针对peer0.org1.example.com和peer0.org2.example.com,并使用——peeraddress标志。由于为网络启用了TLS,因此该命令还需要使用——tlsRootCertFiles标志引用每个对等点的TLS证书。
在调用chaincode之后,我们可以使用另一个查询来查看调用如何更改区块链分类帐上的资产。因为我们已经查询了Org1对等体,所以我们可以利用这个机会来查询运行在Org2对等体上的chaincode。设置以下环境变量作为Org2运行:
# Environment variables for Org2
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:9051
您现在可以查询运行在peer0.org2.example.com上的fabcar链码:
peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryCar","CAR9"]}'
结果会显示“CAR9”被转给了Dave:
当您使用完测试网络后,可以使用以下命令关闭网络:
./network.sh down
该命令将停止并删除节点和chaincode容器,删除组织加密材料,并从Docker注册表中删除chaincode映像。该命令还从以前的运行中删除通道构件和docker卷,允许您在遇到任何问题时再次运行./network.sh。
现在您已经使用测试网络在您的本地机器上部署了超账本结构,您可以使用教程开始开发您自己的解决方案:
Hyperledger Fabric使用公钥基础设施(PKI)来验证所有网络参与者的行为。每个节点、网络管理员和提交事务的用户都需要一个公共证书和私钥来验证他们的身份。这些身份需要具有有效的信任根,从而确定证书是由网络中的成员组织颁发的。sh脚本在创建对等节点和排序节点之前创建部署和操作网络所需的所有加密材料。
默认情况下,脚本使用cryptogen工具创建证书和密钥。该工具用于开发和测试,可以快速为具有有效信任根的Fabric组织创建所需的加密材料。运行./net .sh up时,您可以看到cryptogen工具正在为Org1、Org2和Orderer Org创建证书和密钥。
但是,测试网络脚本还提供了使用证书颁发机构(ca)启动网络的选项。在生产网络中,每个组织操作一个CA(或多个中间CA),该CA创建属于其组织的标识。由组织运行的CA创建的所有标识都共享同一根信任。尽管使用它比使用cryptogen花费更多的时间,但是使用CAs启动测试网络将介绍如何在生产环境中部署网络。部署CAs还允许您使用Fabric sdk注册客户端身份,并为您的应用程序创建证书和私钥。
如果您想使用Fabric CAs启动网络,首先运行以下命令来关闭任何正在运行的网络:
./network.sh down
然后你可以用CA标志打开网络:
./network.sh up -ca
发出该命令后,您可以看到脚本将调出三个ca,一个用于网络中的每个组织。
##########################################################
##### Generate certificates using Fabric CA's ############
##########################################################
Creating network "net_default" with the default driver
Creating ca_org2 ... done
Creating ca_org1 ... done
Creating ca_orderer ... done
在部署了CAs之后,值得花时间检查./network.sh脚本生成的日志。测试网络使用Fabric CA客户端向每个组织的CA注册节点和用户身份。然后脚本使用注册命令为每个标识生成一个MSP文件夹。MSP文件夹包含每个身份的证书和私钥,并在运行CA的组织中建立身份的角色和成员关系。您可以使用以下命令检查Org1管理用户的MSP文件夹:
tree organizations/peerOrganizations/org1.example.com/users/Admin/@org1.example.com/
该命令将显示MSP文件夹的结构和配置文件:
└── msp
├── IssuerPublicKey
├── IssuerRevocationPublicKey
├── cacerts
│ └── localhost-7054-ca-org1.pem
├── config.yaml
├── keystore
│ └── 58e81e6f1ee8930df46841bf88c22a08ae53c1332319854608539ee78ed2fd65_sk
├── signcerts
│ └── cert.pem
└── user
您可以在signcerts文件夹中找到管理员用户的证书,并在keystore文件夹中找到私钥。要了解更多关于MSPs的信息,请参阅成员资格服务提供者概念主题。
cryptogen和Fabric CAs都在organizations文件夹中为每个组织生成加密材料。您可以在organizations/fabric-ca目录的registerregister.sh脚本中找到用于设置网络的命令。要了解有关如何使用Fabric CA部署Fabric网络的更多信息,请访问Fabric CA操作指南。通过访问身份和会员概念主题,您可以了解更多关于Fabric如何使用PKI的信息。
如果您有兴趣了解更多关于样例网络的信息,您可以研究test-network目录中的文件和脚本。下面的步骤将引导您了解在发出./network.sh up命令时发生的情况。
参考文献:
https://hyperledger-fabric.readthedocs.io/en/release-2.0/test_network.html#interacting-with-the-network