当前位置: 首页 > news >正文

桂链:使用Fabric的测试网络

桂链是基于Hyperledger Fabric开源区块链框架扩展开发的区块链存证平台,是桂云网络(OSG)公司旗下企业供应链、流程审批等场景数字存证软件产品,与桂花流程引擎(Osmanthus)并列为桂云网络旗下的标准与可定制型软件产品。本文由桂云网络转自Hyperledger Fabric,主要讲解使用Fabric的测试网络。

桂云和OSG为桂云网络公司的主商标,桂链和桂花均为桂云网络公司企业产品级软件技术商标。

使用Fabric的测试网络

下载Hyperledger Fabric Docker镜像和示例后,您将可以使用以fabric-samples代码库中提供的脚本来部署测试网络。 您可以通过在本地计算机上运行节点来使用测试网络以了解Fabric。开发人员可以使用 网络测试其智能合约和应用程序。该网络工具仅用作教育与测试目的,它不应该用作部署产品网络的模版。 一般,修改脚本是不被鼓励的,并且修改可能破坏网络。它是基于非常有限的配置,那些配置都无法作为生产网络的模版:

  • 它仅包括两个对等组织和一个排序组织。
  • 为了简单, 单节点的Raft排序服务被配置。
  • 为了减少复杂性,TLS的认证授权是不安装的。所有的认证都有根认证下发。
  • 样板网络使用Docker Compose(Docker Compose是一个Docker工具,定义和运行多容器里的应用)部署了一个Fabric网络。 因为节点和Docker Componse的的网络是隔离的,测试网络不被配置去连接其他正在运行的Fabric节点的。

为了学习如何在生产环境里使用Fabric, 查看部署生产网络.

注意: 这些指导已基于最新的稳定版Docker镜像和提供的tar文件中的预编译的安装软件进行验证。 如果您使用当前的master分支的镜像或工具运行这些命令,则可能会遇到错误。

开始之前

在运行测试网络之前,您需要克隆fabric-samples代码库并下载Fabric镜像,确保已安装到你的环境里。 跟随 准备开始 的指令安装需要的软件。

注意: 测试网络已经在Docker Desktop 版本 2.5.0.1 上成功验证过,并且这是目前推荐的版本。更高的版本可能不工作。

启动测试网络

您可以在fabric-samples代码库的test-network目录中找到启动网络的脚本。 使用以下命令导航至测试网络目录:

cd fabric-samples/test-network

在此目录中,您可以找到带注释的脚本network.sh,该脚本在本地计算机上使用Docker镜像建立Fabric网络。 你可以运行./network.sh -h以打印脚本帮助文本: 

Usage:network.sh <Mode> [Flags]Modes:up - bring up fabric orderer and peer nodes. No channel is createdup createChannel - bring up fabric network with one channelcreateChannel - create and join a channel after the network is createddeployCC - deploy the asset transfer basic chaincode on the channel or specifydown - clear the network with docker-compose downrestart - restart the networkFlags:-ca <use CAs> -  create Certificate Authorities to generate the crypto material-c <channel name> - channel name to use (defaults to "mychannel")-s <dbtype> - the database backend to use: goleveldb (default) or couchdb-r <max retry> - CLI times out after certain number of attempts (defaults to 5)-d <delay> - delay duration in seconds (defaults to 3)-ccn <name> - the short name of the chaincode to deploy: basic (default),ledger, private, secured-ccl <language> - the programming language of the chaincode to deploy: go (default), java, javascript, typescript-ccv <version>  - chaincode version. 1.0 (default)-ccs <sequence>  - chaincode definition sequence. Must be an integer, 1 (default), 2, 3, etc-ccp <path>  - Optional, chaincode path. Path to the chaincode. When provided the -ccn will be used as the deployed name and not the short name of the known chaincodes.-cci <fcn name>  - Optional, chaincode init required function to invoke. When provided this function will be invoked after deployment of the chaincode and will define the chaincode as initialization required.-i <imagetag> - the tag to be used to launch the network (defaults to "latest")-cai <ca_imagetag> - the image tag to be used for CA (defaults to "latest")-verbose - verbose mode-h - print this messagePossible Mode and flag combinationsup -ca -c -r -d -s -i -verboseup createChannel -ca -c -r -d -s -i -verbosecreateChannel -c -r -d -verbosedeployCC -ccn -ccl -ccv -ccs -ccp -cci -r -d -verboseTaking all defaults:network.sh upExamples:network.sh up createChannel -ca -c mychannel -s couchdb -i 2.0.0network.sh createChannel -c channelNamenetwork.sh deployCC -ccn basic -ccl javascript

test-network目录中,运行以下命令删除先前运行的所有容器或工程:

./network.sh down

然后,您可以通过执行以下命令来启动网络。如果您尝试从另一个目录运行脚本,则会遇到问题:

./network.sh up

此命令创建一个由两个对等节点和一个排序节点组成的Fabric网络。 运行./network.sh up时没有创建任何channel, 而是我们将在后面的步骤实现。 如果命令执行成功,您将看到已创建的节点的日志:

Creating network "net_test" with the default driver
Creating volume "net_orderer.example.com" with default driver
Creating volume "net_peer0.org1.example.com" with default driver
Creating volume "net_peer0.org2.example.com" with default driver
Creating orderer.example.com    ... done
Creating peer0.org2.example.com ... done
Creating peer0.org1.example.com ... done
CONTAINER ID        IMAGE                               COMMAND             CREATED             STATUS                  PORTS                              NAMES
8d0c74b9d6af        hyperledger/fabric-orderer:latest   "orderer"           4 seconds ago       Up Less than a second   0.0.0.0:7050->7050/tcp             orderer.example.com
ea1cf82b5b99        hyperledger/fabric-peer:latest      "peer node start"   4 seconds ago       Up Less than a second   0.0.0.0:7051->7051/tcp             peer0.org1.example.com
cd8d9b23cb56        hyperledger/fabric-peer:latest      "peer node start"   4 seconds ago       Up 1 second             7051/tcp, 0.0.0.0:9051->9051/tcp   peer0.org2.example.com

