Hyperledger Fabric 2.0 官方文档中文版 第4章 入门

Hyperledger Fabric 2.0 官方文档中文版 第4章 入门

  • 总目录
  • 4.入门
    • 先决条件
      • 安装Git
      • 安装cURL
      • 安装wget
      • 安装Docker and Docker Compose
      • Go编程语言
      • Node.js Runtime和NPM
      • Windows附加功能
    • 安装示例、二进制文件和Docker镜像
    • 使用Fabric测试网络
      • 开始之前
      • 启动测试网络
      • 创建通道
      • 在通道上启动链码
      • 与网络交互
      • 关闭网络
      • 下一步
      • 使用证书颁发机构启动网络
      • 幕后发生了什么?
      • 故障排除
    • Hyperledger Fabric智能合约(链码)API
    • Hyperledger Fabric应用程序SDK
    • Hyperledger Fabric CA


总目录

第1章 引言
第2章 Hyperledger Fabric v2.0的新增功能
第3章 关键概念
第4章 入门
第5章 开发应用程序
第6章 教程(上)
第6章 教程(下)
第7章 部署生产网络
第8章 操作指南
第9章 升级到最新版本


4.入门

在我们开始之前,如果您还没有这样做,您可能希望检查您是否已在开发区块链应用程序和/或操作Hyperledger Fabric的平台上安装了所有先决条件。

一旦安装了必备组件,就可以下载并安装HyperLedger Fabric了。当我们为Fabric二进制文件开发真正的安装程序时,我们提供了一个脚本,用于将示例、二进制文件和Docker镜像安装到您的系统中。该脚本还将下载Docker镜像到您的本地注册表。

将Fabric示例和Docker镜像下载到本地计算机后,可以使用Fabric test network教程开始使用Fabric。


先决条件

在开始之前,您应该确认您已经在将要运行Hyperledger Fabric的平台上安装了以下所有先决条件。

注意:建议Fabric用户使用这些先决条件。如果您是一个Fabric开发人员,您应该参考有关设置开发环境的说明。

安装Git

如果尚未安装git的最新版本,或者在运行curl命令时遇到问题,请下载该版本。

安装cURL

如果cURL工具尚未安装,或者在运行文档中的cURL命令时出错,请下载cURL工具的最新版本。

注意:如果您使用的是Windows,请参阅下面有关Windows附加功能的具体说明。

安装wget

如果要根据安装示例、二进制文件和Docker镜像文档下载结构二进制文件,则需要安装wget

  • MacOSX默认不包含wget,可以使用brew install wget进行安装。

安装Docker and Docker Compose

您将需要在将要在其上操作或开发(或针对)Hyperledger Fabric的平台上安装以下组件:

  • 需要MacOSX、*nix或Windows 10:Docker Docker 17.06.2-ce或更高版本。
  • 旧版本的Windows:Docker Toolbox-同样,需要Docker version Docker 17.06.2-ce或更高版本。

您可以使用以下命令从终端提示符检查您安装的Docker版本:

docker --version

注意:以下内容适用于运行systemd的linux系统。

确保docker守护进程正在运行。

sudo systemctl start docker

可选:如果要在系统启动时启动docker守护程序,请使用以下命令:

sudo systemctl enable docker

将用户添加到docker组。

sudo usermod -a -G docker <username>

注意:安装Docker for Mac或Windows或Docker Toolbox也将安装Docker Compose。如果您已经安装了Docker,您应该检查是否安装了Docker Compose 1.14.0或更高版本。如果没有,我们建议您安装更高版本的Docker。

您可以使用以下命令从终端提示符检查已安装的Docker Compose版本:

docker-compose --version

Go编程语言

Hyperledger Fabric的许多组件都使用Go编程语言。

  • 需要Go版本1.13.x。

考虑到我们将在Go中编写链码程序,您需要正确设置两个环境变量;如果您在Linux下使用bash shell,您可以将它们放在适当的启动文件中,例如您的个人~/.bashrc文件,从而使这些设置永久化。