如果未得到此结果,请跳至故障排除 寻求可能出现问题的帮助。 默认情况下,网络使用 cryptogen工具来建立网络。 但是,您也可以 通过证书颁发机构建立网络。

测试网络的组成部分

部署测试网络后,您可能需要一些时间来检查其网络组件。 运行以下命令以列出所有正在您的计算机上运行的Docker容器。 您应该看到由network.sh脚本创建的三个节点:

docker ps -a

与Fabric网络互动的每个节点和用户都必须属于一个网络成员的组织。 Fabric网络成员的所有组织通常称为联盟(consortium)。测试网络有两个联盟成员,Org1和Org2。 该网络还包括一个维护网络排序服务的排序组织。

Peer 节点 是任何Fabric网络的基本组件。 对等节点存储区块链账本并在进行交易之前对其进行验证。 Peers运行智能合约,这些合约包含用于管理区块链账本的业务逻辑。

网络中的每个Peer都必须属于某个组织成员。在测试网络里,每个组织彼此操作一个对等节点, peer0.org1.example.compeer0.org2.example.com.

每个Fabric网络还包括一个排序服务。 虽然对等节点验证交易并将交易块添加到区块链账本,他们不决定交易顺序或包含他们进入新的区块。 在分布式网络上,对等点可能运行得很远彼此之间没有什么共同点,并且对何时创建事务没有共同的看法。 在交易顺序上达成共识是一个代价高昂的过程,为同伴增加开销。

排序服务允许对等节点专注于验证交易并将它们提交到账本。排序节点从客户那里收到认可的交易后,他们就交易顺序达成共识,然后添加区块。这些区块之后被分配给添加这些区块到账本的对等节点。排序节点还可以操作定义Fabric网络的功能的系统通道,例如如何制作块以及节点可以使用的Fabric版本。系统通道定义了哪个组织是该联盟的成员。

该示例网络使用一个单节点Raft排序服务,该服务由排序组织运行。您可以看到在您机器上正在运行的排序节点orderer.example.com。测试网络仅使用单节点排序服务,但一个真实的网络将有多个排序节点,由一个或多个多个排序者组织操作。不同的排序节点将使用Raft共识算法达成跨交易顺序的共识网络。

创建一个通道

现在我们的机器上正在运行对等节点和排序节点,我们可以使用脚本创建用于在Org1和Org2之间进行交易的Fabric通道。通道是特定网络成员之间的专用通信层。通道只能由被邀请加入通道的组织使用,并且对网络的其他成员不可见。每个通道都有一个单独的区块链账本。被邀请的组织“加入”他们的对等节点来存储其通道账本并验证交易。

您可以使用network.sh脚本在Org1和Org2之间创建通道并加入他们的对等节点。 运行以下命令以创建一个默认名称为“ mychannel”的通道:

./network.sh createChannel

如果命令成功执行,您将看到以下消息打印在您的日志:

Channel 'mychannel' joined

您也可以使用channel标志创建具有自定义名称的通道。 作为一个例子,以下命令将创建一个名为channel1的通道:

./network.sh createChannel -c channel1

通道标志还允许您创建多个不同名称的多个通道。 创建mychannelchannel1之后,您可以使用下面的命令创建另一个名为channel2的通道:

./network.sh createChannel -c channel2

如果您想一步建立网络并创建频道,则可以使用upcreateChannel模式一起:

./network.sh up createChannel

在通道启动一个链码

创建通道后,您可以开始使用智能合约与通道账本交互。智能合约包含管理区块链账本上资产的业务逻辑。由成员运行的应用程序网络可以在账本上调用智能合约创建,更改和转让这些资产。应用程序还通过智能合约查询,以在分类帐上读取数据。

为确保交易有效,使用智能合约创建的交易通常需要由多个组织签名才能提交到通道账本。 多个签名是Fabric信任模型不可或缺的一部分。 一项交易需要多次背书,以防止一个通道上的单一组织使用通道不同意的业务逻辑篡改其对等节点的分类账本。 要签署交易,每个组织都需要调用并在其对等节点上执行智能合约,然后签署交易的输出。 如果输出是一致的并且已经有足够的组织签名,则可以将交易提交到账本。 该政策被称为背书政策,指定需要执行智能交易的通道上的已设置组织合同,针对每个链码设置为链码定义的一部分。

在Fabric中,智能合约作为链码以软件包的形式部署在网络上。 链码安装在组织的对等节点上,然后部署到某个通道,然后可以在该通道中用于认可交易和区块链账本交互。 在将链码部署到通道前,该频道的成员需要就链码定义达成共识,建立链码治理。 何时达到要求数量的组织同意后,链码定义可以提交给通道,并且可以使用链码了。

使用network.sh创建频道后,您可以使用以下命令在通道上启动链码:

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

deployCC子命令将在peer0.org1.example.compeer0.org2.example.com上安装 asset-transfer (basic) 链码。 然后在使用通道标志(或mychannel如果未指定通道)的通道上部署指定的通道的链码。 如果您第一次部署一套链码,脚本将安装链码的依赖项。默认情况下,脚本安装Go版本的 asset-transfer (basic) 链码。 但是您可以使用语言便签 -ccl,用于安装 Java 或 javascript 版本的链码。 您可以在 fabric-samples 目录的 asset-transfer-basic 文件夹中找到 asset-transfer (basic) 链码。 此目录包含作为案例和用来突显 Fabric 特征的样本链码。