首先,必须将环境变量GOPATH设置为指向包含已下载结构代码库的Go工作区,如下所示:

export GOPATH=$HOME/go

注意:必须设置GOPATH变量
即使在Linux中,Go的GOPATH变量可以是一个冒号分隔的目录列表,并且如果未设置,将使用默认值$HOME/Go,但是当前的Fabric构建框架仍然要求您设置和导出该变量,并且它必须包含Go工作区的单个目录名。(在将来的版本中可能会删除此限制。)

其次,您应该(同样,在适当的启动文件中)扩展命令搜索路径,以包括Go bin目录,例如以下Linux下bash的示例:

export PATH=$PATH:$GOPATH/bin

虽然此目录可能不存在于新的Go工作区安装中,但稍后由Fabric构建系统填充,生成系统的其他部分使用少量Go可执行文件。因此,即使您当前还没有这样的目录,也可以像上面一样扩展shell搜索路径。

Node.js Runtime和NPM

如果您将使用Hyperledger Fabric SDK为Hyperledger Fabric开发应用程序Node.js,8.9.4及更高版本支持版本8。Node.js10.15.3及更高版本支持版本10。

  • Node.js下载

注意:安装Node.js也将安装NPM,但是建议您确认安装的NPM版本。您可以使用以下命令升级npm工具:

npm install npm@5.6.0 -g

Python
注意:以下仅适用于Ubuntu16.04用户。

默认情况下,ubuntu16.04附带python3二进制文件python3.5.1。Fabric Node.js SDK需要python2.7的迭代才能成功完成npm安装操作。使用以下命令检索2.7版本:

sudo apt-get install python

检查您的版本:

python --version

Windows附加功能

在Windows 10上,您应该使用本机Docker发行版,也可以使用Windows Power Shell。但是,要使binaries命令成功,您仍然需要uname命令可用。您可以将其作为Git的一部分获得,但要注意,只有64位版本才受支持。

在运行任何git clone命令之前,请运行以下命令:

git config --global core.autocrlf false
git config --global core.longpaths true

可以使用以下命令检查这些参数的设置:

git config --get core.autocrlf
git config --get core.longpaths

这些需要分别为falsetrue

Git和Docker Toolbox附带的curl命令很旧,不能正确处理入门中使用的重定向。确保您拥有并使用一个更新的版本,该版本可以从cURL下载页面下载

注意:如果您有本文档没有解决的问题,或者遇到任何教程的问题,请访问仍然有问题?页面获取有关在何处找到其他帮助的提示。


安装示例、二进制文件和Docker镜像

当我们为Hyperledger Fabric二进制文件开发真正的安装程序时,我们提供了一个脚本,可以将示例和二进制文件下载并安装到您的系统中。我们认为您会发现安装的示例应用程序对于进一步了解Hyperledger Fabric的功能和操作非常有用。

注意:如果您是在Windows上运行的,您需要使用Docker快速启动终端来执行即将到来的终端命令。如果以前没有安装,请访问先决条件。

如果您使用的是Docker Toolbox或macOS,则安装和运行示例时需要使用/Users(macOS)下的位置。

如果使用Docker for Mac,则需要使用/Users/Volumes/private/tmp下的位置。要使用不同的位置,请参考Docker文档进行文件共享。

如果您使用Docker for Windows,请查阅Docker文档中的共享驱动器,并使用其中一个共享驱动器下的位置。

注意:如果您在Mac上运行,则可能需要在继续之前安装wgetwget命令用于从GitHub版本下载二进制文件。要安装wget,请使用brew install wget

确定计算机上要放置结构示例存储库的位置,然后在终端窗口中输入该目录。下面的命令将执行以下步骤:

  1. 如果需要,请克隆hyperledger/fabric-sample存储库
  2. 签出相应的版本标记
  3. 将指定版本的Hyperledger Fabric平台特定的二进制文件和配置文件安装到Fabric samples的/bin和/config目录中
  4. 下载指定版本的Hyperledger Fabric docker镜像

准备好之后,在将要安装结构示例和二进制文件的目录中,继续执行命令以下拉二进制文件和镜像。

注意:如果需要最新的生产版本,请省略所有版本标识符。

curl -sSL https://bit.ly/2ysbOFE | bash -s

注意:如果您想要一个特定的版本,请传递Fabric、Fabric ca和thirdparty Docker镜像的版本标识符。下面的命令演示了如何下载最新的产品发行版—Fabric v2.0.1Fabric CA v1.4.6

curl -sSL https://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version> <thirdparty_version>
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.0.1 1.4.6 0.4.18

注意:如果运行上述curl命令时出错,则可能是curl版本太旧,无法处理重定向或环境不受支持。
请访问先决条件页面,了解在哪里可以找到curl的最新版本并获得正确的环境。或者,您可以替换未缩短的URL:https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh

上面的命令下载并执行一个bash脚本,该脚本将下载并提取设置网络所需的所有特定于平台的二进制文件,并将它们放入上面创建的克隆repo中。它检索以下特定于平台的二进制文件:

  • configtxgen,
  • configtxlator,
  • cryptogen,
  • discover,
  • idemixgen,
  • orderer,
  • peer,
  • fabric-ca-client,
  • fabric-ca-server

并将它们放在当前工作目录的bin子目录中。

您可能需要将其添加到PATH环境变量中,以便在不完全限定每个二进制文件的路径的情况下获取这些变量。例如:

export PATH=<path to download location>/bin:$PATH

最后,脚本将从docker Hub将Hyperledger Fabric docker镜像下载到本地docker注册表中,并将其标记为“最新”。

脚本列出了在结束时安装的Docker镜像。

看看每个镜像的名称;这些组件最终将构成我们的Hyperledger Fabric网络。您还将注意到,您有两个相同镜像ID的实例-一个标记为“amd64-1.x.x”和一个标记为“latest”。在1.2.0之前,正在下载的镜像由uname-m确定,显示为“x86_64-1.x.x”。

在不同的体系结构上,x86_64/amd64将替换为标识您的体系结构的字符串。

如果您有本文档没有解决的问题,或者遇到任何教程的问题,请访问仍然有问题?页面获取有关在何处找到其他帮助的提示。

使用Fabric测试网络

下载了Hyperledger Fabric Docker镜像和示例后,可以使用fabric-samples存储库中提供的脚本部署测试网络。通过在本地计算机上运行节点,可以使用测试网络来了解结构。更有经验的开发者可以使用网络来测试他们的智能合约和应用程序。这个网络只能作为教育和测试的工具。不应将其用作网络部署模板。Fabric v2.0中引入了测试网络,作为first-network样本的长期替代品。

示例网络使用Docker Compose部署了一个Fabric网络。因为节点是隔离在Docker Compose网络中的,所以测试网络没有配置为连接到其他正在运行的结构节点。

注意:这些指令已经过验证,可以在提供的tar文件中针对最新的stable Docker镜像和预编译的安装实用程序工作。如果使用当前主分支中的镜像或工具运行这些命令,则可能会遇到错误。

开始之前

在运行测试网络之前,需要克隆fabric-samples存储库并下载Fabric镜像。确保您已经安装了先决条件并安装了示例、二进制文件和Docker镜像。

启动测试网络

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

cd fabric-samples/test-network

在这个目录中,你可以找到一个带注释的脚本,network.sh,它使用本地计算机上的Docker镜像建立一个结构网络。你可以跑./network.sh -h打印脚本帮助文本:

Usage:
  network.sh > [Flags]
    >
      - 'up' - bring up fabric orderer and peer nodes. No channel is created
      - 'up createChannel' - bring up fabric network with one channel
      - 'createChannel' - create and join a channel after the network is created
      - 'deployCC' - deploy the fabcar chaincode on the channel
      - 'down' - clear the network with docker-compose down
      - 'restart' - restart the network

    Flags:
    -ca > -  create Certificate Authorities to generate the crypto material
    -c > - channel name to use (defaults to "mychannel")
    -s > - the database backend to use: goleveldb (default) or couchdb
    -r > - CLI times out after certain number of attempts (defaults to 5)
    -d > - delay duration in seconds (defaults to 3)
    -l > - the programming language of the chaincode to deploy: go (default), javascript, or java
    -v >  - chaincode version. Must be a round number, 1, 2, 3, etc
    -i > - the tag to be used to launch the network (defaults to "latest")
    -verbose - verbose mode
  network.sh -h (print this message)

 Possible Mode and flags
  network.sh up -ca -c -r -d -s -i -verbose
  network.sh up createChannel -ca -c -r -d -s -i -verbose
  network.sh createChannel -c -r -d -verbose
  network.sh deployCC -l -v -r -d -verbose

 Taking all defaults:
    network.sh up

 Examples:
  network.sh up createChannel -ca -c mychannel -s couchdb -i 2.0.0
  network.sh createChannel -c channelName
  network.sh deployCC -l javascript

test-network目录内,运行以下命令以从以前的任何运行中删除任何容器或项目:

./network.sh down

然后可以通过发出以下命令启动网络。如果尝试从其他目录运行脚本,则会遇到问题:

./network.sh up

此命令创建一个由两个普通节点和一个排序节点组成的结构网络。当./network.sh up运行时不会创建通道,虽然我们会在未来一步到达那里。如果命令成功完成,您将看到正在创建的节点的日志:

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网络成员的组织组通常被称为联盟。测试网络有两个联盟成员,Org1和Org2。网络还包括维护网络的排序服务的排序节点组织。

节点是任何Fabric网络的基本组成部分。节点存储区块链账本,并在提交到账本之前验证交易。节点运行智能合约,其中包含用于管理区块链账本上资产的业务逻辑。

网络中的每个节点都需要属于联盟的一个成员。在测试网络中,每个组织都运行一个节点,即peer0.org1.example.compeer0.org2.example.com

每个Fabric网络还包括排序服务。当节点验证交易并将交易区块添加到区块链账本中时,他们不会决定交易的顺序或将其纳入新区块。在分布式网络上,节点可能彼此运行得很远,并且对交易何时创建没有共同的看法。就交易顺序达成共识是一个成本高昂的过程,会给节点带来开销。

排序服务允许节点集中精力验证交易并将其提交到账本。在排序节点从客户端接收到背书的交易后,它们就交易的顺序达成共识,然后将它们添加到块中。然后,区块被分发到普通节点,普通节点将区块添加到区块链账本中。排序节点还操作定义Fabric网络功能的系统通道,例如如何生成块以及节点可以使用的Fabric版本。系统通道定义了哪些组织是联盟的成员。

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

创建通道

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

你可以使用network.sh脚本在Org1和Org2之间创建一个通道,并将它们的节点连接到该通道。运行以下命令以创建默认名称mychannel的通道:

./network.sh createChannel

如果命令成功,您可以在日志中看到以下消息:

========= Channel successfully joined ===========

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

./network.sh createChannel -c channel1

通道标志还允许您通过指定不同的通道名称来创建多个通道。创建mychannel或channel1后,可以使用下面的命令创建名为channel2的第二个通道:

./network.sh createChannel -c channel2

如果要启动网络并在一个步骤中创建通道,可以同时使用up和createChannel模式:

./network.sh up createChannel

在通道上启动链码

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

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

在Fabric中,智能合约在网络上部署在称为链码的包中。链码安装在组织的节点上,然后部署到一个通道,在那里它可以被用来背书交易和与区块链账本交互。在将链码部署到通道之前,通道成员需要就建立链码治理的链码定义达成一致。当所需数量的组织达成一致时,可以将链码定义提交给通道,并且可以使用链码。

在你使用了network.sh要创建通道,可以使用以下命令在通道上启动链码:

./network.sh deployCC