与网络交互

在您启用测试网络后,可以使用peer CLI与您的网络进行交互。 peer CLI允许您调用已部署的智能合约,更新通道,或安装和部署新的智能合约。

确保您正在从test-network目录进行操作。 如果你按照说明安装示例,二进制文件和Docker映像, 您可以在fabric-samples代码库的bin文件夹中找到peer二进制文件。 使用以下命令将这些二进制文件添加到您的CLI路径:

export PATH=${PWD}/../bin:$PATH

您还需要将fabric-samples代码库中的FABRIC_CFG_PATH设置为指向其中的core.yaml文件:

export FABRIC_CFG_PATH=$PWD/../config/

现在,您可以设置环境变量,以允许您作为Org1操作peer CLI:

# Environment variables for Org1export 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

CORE_PEER_TLS_ROOTCERT_FILECORE_PEER_MSPCONFIGPATH环境变量指向Org1的organizations文件夹中的的加密材料。 如果您使用 ./network.sh deployCC -ccl go 安装和启动 asset-transfer (basic) 链码,您可以调用链码(Go)的 InitLedger 方法来赋予一些账本上的初始资产(如果使用 typescript 或者 javascript,例如 ./network.sh deployCC -ccl javascript,你会调用相关链码的 initLedger 功能)。

运行以下命令用一些资产来初始化账本:

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":[]}'

如果命令成功,您将观察到类似以下的输出:

-> INFO 001 Chaincode invoke successful. result: status:200

现在你可以用你的 CLI 工具来查询账本。运行以下指令来获取添加到通道账本的资产列表:

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

如果成功,您将看到以下输出:

[{"ID": "asset1", "color": "blue", "size": 5, "owner": "Tomoko", "appraisedValue": 300},{"ID": "asset2", "color": "red", "size": 5, "owner": "Brad", "appraisedValue": 400},{"ID": "asset3", "color": "green", "size": 10, "owner": "Jin Soo", "appraisedValue": 500},{"ID": "asset4", "color": "yellow", "size": 10, "owner": "Max", "appraisedValue": 600},{"ID": "asset5", "color": "black", "size": 15, "owner": "Adriana", "appraisedValue": 700},{"ID": "asset6", "color": "white", "size": 15, "owner": "Michel", "appraisedValue": 800}
]

当一个网络成员希望在账本上转一些或者改变一些资产,链码会被调用。使用以下的指令来通过调用 asset-transfer (basic) 链码改变账本上的资产所有者:

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"]}'

如果命令成功,您应该看到以下响应:

2019-12-04 17:38:21.048 EST [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

因为 asset-transfer (basic) 链码的背书策略需要交易同时被 Org1 和 Org2 签名,链码调用指令需要使用 --peerAddresses 标签来指向 peer0.org1.example.com 和 peer0.org2.example.com。因为网络的 TLS 被开启,指令也需要用 --tlsRootCertFiles 标签指向每个 peer 节点的 TLS 证书。

调用链码之后,我们可以使用另一个查询来查看调用如何改变了区块链账本的资产。因为我们已经查询了 Org1 的 peer,我们可以把这个查询链码的机会通过 Org2 的 peer 来运行。设置以下的环境变量来操作 Org2:

# Environment variables for Org2export 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/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051

你可以查询运行在 peer0.org2.example.com asset-transfer (basic) 链码:

peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'

结果显示 "asset6" 转给了 Christopher:

{"ID":"asset6","color":"white","size":15,"owner":"Christopher","appraisedValue":800}

关停网络

使用完测试网络后,您可以使用以下命令关闭网络:

./network.sh down

该命令将停止并删除节点和链码容器,删除组织加密材料,并从Docker Registry移除链码镜像。 该命令还删除之前运行的通道项目和docker卷。如果您遇到任何问题,还允许您再次运行./ network.sh up

下一步

既然您已经使用测试网络在您的本地计算机上部署了Hyperledger Fabric,您可以使用教程来开始开发自己的解决方案:

  • 使用将智能合约部署到通道 教程了解如何来将自己的智能合约部署到测试网络。
  • 访问编写您的第一个应用程序 教程了解如何从您的客户端程序使用Fabric SDK提供的API调用智能合约。
  • 如果您准备将更复杂的智能合约部署到网络,请跟随商业票据教程 探索两个组织使用区块链网络进行商业票据交易的用例。

您可以在教程页上找到Fabric教程的完整列表。

使用认证机构建立网络

Hyperledger Fabric使用公钥基础设施(PKI)来验证所有网络参与者的行为。 每个节点,网络管理员和用户提交的交易需要具有公共证书和私钥以验证其身份。 这些身份必须具有有效的信任根源,该证书是由作为网络中的成员组织颁发的。 network.sh脚本在创建对等和排序节点之前创建所有部署和操作网络所有需要的加密材料。

默认情况下,脚本使用cryptogen工具创建证书和密钥。 该工具用于开发和测试,并且可以快速为具有有效根信任的Fabric组织创建所需的加密材料。 当您运行./network.sh up时,您会看到cryptogen工具正在创建Org1,Org2和Orderer Org的证书和密钥。

creating Org1, Org2, and ordering service organization with crypto from 'cryptogen'/Usr/fabric-samples/test-network/../bin/cryptogen##########################################################
##### Generate certificates using cryptogen tool #########
####################################################################################################################
############ Create Org1 Identities ######################
##########################################################
+ cryptogen generate --config=./organizations/cryptogen/crypto-config-org1.yaml --output=organizations
org1.example.com
+ res=0
+ set +x
##########################################################
############ Create Org2 Identities ######################
##########################################################
+ cryptogen generate --config=./organizations/cryptogen/crypto-config-org2.yaml --output=organizations
org2.example.com
+ res=0
+ set +x
##########################################################
############ Create Orderer Org Identities ###############
##########################################################
+ cryptogen generate --config=./organizations/cryptogen/crypto-config-orderer.yaml --output=organizations
+ res=0
+ set +x

测试网络脚本还提供了使用证书颁发机构(CA)的网络的启动选项。 在产品网络中,每个组织操作一个CA(或多个中间CA)来创建属于他们的组织身份。 所有由该组织运行的CA创建的身份享有相同的组织信任根源。 虽然花费的时间比使用cryptogen多,使用CA建立测试网络,提供了在产品中部署网络的指导。 部署CA还可以让您注册Fabric SDK的客户端身份,并为您的应用程序创建证书和私钥。

如果您想使用Fabric CA建立网络,请首先运行以下命令关停所有正在运行的网络:

./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

值得花一些时间检查/ network.sh脚本部署CA之后生成的日志。 测试网络使用Fabric CA客户端以每个组织的CA注册节点和用户身份。 之后这个脚本使用enroll命令为每个身份生成一个MSP文件夹。 MSP文件夹包含每个身份的证书和私钥,以及在运营CA的组织中建立身份的角色和成员身份。 您可以使用以下命令来检查Org1管理员用户的MSP文件夹:

tree organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/

该命令将显示MSP文件夹的结构和配置文件:

organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/
└── msp├── IssuerPublicKey├── IssuerRevocationPublicKey├── cacerts│   └── localhost-7054-ca-org1.pem├── config.yaml├── keystore│   └── 58e81e6f1ee8930df46841bf88c22a08ae53c1332319854608539ee78ed2fd65_sk├── signcerts│   └── cert.pem└── user

您可以在signcerts文件夹中找到管理员用户的证书,然后在keystore文件夹中找到私钥。 要了解有关MSP的更多信息,请参阅成员服务提供者概念主题。

cryptogen和Fabric CA都为每个组织在organizations文件夹中生成加密材料。 您可以在organizations/fabric-ca目录中的registerEnroll.sh脚本中找到用于设置网络的命令。 要了解更多有关如何使用Fabric CA部署Fabric网络的信息,请访问Fabric CA操作指南。 您可以通过访问identity和membership概念主题了解有关Fabric如何使用PKI的更多信息。

幕后发生了什么?

如果您有兴趣了解有关示例网络的更多信息,则可以调查test-network目录中的文件和脚本。 下面的步骤提供了有关在您发出./network.sh up命令时会发生什么情况的导览。

  • ./ network.sh为两个对等组织和排序组织创建证书和密钥。 默认情况下,脚本利用cryptogen工具使用位于organizations/cryptogen文件夹中的配置文件。 如果使用-ca标志创建证书颁发机构,则脚本使用Fabric CA服务器配置文件和位于organizations/fabric-ca文件夹的registerEnroll.sh脚本。 cryptogen和Fabric CA均会在organisations文件夹创建所有三个组织中的加密资料和MSP文件夹。
  • 该脚本使用configtxgen工具创建系统通道生成块。 Configtxgen使用了TwoOrgsOrdererGenesis通道配置文件中的configtx/configtx.yaml文件创建创世区块。 区块被存储在system-genesis-block文件夹中。
  • 一旦组织的加密资料和系统通道的创始块生成后,network.sh就可以启动网络的节点。 脚本使用docker文件夹中的docker-compose-test-net.yaml文件创建对等节点和排序节点。 docker文件夹还包含 docker-compose-e2e.yaml文件启动网络节点三个Fabric CA。 该文件旨在用于Fabric SDK 运行端到端测试。 请参阅Node SDK代码库有关运行这些测试的详细信息。
  • 如果您使用createChannel子命令,则./ network.sh使用提供的频道名称, 运行在scripts文件夹中的createChannel.sh脚本来创建通道。 该脚本使用configtx.yaml文件来创建通道创作事务,以及两个锚对等节点更新交易。 该脚本使用对等节点cli创建通道,加入peer0.org1.example.compeer0.org2.example.com 到频道, 以及使两个对等节点都成为锚对等节点。
  • 如果执行deployCC命令,./ network.sh会运行deployCC.sh脚本在两个 peer 节点上安装**asset-transfer (basic)**链码, 然后定义通道上的链码。 一旦将链码定义提交给通道,对等节点cli使用Init初始化链码并调用链码将初始数据放入账本。

故障排除

如果您对本教程有任何疑问,请查看以下内容:

  • 您应该始终重新启动网络。 您可以使用以下命令删除先前运行的工件,加密材料,容器,卷和链码镜像:

    ./network.sh down
    

    如果您不删除旧的容器,镜像和卷,看到报错。

  • 如果您看到Docker错误,请先检查您的Docker版本(Prerequisites), 然后尝试重新启动Docker进程。 Docker的问题是经常无法立即识别的。 例如,您可能会看到您的节点无法访问挂载在容器内的加密材料导致的错误。

    如果问题仍然存在,则可以删除镜像并从头开始:

     docker rm -f $(docker ps -aq)docker rmi -f $(docker images -q)
    
  • 如果你在macOS上运行Docker Desktop, 你可能在链码安装时遇到下面的错误

    Error: chaincode install failed with status: 500 - failed to invoke backing implementation of 'InstallChaincode': could not build chaincode: docker build failed: docker image inspection failed: Get "http://unix.sock/images/dev-peer0.org1.example.com-basic_1.0-4ec191e793b27e953ff2ede5a8bcc63152cecb1e4c3f301a26e22692c61967ad-42f57faac8360472e47cbbbf3940e81bba83439702d085878d148089a1b213ca/json": dial unix /host/var/run/docker.sock: connect: no such file or directory
    Chaincode installation on peer0.org1 has failed
    Deploying chaincode failed
    

    这个问题是由最新的macOS Docker Desktop版本引起的。为了解决这个问题,可以在Docker Desktopde 偏好设置里使用传统osxfs文件分享时,不选’Use gRPC FUSE for file share’ 并选择 Apply & Restart.

  • 如果您在创建,批准,提交,调用或查询命令时发现错误,确保您已正确更新通道名称和链码名称。 提供的示例命令中有占位符值。

  • 如果您看到以下错误:

    Error: Error endorsing chaincode: rpc error: code = 2 desc = Error installing chaincode code mycc:1.0(chaincode /var/hyperledger/production/chaincodes/mycc.1.0 exits)
    

    您可能有先前运行中链码镜像(例如dev-peer1.org2.example.com-asset-transfer-1.0或 dev-peer0.org1.example.com-asset-transfer-1.0)。 删除它们并再次尝试。

    docker rmi -f $(docker images | grep dev-peer[0-9] | awk '{print $3}')
    
  • 如果您看到以下错误:

    [configtx/tool/localconfig] Load -> CRIT 002 Error reading configuration: Unsupported Config Type ""
    panic: Error reading configuration: Unsupported Config Type ""
    

    那么您没有正确设置环境变量FABRIC_CFG_PATH。configtxgen工具需要此变量才能找到configtx.yaml。 返回执行export FABRIC_CFG_PATH=$PWD/configtx/configtx.yaml,然后重新创建您的通道工件。

  • 如果看到错误消息指出您仍然具有“active endpoints”,请清理您的Docker网络。 这将清除您以前的网络,并以全新环境开始:

    docker network prune
    

    您将看到一下信息:

    WARNING! This will remove all networks not used by at least one container.
    Are you sure you want to continue? [y/N]
    

    选 y

  • 当你试图运行./network.sh createChannel,可能看到下面的错误: and it fails with the following error:

    [comm.tls] ClientHandshake -> ERRO 003 Client TLS handshake failed after 1.908956ms with error: EOF remoteaddress=127.0.0.1:7051
    Error: error getting endorser client for channel: endorser client failed to connect to localhost:7051: failed to create new connection: context deadline exceeded
    After 5 attempts, peer0.org1 has failed to join channel 'mychannel'
    

    你需要卸载Docker Dekstop然后重新安装它,推荐的版本是 2.5.0.1,然后再克隆一份 fabric-samples 代码,再试图运行上面的命令。

  • 如果您看到类似下面的错误:

    /bin/bash: ./scripts/createChannel.sh: /bin/bash^M: bad interpreter: No such file or directory
    

    确保有问题的文件(在此示例中为createChannel.sh)为以Unix格式编码。 这很可能是由于未在Git配置中将core.autocrlf设置为false(查看Windows Extras)。 有几种解决方法。 如果你有例如vim编辑器,打开文件:

    vim ./fabric-samples/test-network/scripts/createChannel.sh
    

    然后通过执行以下vim命令来更改其格式:

    :set ff=unix
    

相关文章:

桂链:使用Fabric的测试网络

桂链是基于Hyperledger Fabric开源区块链框架扩展开发的区块链存证平台&#xff0c;是桂云网络&#xff08;OSG&#xff09;公司旗下企业供应链、流程审批等场景数字存证软件产品&#xff0c;与桂花流程引擎&#xff08;Osmanthus&#xff09;并列为桂云网络旗下的标准与可定制…...

k8s术语master,node,namepace,LABLE

1.Master Kubernetes中的master指的是集群控制节点,每个kubernetes集群里都需要有一个Master节点来负责整个集群的管理和控制,基本上kubernetes的所有控制命令都发给它,它来负责具体的执行过程。Master节点通常会占据一个独立的服务器(高可用建议3台服务器)。 Master节点…...

香港科技大学广州|智能制造学域硕、博研究生招生可持续能源与环境学域博士招生宣讲会—四川大学专场!

香港科技大学广州&#xff5c;智能制造学域硕、博研究生招生&可持续能源与环境学域博士招生宣讲会—四川大学专场&#xff01;&#xff01;&#xff01; 两个学域代表教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01;可带简历现场咨询和面试&#xff01; &am…...

【Vue】 实现TodoList案例(待办事项)

目录 组件化编码流程&#xff08;通用&#xff09; 1.实现静态组件&#xff1a;抽取组件&#xff0c;使用组件实现静态页面效果 2.展示动态数据&#xff1a; 1. 常规 HTML 属性 3.交互——从绑定事件监听开始 什么时候要用 event&#xff1a; 什么时候不需要用 event&am…...

Ubuntu 20.04 安装 ROS 2 Foxy Fitzroy

目录 1&#xff0c;安装前须知 2&#xff0c;安装过程 2.1&#xff0c;设置语言环境 ​2.2&#xff0c;设置源 ​2.3&#xff0c;安装ROS 2软件包 2.4&#xff0c;​环境设置 ​​2.5&#xff0c;测试 2‍.6&#xff0c;不想每次执行source 检验是否成功&#xff08;另…...

【Unity】使用LitJson保存和读取数据的例子

LitJson 是一个轻量级的 JSON 解析和生成库&#xff0c;广泛应用于 .NET 环境中。 优点&#xff1a;轻量级&#xff0c;易用&#xff0c;性能优秀&#xff0c;支持LINQ和自定义对象的序列化和反序列化。 public class LitJsonTest : MonoBehaviour { // Start is called before…...

飞蛾扑火算法优化+Transformer四模型回归打包(内含MFO-Transformer-LSTM及单独模型)

飞蛾扑火算法优化Transformer四模型回归打包&#xff08;内含MFO-Transformer-LSTM及单独模型&#xff09; 目录 飞蛾扑火算法优化Transformer四模型回归打包&#xff08;内含MFO-Transformer-LSTM及单独模型&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 …...

物联网平台厂商有哪些?2025物联网平台推荐?国内有哪些比较好的物联网平台?

评选维度&#xff1a; 技术实力&#xff1a;涵盖设备接入规模、数据处理效率、AI/边缘计算融合能力、协议兼容性及平台架构先进。 应用场景&#xff1a;包括垂直领域解决方案的成熟度、定制化能力、跨行业复用性及实际落地案例规模。 安全可靠&#xff1a;涉及数据传输加密、…...

瑞幸咖啡披露2025年Q1财报:门店净增1757家,营业利润率达8.3%

4月29日&#xff0c;瑞幸咖啡&#xff08;OTC&#xff1a;LKNCY&#xff09;公布2025年第一季度财报。数据显示&#xff0c;2025年第一季度总净收入88.65亿元人民币&#xff0c;同比增长41.2%&#xff0c;GMV达103.54亿元人民币。截止一季度末&#xff0c;门店总数达24097家。依…...

selenium IDE脚本如何转换为可运行的selenium webdriver java程序

上一篇博客&#xff08;用selenium4 webdriver java 搭建并完成第一个自动化测试脚本-CSDN博客&#xff09;介绍了如何创建一个selenium webdriver 的java工程。 之前博客&#xff08;​​​​​​带你用selenium IDE的录制第一个自动化测试脚本也介绍了如何使用selenum ide …...

GA-Transformer遗传算法优化编码器多特征分类预测/故障诊断,作者:机器学习之心

GA-Transformer遗传算法优化编码器多特征分类预测/故障诊断 目录 GA-Transformer遗传算法优化编码器多特征分类预测/故障诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现GA-Transformer遗传算法优化编码器多特征分类预测/故障诊断&#xff0c;运行环境M…...

LeetCode热题100--53.最大子数组和--中等

1. 题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&…...

【计算机视觉】深度解析MediaPipe:谷歌跨平台多媒体机器学习框架实战指南

深度解析MediaPipe&#xff1a;谷歌跨平台多媒体机器学习框架实战指南 技术架构与设计哲学核心设计理念系统架构概览 核心功能与预构建解决方案1. 人脸检测2. 手势识别3. 姿势估计4. 物体检测与跟踪 实战部署指南环境配置基础环境准备获取源码 构建第一个示例&#xff08;手部追…...

血管造影正常≠心脏没事!无创技术破解心肌缺血漏诊困局

提到冠心病检查&#xff0c;很多人会纠结&#xff1a;到底哪项检查能更全面地反映病情、精准得出结论&#xff1f; 从准确性来说&#xff0c;冠脉 CT 与冠脉造影是临床常用手段。二者虽然能够清晰显示血管大冠脉是否存在狭窄或斑块&#xff0c;但二者本质上有相同的 “局限性”…...

ClickHouse副本集群

每个节点安装clickhouse服务安装 zookeeper每个节点修改 /etc/clickhouse-server/config.xml 863行左右 <remote_servers><default><shard><replica><host>18.1.13.30</host><port>9000</port></replica><replica&g…...

Go 语言中的 `os.Truncate` 函数详解

os.Truncate 是 Go 标准库中用于修改文件大小的函数。下面我将全面解析这个函数的功能、用法和注意事项。 函数签名 func Truncate(name string, size int64) error核心功能 os.Truncate 用于&#xff1a; 将指定文件截断或扩展到指定大小处理符号链接时会操作链接指向的实…...

java 加入本地lib jar处理方案

在 Java 项目中&#xff0c;如果想将本地的 .jar 文件加入到 Maven 构建流程中&#xff0c;有以下几种常见方式可以选择&#xff1a; ✅ 推荐方式&#xff1a;将本地 JAR 安装到本地 Maven 仓库 这是最佳实践。通过 mvn install:install-file 命令把JAR 包安装到本地仓库&…...

【Git】之【Get】TortoiseGit不显示状态图标

参考&#xff1a;Windows中解决TortoiseGit 不显示状态图标的问题 实测可行。 打开注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers路径 确保TortoiseGit文件夹在前几个&#xff0c;可以重命名将其他无关…...

[Linux网络_68] 转发 | 路由(Hop by Hop) | IP的分片和组装

目录 1.再谈网络转发 2.路由 举个例子 3.分片和组装 IP 层 [Linux#67][IP] 报头详解 | 网络划分 | CIDR无类别 | DHCP动态分配 | NAT转发 | 路由器 1.再谈网络转发 我们在上一篇文章中知道了路由器的功能有&#xff1a; 转发DHCP | 组建局域网NAT 组建局域网功能表现&…...

Sce2DriveX: 用于场景-到-驾驶学习的通用 MLLM 框架——论文阅读

《Sce2DriveX: A Generalized MLLM Framework for Scene-to-Drive Learning》2025年2月发表&#xff0c;来自中科院软件所和中科院大学的论文。 端到端自动驾驶直接将原始传感器输入映射到低级车辆控制&#xff0c;是Embodied AI的重要组成部分。尽管在将多模态大语言模型&…...

论文笔记-多智能体任务分配:动态智能空间中的拍卖与抢占机制

《IET Cyber-Systems and Robotics》出版中国电信研究院 Wei Li、Zhenhua Liu 团队与山东大学 Jianhang Shang 和 Guoliang Liu 团队的研究成果&#xff0c;文章题为“Multiagent Task Allocation for Dynamic Intelligent Space: Auction and Preemption With Ontology Knowle…...

数据库day-08

一、实验名称和性质 删除修改数据 验证 设计 二、实验目的 1&#xff0e;掌握数据操作-- 删除、修改&#xff1b; 三、实验的软硬件环境要求 硬件环境要求&#xff1a; PC机&#xff08;单机&#xff09; 使用的软件名称、版本号以及模块&#xff1a; Windows 10&#x…...

.NET 平台详解

什么是 .NET&#xff1f; .NET 是一个由微软开发的跨平台、开源的开发者平台&#xff0c;用于构建多种类型的应用程序。它提供了一致的编程模型和丰富的类库&#xff0c;支持多种编程语言&#xff08;如 C#、F#、Visual Basic&#xff09;。 .NET 的核心组成 运行时环境 CLR …...

高效 Transformer 的综述

20年9月来自谷歌研究的论文“Efficient Transformers: A Survey”。 文章主要针对一类X-former模型&#xff0c;例如Reformer, Linformer, Performer, Longformer为例&#xff0c;这些对原版Transformer做了改进&#xff0c;提高了其计算和内存的效率。 self-attention是Tran…...

java每日精进 4.29【框架之自动记录日志并插入如数据库流程分析】

1.日志记录注解&#xff08;LogRecord&#xff09; Repeatable(LogRecords.class) Target({ElementType.METHOD, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface LogRecord {String success();String fail() default "&q…...

HarmonyOS NEXT 诗词元服务项目开发上架全流程实战(二、元服务与应用APP签名打包步骤详解)

在HarmonyOS应用开发过程中&#xff0c;发布应用到应用市场是一个重要的环节。没经历过的童鞋&#xff0c;首次对HarmonyOS的应用签名打包上架可能感觉繁琐。需要各种秘钥证书生成和申请&#xff0c;混在一起分不清。其实搞清楚后也就那会事&#xff0c;各个文件都有它存在的作…...

java的多线程

文章目录 创建线程什么是线程&#xff1f;什么是多线程&#xff1f;如何在程序中创建出多条线程&#xff1f;方式一&#xff1a;继承Thread类方式二&#xff1a;实现Runnable接口方式三&#xff1a;实现Callable接口 三种创建方式的对比 线程的常用方法Thread提供的常用方法Thr…...

CSS--图片链接水平居中展示的方法

原文网址&#xff1a;CSS--图片链接居中展示的方法-CSDN博客 简介 本文介绍CSS图片链接水平居中展示的方法。 图片链接 问题复现 源码 <html xml:lang"cn" lang"cn"><head><meta http-equiv"Content-Type" content"te…...

【计算机视觉】目标检测:深度解析YOLOv5:下一代实时目标检测框架实战指南

深度解析YOLOv5&#xff1a;下一代实时目标检测框架实战指南 技术演进与架构设计YOLO系列发展脉络YOLOv5核心架构1. 骨干网络&#xff08;Backbone&#xff09;2. 特征融合&#xff08;Neck&#xff09;3. 检测头&#xff08;Head&#xff09; 环境配置与快速开始硬件要求建议详…...

CentOS NFS共享目录

最近遇到一个问题&#xff0c;一台CentOS7应用服务器上的服务需要访问另外一台CentOS7应用服务器上的文件&#xff0c;然后传输文件给第三方。想到windows系统之间有文件共享的功能&#xff0c;Linux系统之间是否也有类似的文件共享功能呢&#xff1f; NFS NFS代表Network Fil…...

「国产嵌入式仿真平台:高精度虚实融合如何终结Proteus时代?」——从教学实验到低空经济,揭秘新一代AI赋能的产业级教学工具

引言&#xff1a;从Proteus到国产平台的范式革新 在高校嵌入式实验教学中&#xff0c;仿真工具的选择直接影响学生的工程能力培养与创新思维发展。长期以来&#xff0c;Proteus作为经典工具占据主导地位&#xff0c;但其设计理念已难以满足现代复杂系统教学与国产化技术需求。…...

[随笔] 升级uniapp旧项目的vue、pinia、vite、dcloudio依赖包等

汇总 # 升级uniapp项目dcloudio整体依赖&#xff0c;建议执行多次 # 会顺带自动更新/升级vue的版本 npx dcloudio/uvmlatest alpha# 检查 pinia 的最新版本 npm view pinia version# 更新项目 pinia 到最新版本 npm update pinia# 更新项目 pinia 到特定的版本 # 首先&#xf…...

C++学习:六个月从基础到就业——异常处理:机制与最佳实践

C学习&#xff1a;六个月从基础到就业——异常处理&#xff1a;机制与最佳实践 本文是我C学习之旅系列的第三十八篇技术文章&#xff0c;也是第二阶段"C进阶特性"的最后一篇&#xff0c;主要介绍C中的异常处理机制及其最佳实践。查看完整系列目录了解更多内容。 引言…...

【MongoDB篇】MongoDB的数据库操作!

目录 引言第一节&#xff1a;数据库的“诞生”——如何创建数据库&#xff1f;&#x1f914;第二节&#xff1a;数据库的“查阅”——看看我的数据库们&#xff01;&#x1f575;️‍♀️第三节&#xff1a;数据库的“切换”——我在哪个房间干活&#xff1f;➡️&#x1f6aa;…...

react-新建项目复用node_modules

每次新建定制时&#xff0c;前端都需要npm i来安装依赖&#xff0c;耗时长 失败多。 可以把这个bat文件放到新建分支的前端目录下&#xff0c;修改后双击bat文件运行&#xff0c;如果不需要添加修改依赖&#xff0c;无需运行npm i node_modules.bat里面的内容如下&#xff1a;…...

unity Orbbec Femto Bolt接入unity流程记录 AzureKinectExamples 插件 使用记录

奥比中光的深度相机Orbbec Femto Bolt是Microsoft的Azure Kinect DK的升级版&#xff0c;根据官网的文档配置环境遇到了一些问题&#xff0c;记录一下。 注意&#xff1a; 官网文档链接&#xff1a;Femto Bolt文档 1、首先连接相机到电脑USB3.0&#xff0c;接通电源&#xf…...

信息科技伦理与道德3-4:面临挑战

1 人机结合 1.1 人机结合的挑战 如何处理好人与机器的决策的关系&#xff1f;智能决策的不透明、不可解释性…出了问题该谁负责&#xff1f; 案例1&#xff1a;设想救护车调度系统造成混乱 某城市使用一个机器学习平台来进行城市里医院的救护车调度工作。起初&#xff0c;这个…...

对比测评:为什么AI编程工具需要 Rules 能力?

通义灵码 Project Rules 在开始体验通义灵码 Project Rules 之前&#xff0c;我们先来简单了解一下什么是通义灵码 Project Rules&#xff1f; 大家都知道&#xff0c;在使用 AI 代码助手的时候&#xff0c;有时候生成的代码不是自己想要的&#xff0c;或者说生成的代码采纳后…...

git学习之git常用命令

1. 初始化仓库 git init初始化一个新的 Git 仓库。 2. 克隆远程仓库 git clone <repository-url>从远程服务器克隆一个已有仓库到本地。 3. 配置用户名和邮箱 git config --global user.name "Your Name" git config --global user.email "youexampl…...

The Open Group 参加雷丁博物馆的数字革命展览

The Open Group 参加了雷丁博物馆的数字革命展览&#xff0c;庆祝雷丁市转型为数字中心60周年。 展览于3月18日&#xff08;星期二&#xff09;向公众开放&#xff0c;将持续至2025年12月24日。展览旨在纪念雷丁市令人惊叹的科技之旅&#xff0c;从1964年数字设备公司&#xff…...

Linux[配置vim]

Linux[配置vim] 我这里的环境是xshell8的虚拟机,Ubuntu 配置好了以后功能嘎嘎多 以下是为 Ubuntu 配置功能增强版 Vim 的详细步骤&#xff0c;包含代码高亮、插件管理、自动补全、文件导航等常用功能&#xff1a; 1. 安装最新版 Vim sudo apt update sudo apt install vim-g…...

【数据结构】图论存储结构深度解析:邻接多重表如何实现无向图O(1)删边?邻接矩阵/链表/十字链对比

邻接多重表 导读一、有向图的存储结构二、邻接多重表三、存储结构四、算法评价4.1 时间复杂度4.2 空间复杂度 五、四种存储方式的总结5.1 空间复杂度5.2 找相邻边5.3 删除边或结点5.4 适用于5.5 表示方式 六、图的基本操作结语 导读 大家好&#xff0c;很高兴又和大家见面啦&a…...

【AlphaFold2】Feature extraction:提取特征,为模型输入做准备|Datapipeline讲解

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a;【深度学习】多头注意力机制的实现|pytorch每日一言&#x1f33c;: 学习成绩只是表象&#xff0c;而学习能力才是伴随一身的结果&#x1f33a;…...

Android 实现一个隐私弹窗

效果图如下&#xff1a; 1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数 2. 《用户协议》、《隐私政策》设置成可点击的&#xff0c;且颜色要区分出来 res/layout/dialog_privacy_policy.xml 文件 <?xml version"1.0" encoding"utf-8"?&…...

第三方软件测试报告如何凭借独立公正与专业权威发挥关键作用?

在软件项目里&#xff0c;第三方软件测试报告起着极为关键的作用。第三方有着中立客观的立场。第三方具备专业能力。凭借这些&#xff0c;第三方能为软件质量评估提供可靠依据。下面要从不同方面介绍第三方软件测试报告。 独立公正性 第三方测试机构与软件开发方、使用方不存…...

QT控件 参考Qt的PIMPL设计模式实现使用QWidget控件绘制3D饼状图表和3D柱状图表,使用QChartView绘制圆柱体图表

整体绘制效果就是:Qt 实现3维饼状图 中的内容, 只不过我借鉴了Qt的PIMPL模式重新封装了整个实现过程 实现效果展示 目录导读 实现效果展示前言绘制3D饼状图表PIMPL模式设计类具体实现计算圆弧中心判断点是否在某个扇区中在私有类中绘制绘制3D柱状图表PIMPL模式设计类具体实现绘…...

Android Q允许低内存启用系统弹窗

如果SYSTEM_ALERT_WINDOW权限可用&#xff0c;则返回true。 *从Q开始&#xff0c;在低ram手机上禁用SYSTEM_ALERT_WINDOW。 vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/Utils.java public static boolean isSystemAlertWindowEnabled(Co…...

Leetcode 3532. Path Existence Queries in a Graph I

Leetcode 3532. Path Existence Queries in a Graph I 1. 解题思路2. 代码实现 题目链接&#xff1a;3532. Path Existence Queries in a Graph I 1. 解题思路 这一题算是一个比较典型的DSU的题目&#xff0c;我们就是不断地根据前后节点的距离将其进行聚类&#xff0c;然后…...

AI Agent Protocols:现状、挑战与未来展望

一、引言 在当今人工智能飞速发展的时代&#xff0c;大语言模型&#xff08;LLMs&#xff09;的进步使得LLM智能体在各个行业得到了广泛的应用&#xff0c;如客户服务、内容生成、数据分析和医疗保健等领域。 然而&#xff0c;随着越来越多的LLM智能体被部署&#xff0c;一个…...

自动化立库/AGV物流仿真详细步骤

以下是一种可以在预算和周期内实现自动化立库及AGV 方案仿真分析的方法&#xff1a; 一、工具选择 软件工具FlexSim&#xff1a;这是一款流行的离散事件仿真软件。它具有直观的图形用户界面&#xff0c;通过简单的拖拽操作就可以构建自动化立库和 AGV 的模型。其内置的丰富的…...