deployCC子命令将在peer0.org1.example.compeer0.org2.example.com上安装fabcar链码。然再使用channel标志指定的通道上部署链码(如果没有指定通道,则部署mychannel)。如果您是第一次部署链码,则脚本将安装链码依赖项。默认情况下,脚本安装fabcar链码的Go版本。但是,您可以使用语言标志-1来安装链码的Java或javascript版本。您可以在fabric-samples目录的chaincode文件夹中找到Fabcar链码。此文件夹包含示例链码,这些代码是教程用来突出显示Fabric功能的示例。

fabcar链码定义提交给通道后,脚本通过调用init函数初始化链码,然后调用链码将汽车的初始列表放在账本上。然后,脚本查询链码以验证是否添加了数据。如果正确安装、部署和调用了链码,您应该会在日志中看到以下车辆列表:

[{"Key":"CAR0", "Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},
{"Key":"CAR1", "Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},
{"Key":"CAR2", "Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}},
{"Key":"CAR3", "Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},
{"Key":"CAR4", "Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}},
{"Key":"CAR5", "Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},
{"Key":"CAR6", "Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},
{"Key":"CAR7", "Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},
{"Key":"CAR8", "Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},
{"Key":"CAR9", "Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]
===================== Query successful on peer0.org1 on channel 'mychannel' =====================

与网络交互

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

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

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

您还需要在fabric-samples存储库中将FABRIC_CFG_PATH设置为指向core.yaml文件:

export FABRIC_CFG_PATH=$PWD/../config/

现在,您可以设置允许您将peerCLI操作为Org1的环境变量:

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

CORE_PEER_TLS_ROOTCERT_FILECORE_PEER_MSPCONFIGPATH环境变量指向organizations文件夹中的Org1加密材料。

如果你用./network.sh deployC来安装并启动fabcar链码,现在可以从CLI查询账本。运行以下命令以获取已添加到您的通道账本的汽车列表:

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

如果命令成功,则可以看到运行脚本时在日志中打印的相同车辆列表:

[{"Key":"CAR0", "Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},
{"Key":"CAR1", "Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},
{"Key":"CAR2", "Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"Jin Soo"}},
{"Key":"CAR3", "Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},
{"Key":"CAR4", "Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}},
{"Key":"CAR5", "Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},
{"Key":"CAR6", "Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},
{"Key":"CAR7", "Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},
{"Key":"CAR8", "Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},
{"Key":"CAR9", "Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]

当网络成员希望转移或更改账本上的资产时,会调用链码。通过调用fabcar链码,使用以下命令更改账本上汽车的所有者:

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

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

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

注意:如果部署了Java链码,请使用以下参数运行invoke命令:'{“function”:“changeCarOwner”,“Args”:[“CAR009”,“Dave”]}',用Java编写的Fabcar链码使用的索引与用Javascipt或Go编写的链码不同。

因为fabcar链码的背书策略要求交易由Org1和Org2签名,所以chaincode invoke命令需要同时针对peer0.Org1.example.compeer0.org2.example.com使用--peeradresses标志。由于为网络启用了TLS,因此该命令还需要使用--tlsRootCertFiles标志为每个节点引用TLS证书。

调用链码后,我们可以使用另一个查询来查看调用是如何更改区块链账本上的资产的。因为我们已经查询了Org1节点,所以我们可以借此机会查询在Org2节点上运行的链码。将以下环境变量设置为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/Admin@org2.example.com/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:

{"make":"Holden","model":"Barina","colour":"brown","owner":"Dave"}

关闭网络

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

./network.sh down

该命令将停止并删除节点和链码容器,删除组织加密材料,并从Docker注册表中删除链码镜像。该命令还从以前的运行中删除通道artifacts和docker volumes ,如果你遇到任何问题,允许您再次运行./network.sh up

下一步

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

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

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

使用证书颁发机构启动网络

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

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

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

但是,test network脚本还提供了使用证书颁发机构(CAs)启动网络的选项。在生产网络中,每个组织都运行一个CA(或多个中间CA),该CA创建属于其组织的身份。由组织运行的CA创建的所有标识共享同一个信任根。虽然比使用cryptogen需要更多的时间,但是使用CAs启动测试网络提供了如何在生产中部署网络的介绍。部署ca还允许您使用Fabric sdk注册客户端身份,并为应用程序创建证书和私钥。

如果要使用结构CA启动网络,请首先运行以下命令以关闭所有正在运行的网络:

./network.sh down

然后可以使用CA标志启动网络:

./network.sh up -ca

发出命令后,您可以看到脚本启动了三个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 admin用户的MSP文件夹:

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

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

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

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

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

幕后发生了什么?

如果您有兴趣了解有关示例网络的更多信息,可以研究test-network目录中的文件和脚本。下面的步骤提供了在您发出./network.sh up命令时发生的操作的向导。

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

故障排除

如果您对以下教程有任何问题,请查看:

  • 你应该总是重新开始你的网络。可以使用以下命令从以前的运行中删除项目、加密材料、容器、卷和链码镜像:
./network.sh down

如果不删除旧容器、镜像和卷,则会看到错误。

  • 如果看到Docker错误,请首先检查Docker版本(先决条件),然后尝试重新启动Docker进程。Docker的问题常常无法立即识别。例如,您可能会看到错误,这些错误是由于节点无法访问容器中安装的加密材料而导致的。

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

docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -q)
  • 如果在create、approve、commit、invoke或query命令中看到错误,请确保正确更新了通道名称和链码名称。提供的示例命令中有占位符值。
  • 如果您看到以下错误:
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-fabcar-1.0dev-peer0.org1.example.com-fabcar-1.0),来自之前的运行。删除它们,然后再试一次。

docker rmi -f $(docker images | grep peer[0-9]-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,然后重新创建通道工件。

  • 如果你看到一个错误,说明你仍然有“活动端点”,那么修剪你的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

  • 如果您看到类似于以下内容的错误:
/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
  • 如果您的排序程序在创建时退出,或者您看到create channel命令由于无法连接到排序服务而失败,请使用docker logs命令从排序节点读取日志。您可能会看到以下消息:
PANI 007 [channel system-channel] config requires unsupported orderer capabilities: Orderer capability V2_0 is required but not supported: Orderer capability V2_0 is required but not supported

当您尝试使用Fabric版本1.4.x docker镜像运行网络时,会发生这种情况。测试网络需要使用Fabric版本2.x运行。

如果您仍然看到错误,请在Hyperledger Rocket Chat或StackOverflow上的fabric-questions通道上共享您的日志。


Hyperledger Fabric智能合约(链码)API

Hyperledger Fabric提供了许多API来支持用各种编程语言开发智能合约(链码)。智能合约API可用于Go,Node.js,和Java:

  • Go智能合约API。
  • Node.js智能合约API 和 Node.js智能合约API文档。
  • Java智能合约API 和 Java智能合约API文档。

Hyperledger Fabric应用程序SDK

Hyperledger Fabric提供了许多SDK来支持用各种编程语言开发应用程序。SDK可用于Node.js和Java:

  • Node.js SDK 和 Node.js SDK文档。
  • Java SDK 和 Java SDK文档。

使用SDK进行开发的先决条件可以在Node.js SDK自述文件和Java SDK自述文件。

此外,还有两个应用程序SDK尚未正式发布(针对Python和Go),但仍可以下载和测试:

  • Python SDK。
  • Go SDK。

目前,Node.js Java支持Hyperledger Fabric V1.4中提供的新应用程序编程模型。对Go的支持计划在以后的版本中提供。

Hyperledger Fabric CA

Hyperledger Fabric提供可选的证书颁发机构服务,您可以选择使用该服务来生成证书和密钥材料,以配置和管理区块链网络中的身份。但是,可以使用任何可以生成ECDSA证书的CA。


参考自官方文档
如有侵权,请联系作者删除,谢谢!
If there is infringement, please contact the author to delete, thank you!

你可能感兴趣的:(Hyperledger,Fabric,2.x,区块链,区块链,分布式,数据库,安全,智能合约)