将Hyperledger Composer区块链业务网络部署到Hyperledger Fabric(多个组织)_fabric cello 多组织网络-程序员宅基地

技术标签: hyperledger-composer  区块链-hyperledger-composer  

将Hyperledger Composer区块链业务网络部署到Hyperledger Fabric(多个组织)

本教程深入介绍了跨区域链网络的配置过程,涵盖了多个组织。

它概述了配置基于Hyperledger Fabric的多组织区块链网络所需的步骤。双组织区块链网络基于Hyperledger Fabric提供的示例网络。此外,它描述了在任一组织中生成必要的安全工件并保护网络的步骤。

一旦配置了区块链网络,我们将展示如何部署业务网络(例如,来自我们的示例网络的商品交易业务网络),该网络在其自己的链代码容器中运行,并在两个组织共享的分类账上实例化。然后,我们将与共享分类帐的交互显示为不同的参与者/身份,由每个组织中的身份提供者生成。

建议您先按照随附的单一组织教程进行操作; 本教程演示了如何将区块链网络部署到单个组织的Hyperledger Fabric实例,并将更详细地解释一些概念。

本教程中的Hyperledger Fabric区块链网络(适用于两个组织)使用docker容器配置,在同一台机器上使用两个组织的结构网络 - 显然,在现实世界中,它们将位于不同的IP网络或域中,或者安全的云环境。

为方便起见,本教程使用了颜色编码的步骤,以指示“哪个组织”应遵循特定的步骤或顺序 - 或者实际上,如果两个组织都需要步骤。

第一种步骤是两个组织遵循:

示例步骤:Org1和Org2的步骤

该组织Org1由绿色康加块的Alice代表:

示例步骤:Org1遵循的步骤

该组织Org2由Violet Conga Block的Bob代表:

示例步骤:遵循Org2的步骤

您可以自己执行这些步骤,也可以与朋友或同事配对,并一起执行这些步骤。

让我们开始吧!

先决条件

如果您以前安装了Composer开发环境,则需要首先拆除开发环境提供的Hyperledger Fabric容器:

复制

cd ~/fabric-dev-servers
export FABRIC_VERSION=hlfv12
./stopFabric.sh
./teardownFabric.sh

接下来,使用命令行克隆以下GitHub Fabric Samples存储库(重要提示:请勿使用Fabric站点中的示例因为它缺少本教程所需的一些更改)

复制

git clone https://github.com/mahoney1/fabric-samples.git

我们正在使用 构建您的第一个网络结构示例网络来进行此多组织教程。我们将此Hyperledger Fabric网络称为“BYFN”(构建您的第一个网络)网络。如果您选择将组织拆分为跨不同的物理计算机或在不同IP网络上运行的单独虚拟机,则它超出了本特定教程的范围。

第一步:启动Hyperledger Fabric网络

为了学习本教程,您必须启动一个全新的Hyperledger Fabric网络。本教程假设您使用Hyperledger Fabric 构建您的第一个网络教程中提供的Hyperledger Fabric 网络

  1. 将目录更改为 fabric-samples

    复制
    cd fabric-samples
    
  2. 使用此命令下载平台二进制文件,包括cryptogen(bash命令需要三个参数):

    复制
    curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.1 1.2.1 0.4.10
    

    验证下载的docker映像列表没有问题。

    (请注意,您可以忽略输出中的初始“错误:pathspec v1.xx不匹配”消息 - 您甚至可能看不到此消息)

  3. 我们需要使用我们之前克隆的Git repo中的'multi-org'分支(以使用当前的Fabric级别):

    复制
    git checkout multi-org
    
  4. 将目录更改为first-network示例

    复制
    cd first-network
    
  5. 接下来,启动BYFN网络 - byfn.sh必须指定其他标志(到下面的脚本),因为我们使用CouchDB作为世界状态数据库(与Fabric BYFN页面上指定的不同) - 我们还想启动证书颁发机构(CA)每个组织。

  6. first-network目录中依次执行以下命令:

    复制
    ./byfn.sh -m generate
    
    ./byfn.sh -m up -s couchdb -a
    

如果该命令成功运行,则第一个命令将生成Fabric网络/安全工件(请参阅此链接。在第二个命令(上面)之后,启动BYFN网络,并在继续之前验证您是否看到以下输出:

复制

========= All GOOD, BYFN execution completed ===========


_____   _   _   ____
| ____| | \ | | |  _ \
|  _|   |  \| | | | | |
| |___  | |\  | | |_| |
|_____| |_| \_| |____/

接下来,从以前的Fabric环境中删除钱包中可能存在的所有“旧”业务网卡。可以安全地忽略任何表明无法找到业务网卡的错误:

复制

composer card delete -c PeerAdmin@byfn-network-org1
composer card delete -c PeerAdmin@byfn-network-org2
composer card delete -c alice@trade-network
composer card delete -c bob@trade-network
composer card delete -c admin@trade-network
composer card delete -c PeerAdmin@fabric-network

但是,任何其他类型的故障都可能表明您在卡片商店中有来自较旧版本的Hyperledger Composer的卡片,然后您必须删除HOME目录中的文件系统卡存储,如下所示:

复制

rm -fr $HOME/.composer

第二步:探索Hyperledger Fabric网络

此步骤将探讨BFYN网络配置和组件。需要配置详细信息才能完成后续步骤。

组织

BYFN网络由两个组织组成:Org1Org2。组织Org1使用域名org1.example.com。会员服务提供商(MSP)Org1被称为Org1MSP。组织Org2使用域名org2.example.com。MSP for Org2被称为Org2MSP。在本教程中,您将部署一个blockchain业务网络,无论是组织Org1,并Org2能与之交互。

网络组件

Hyperledger Fabric网络由几个组件组成:

  • 两个对等节点Org1,命名peer0.org1.example.compeer1.org1.example.com
    • 请求端口peer0是7051。
    • 事件中心端口为peer07053。
    • 请求端口为peer18051。
    • 事件中心端口为peer18053。
  • 单个CA(证书颁发机构)Org1,名称为ca.org1.example.com
    • CA端口是7054。
  • 两个对等节点Org2,命名peer0.org2.example.compeer1.org2.example.com
    • 请求端口为peer09051。
    • 事件中心端口为peer09053。
    • 请求端口为peer110051。
    • 事件中心端口为peer110053。
  • 单个CA(证书颁发机构)Org2,名称为ca.org2.example.com
    • CA端口是8054。
  • 单个订货人节点,名为orderer.example.com
    • 订货人港口是7050。

这些组件在Docker容器中运行。在Docker容器中运行Hyperledger Composer时,上面的名称(例如peer0.org1.example.com)可用于与Hyperledger Fabric网络进行交互。

本教程将在Docker主机上运行Hyperledger Composer命令,而不是从Docker网络内部运行。这意味着Hyperledger Composer命令必须使用Hyperledger Fabric网络localhost作为主机名和公开的容器端口进行交互。

使用TLS保护所有网络组件以加密通信。您将需要所有网络组件的证书颁发机构(CA)证书才能连接到这些网络组件。可以在包含byfn.sh脚本的目录中找到CA证书。

订货人节点的CA证书:

复制

crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt

CA证书Org1

复制

crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt

CA证书Org2

复制

crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

稍后您将使用这些文件与Hyperledger Fabric网络进行交互。

用户

组织Org1配置了名为的用户[email protected]。该用户是管理员。

用户[email protected]具有存储在目录中的一组证书和私钥文件:

复制

crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp

组织Org2配置了名为的用户[email protected]。该用户是管理员。

用户[email protected]具有存储在目录中的一组证书和私钥文件:

复制

crypto-config/peerOrganizations/org2.example.com/users/[email protected]/msp

稍后您将使用其中一些文件与Hyperledger Fabric网络进行交互。

除了管理员,中科院(证书颁发机构)的Org1Org2已经配置了默认用户。此默认用户的注册ID为admin,注册密码为adminpw。但是,该用户无权部署区块链业务网络。

建议创建一个临时工作目录(和子目录)来管理我们将在本教程中使用的Composer连接配置文件和密钥/证书文件。

复制

mkdir -p /tmp/composer/org1

mkdir -p /tmp/composer/org2

渠道

mychannel已创建名为的通道。这四个等节点- ,peer0.org1.example.compeer1.org1.example.compeer0.org2.example.compeer1.org2.example.com已经加入到这个频道。

连接配置文件

我们需要一个描述此结构网络的基本连接配置文件,然后可以为其组织提供alicebob自定义。

复制

{
    "name": "byfn-network",
    "x-type": "hlfv1",
    "version": "1.0.0",
    "channels": {
        "mychannel": {
            "orderers": [
                "orderer.example.com"
            ],
            "peers": {
                "peer0.org1.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                },
                "peer1.org1.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                },
                "peer0.org2.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                },
                "peer1.org2.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                }
            }
        }
    },
    "organizations": {
        "Org1": {
            "mspid": "Org1MSP",
            "peers": [
                "peer0.org1.example.com",
                "peer1.org1.example.com"
            ],
            "certificateAuthorities": [
                "ca.org1.example.com"
            ]
        },
        "Org2": {
            "mspid": "Org2MSP",
            "peers": [
                "peer0.org2.example.com",
                "peer1.org2.example.com"
            ],
            "certificateAuthorities": [
                "ca.org2.example.com"
            ]
        }
    },
    "orderers": {
        "orderer.example.com": {
            "url": "grpcs://localhost:7050",
            "grpcOptions": {
                "ssl-target-name-override": "orderer.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORDERER_CA_CERT"
            }
        }
    },
    "peers": {
        "peer0.org1.example.com": {
            "url": "grpcs://localhost:7051",
            "grpcOptions": {
                "ssl-target-name-override": "peer0.org1.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORG1_CA_CERT"
            }
        },
        "peer1.org1.example.com": {
            "url": "grpcs://localhost:8051",
            "grpcOptions": {
                "ssl-target-name-override": "peer1.org1.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORG1_CA_CERT"
            }
        },
        "peer0.org2.example.com": {
            "url": "grpcs://localhost:9051",
            "grpcOptions": {
                "ssl-target-name-override": "peer0.org2.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORG2_CA_CERT"
            }
        },
        "peer1.org2.example.com": {
            "url": "grpcs://localhost:10051",
            "grpcOptions": {
                "ssl-target-name-override": "peer1.org2.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORG2_CA_CERT"
            }
        }
    },
    "certificateAuthorities": {
        "ca.org1.example.com": {
            "url": "https://localhost:7054",
            "caName": "ca-org1",
            "httpOptions": {
                "verify": false
            }
        },
        "ca.org2.example.com": {
            "url": "https://localhost:8054",
            "caName": "ca-org2",
            "httpOptions": {
                "verify": false
            }
        }
    }
}

将此基本文件(上面)复制到新目录 byfn-network.json下的新文件中/tmp/composer并保存。

使用对等节点的CA证书打开byfn-network.json并替换文本的所有实例: - 使用以下命令从.pem文件获取证书,以便将其嵌入到上述连接配置文件中。INSERT_ORG1_CA_CERTOrg1

复制

awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt > /tmp/composer/org1/ca-org1.txt

复制文件的内容/tmp/composer/org1/ca-org1.txt并替换INSERT_ORG1_CA_CERT.json文件中的文本。它现在应该看起来像这样(必须是配置文件中的单行,如图所示)

复制

"pem": "-----BEGIN CERTIFICATE-----\nMIICNTCCAdygAwIBAgIRAMNvmQpnXi7uM19BLdha3MwwCgYIKoZIzj0EAwIwbDEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l\neGFtcGxlLmNvbTAeFw0xNzA2MjYxMjQ5MjZaFw0yNzA2MjQxMjQ5MjZaMGwxCzAJ\nBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh\nbmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh\nbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASJn3QUVcKCp+s6lSPE\nP5KlWmE9rEG0kpECsAfW28vZQSIg2Ez+Tp1alA9SYN/5BtL1N6lUUoVhG3lz8uvi\n8zhro18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB\nAf8EBTADAQH/MCkGA1UdDgQiBCB7ULYTq3+BQqnzwae1RsnwQgJv/HQ5+je2xcDr\nka4MHTAKBggqhkjOPQQDAgNHADBEAiB2hLiS8B1g4J5Qbxu15dVWAZTAXX9xPAvm\n4l25e1oS+gIgBiU/aBwSxY0uambwMB6xtQz0ZE/D4lyTZZcW9SODlOE=\n-----END CERTIFICATE-----\n"

在同一个.json文件中 - 您需要使用INSERT_ORG2_CA_CERT对等节点的CA证书替换文本的所有实例Org2: - 使用以下命令将.pem文件转换为可嵌入上述连接配置文件的内容。

复制

awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt > /tmp/composer/org2/ca-org2.txt

复制文件的内容/tmp/composer/org2/ca-org2.txt并替换调用的文本INSERT_ORG2_CA_CERT。再一次,所有人都在同一条线上。

将所有文本实例替换INSERT_ORDERER_CA_CERT为orderer节点的CA证书:使用以下命令将.pem文件转换为可嵌入上述连接配置文件json文件的内容。

复制

awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt > /tmp/composer/ca-orderer.txt

复制文件的内容/tmp/composer/ca-orderer.txt 并替换文本INSERT_ORDERER_CA_CERT。再一次,所有人都在同一条线上。

完成后,将此文件另存为 /tmp/composer/byfn-network.json

此连接配置文件现在描述了结构网络设置,作为网络一部分的所有对等体,订购者和证书颁发机构,它定义了参与网络的所有组织,并定义了此网络上的通道。Hyperledger Composer只能与单个通道交互,因此只应定义一个通道。

第三步:自定义Org1的连接配置文件

这只是指定alice属于的组织,在client具有可选超时的部分中,将以下块添加到上述连接配置文件中/tmp/composer/byfn-network.json,在version属性之间和属性之前channel- 一旦完成,将其另存为名为的新文件 /tmp/composer/org1/byfn-network-org1.json

复制

    "client": {
        "organization": "Org1",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    },

因此,配置文件的部分应该是这样的

复制

    ...
    "version": "1.0.0",
    "client": {
        "organization": "Org1",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    },
    "channel": {
    ...

第四步:为Org2构建连接配置文件

重复相同的过程bob- 但这次指定组织为Org2,然后将文件保存为/tmp/composer/byfn-network-org2.json- 所以配置文件的部分应如下所示:

复制

    ...
    "version": "1.0.0",
    "client": {
        "organization": "Org2",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    },
    "channel": {
    ...

第五步:为Org1的Hyperledger Fabric管理员找到证书和私钥

Hyperledger Fabric Org1网络的管理员是一个名为的用户[email protected]。该用户的证书和私钥文件存储在以下目录中:

复制

crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp

您必须首先找到该用户的证书文件。证书是身份的公共部分。证书文件可以在signcerts子目录中找到并命名[email protected]

接下来,您必须找到此用户的私钥文件。私钥用于将事务签名为此标识。私钥文件可以在keystore子目录中找到。私钥文件的名称是长十六进制字符串,后缀为_sk,例如:78f2139bfcfc0edc7ada0801650ed785a11cfcdef3f9c36f3c8ca2ebfa00a59c_sk。每次生成配置时名称都会更改,因此下面是通配符。

记住这两个文件的路径 - 或者将它们复制到与/tmp/composer/org1/byfn-network-org1.json您在“第三步”中创建的连接配置文件相同的目录中。您将在接下来的步骤中使用这些文件。

使用以下命令执行此操作:

复制

export ORG1=crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp

cp -p $ORG1/signcerts/A*.pem /tmp/composer/org1

cp -p $ORG1/keystore/*_sk /tmp/composer/org1

第六步:为Org2的Hyperledger Fabric管理员找到证书和私钥

Hyperledger Fabric网络的管理员是一个名为的用户[email protected]。该用户的证书和私钥文件存储在以下目录中:

复制

crypto-config/peerOrganizations/org2.example.com/users/[email protected]/msp

您必须首先找到该用户的证书文件。证书是身份的公共部分。证书文件可以在signcerts子目录中找到并命名[email protected]

接下来,您必须找到此用户的私钥文件。私钥用于将事务签名为此标识。私钥文件可以在keystore子目录中找到。私钥文件的名称是长十六进制字符串,_sk例如后缀为d4889cb2a32e167bf7aeced872a214673ee5976b63a94a6a4e61c135ca2f2dbb_sk。每次生成配置时,名称都将更改。

记住这两个文件的路径,或将它们复制到与/tmp/composer/byfn-network-org2.json在步骤4中创建的连接配置文件相同的目录中。您将在接下来的步骤中使用这些文件。

使用以下命令执行此操作:

复制

export ORG2=crypto-config/peerOrganizations/org2.example.com/users/[email protected]/msp

cp -p $ORG2/signcerts/A*.pem /tmp/composer/org2

cp -p $ORG2/keystore/*_sk /tmp/composer/org2

第七步:为Org1的Hyperledger Fabric管理员创建业务网卡

在此步骤中,您将创建业务网卡,供管理员用于将区块链业务网络部署到Hyperledger Fabric网络。

运行该composer card create命令以使用连接配置文件创建业务网卡Org1。您必须指定在前面的步骤中创建或定位的所有三个文件的路径:(注意:sk文件将有所不同。)

复制

composer card create -p /tmp/composer/org1/byfn-network-org1.json -u PeerAdmin -c /tmp/composer/org1/[email protected] -k /tmp/composer/org1/*_sk -r PeerAdmin -r ChannelAdmin -f [email protected]

如果该命令成功运行,则调用的业务网卡文件[email protected]将写入当前目录。

第八步:为Org2的Hyperledger Fabric管理员创建业务网卡

在此步骤中,您将创建业务网卡,供管理员用于将区块链业务网络部署到Hyperledger Fabric网络。

运行该composer card create命令以使用连接配置文件创建业务网卡Org2。您必须指定在前面的步骤中创建或定位的所有三个文件的路径:

复制

composer card create -p /tmp/composer/org2/byfn-network-org2.json -u PeerAdmin -c /tmp/composer/org2/[email protected] -k /tmp/composer/org2/*_sk -r PeerAdmin -r ChannelAdmin -f [email protected]

如果该命令成功运行,则调用的业务网卡文件[email protected]将写入当前目录。

第九步:为Org1的Hyperledger Fabric管理员导入业务网卡

运行composer card import命令将业务网卡Org1导入钱包:

复制

composer card import -f [email protected] --card PeerAdmin@byfn-network-org1

如果该命令成功运行,PeerAdmin@byfn-network-org1则会将已调用的业务网卡导入钱包。

第十步:为Org2的Hyperledger Fabric管理员导入业务网卡

运行composer card import命令将业务网卡Org2导入钱包:

复制

composer card import -f [email protected] --card PeerAdmin@byfn-network-org2

如果该命令成功运行,PeerAdmin@byfn-network-org2则会将已调用的业务网卡导入钱包。

第十一步:将业务网络安装到Org1的Hyperledger Fabric对等节点上

运行该composer network install命令,将业务网络安装到Org1您在“第三步”中创建的连接配置文件中指定的所有Hyperledger Fabric对等节点上:

复制

composer network install --card PeerAdmin@byfn-network-org1 --archiveFile trade-network.bna

从上面的内容可以看出,我们正在使用Hyperledger Composer业务网络trade-network来测试我们的多组织环境。您将需要一个文件trade-network.bna(来自我们的示例网络的业务网络存档)来进行测试。如果您没有这个,只需访问https://composer-playground.mybluemix.net/并将trade-network示例部署到在线Playground,然后以'admin''连接'到业务网络,将版本号更改为0.1.14在左下方,并将其导出到当前目录中trade-network.bna。业务网络具有在文件中指定的版本属性package.json。使用composer start步骤17中的命令启动业务网络时,必须指定该版本。如果你正在使用trade-network样本网络,版本是0.1.14。(注意:如果您计划使用其他网络,例如Composer教程网络tutorial-network作为您的业务网络,则需要在network install上面的命令中指定该文件,此后,作为本教程中的业务网络存档,以及此业务网络的正确版本号)。

network install命令的一个有用功能是它将输出业务网络的名称和刚刚安装的版本号,您可以在以后的“步骤十七”中使用它们。

步骤十二:将业务网络安装到Org2的Hyperledger Fabric对等节点上

运行该composer network install命令,将业务网络安装到Org2您在步骤4中创建的连接配置文件中指定的所有Hyperledger Fabric对等节点上:

复制

composer network install --card PeerAdmin@byfn-network-org2 --archiveFile trade-network.bna

第十三步:定义业务网络的认可政策

正在运行的业务网络具有认可策略,该策略定义了组织在将事务提交到区块链之前必须认可的规则。默认情况下,部署的业务网络具有认可策略,该策略指出只有一个组织必须在将事务提交到区块链之前认可该事务。

在现实世界的区块链业务网络中,多个组织希望确保在将事务提交到区块链之前认可交易,因此默认的认可策略不合适。相反,您可以在启动业务网络时指定自定义认可策略。

你可以找到Hyperledger面料文档的代言策略的详细信息,在签注政策

请注意,用于业务网络的认可策略必须采用Hyperledger Fabric Node.js SDK使用的JSON格式。这是Hyperledger Fabric CLI使用的简单认可策略格式的不同格式,您将在Hyperledger Fabric文档中看到。

创建一个/tmp/composer/endorsement-policy.json使用以下内容调用的认可策略文件,并将其保存到磁盘。您将在以后的步骤中使用此文件,因此请记住放置它的位置!

复制

{
    "identities": [
        {
            "role": {
                "name": "member",
                "mspId": "Org1MSP"
            }
        },
        {
            "role": {
                "name": "member",
                "mspId": "Org2MSP"
            }
        }
    ],
    "policy": {
        "2-of": [
            {
                "signed-by": 0
            },
            {
                "signed-by": 1
            }
        ]
    }
}

您刚刚创建的认可政策规定,在将业务网络中的事务提交到区块链之前Org1Org2必须同意并且必须认可这些事务。如果Org1Org2不认可交易,或者对交易结果不一致,那么交易将被商业网络拒绝。

步骤十四:了解并选择业务网络管理员

启动业务网络时,必须使用一组初始参与者配置业务网络。这些参与者将负责引导业务网络并将其他参与者加入业务网络。在Hyperledger Composer中,我们将这些初始参与者称为业务网络管理员。

在我们的业务网络,组织Org1Org2享有平等的权利。每个组织都将为业务网络提供业务网络管理员,并且这些业务网络管理员将登录其组织中的其他参与者。商业网络管理员Org1将是Alice,商业网络管理员Org2将是Bob。

启动业务网络时,必须将所有业务网络管理员的证书(标识的公共部分)传递给执行命令以启动业务网络的组织。业务网络启动后,所有业务网络管理员都可以使用其身份与业务网络进行交互。

您可以在部署业务网络中找到有关业务网络管理员的更多信息。

步骤十五:检索Org1的业务网络管理员证书

运行该composer identity request命令以检索Alice的证书,以用作以下的业务网络管理员Org1

复制

composer identity request -c PeerAdmin@byfn-network-org1 -u admin -s adminpw -d alice

-u admin-s adminpw选项,此命令对应于具有Hyperledger面料CA(认证机构)注册的默认用户。

证书将被放入alice当前工作目录中调用的目录中。创建了三个证书文件,但只有两个很重要。这些是admin-pub.pem证书(包括公钥)和admin-priv.pem私钥。只有该admin-pub.pem文件适合与其他组织共享。该admin-priv.pem文件必须保密,因为它可以代表发证机构签署交易。

第十六步:检索Org2的业务网络管理员证书

运行该composer identity request命令以检索Bob的证书,以用作以下的业务网络管理员Org2

复制

composer identity request -c PeerAdmin@byfn-network-org2 -u admin -s adminpw -d bob

-u admin-s adminpw选项,此命令对应于具有Hyperledger面料CA(认证机构)注册的默认用户。

证书将被放入bob当前工作目录中调用的目录中。创建了三个证书文件,但只有两个很重要。这些是admin-pub.pem证书(包括公钥)和admin-priv.pem私钥。只有该admin-pub.pem文件适合与其他组织共享。该admin-priv.pem文件必须保密,因为它可以代表发证机构签署交易。

第十七步:启动业务网络

运行该composer network start命令以启动业务网络。只Org1需要执行此操作。此命令使用/tmp/composer/endorsement-policy.json在步骤十三中创建的文件,以及admin-pub.pemAlice和Bob在步骤十五和步骤十六中创建的文件,因此您必须确保此命令可以访问所有这些文件:

复制

composer network start -c PeerAdmin@byfn-network-org1 -n trade-network -V 0.1.14 -o endorsementPolicyFile=/tmp/composer/endorsement-policy.json -A alice -C alice/admin-pub.pem -A bob -C bob/admin-pub.pem

此命令完成后,业务网络将已启动。Alice和Bob都可以访问业务网络,开始建立业务网络,以及来自各自组织的其他参与者。但是,Alice和Bob都必须使用他们在之前步骤中创建的证书创建新的业务网卡,以便他们可以访问业务网络。

步骤十八:创建业务网卡以Org1访问业务网络

运行该composer card create命令以创建业务网络卡,业务网络管理员Alice Org1可用于访问业务网络:

复制

composer card create -p /tmp/composer/org1/byfn-network-org1.json -u alice -n trade-network -c alice/admin-pub.pem -k alice/admin-priv.pem

运行该composer card import命令以导入刚刚创建的业务网卡:

复制

composer card import -f [email protected]

运行该composer network ping命令以测试与区块链业务网络的连接:

复制

composer network ping -c alice@trade-network

如果命令成功完成,那么您应该org.hyperledger.composer.system.NetworkAdmin#alice在命令的输出中看到完全限定的参与者标识符。您现在可以使用此业务网卡与区块链业务网络以及组织中的其他参与者进行交互。

让我们创建一个参与者,发布一个身份(映射到该参与者)并在区块链网络上创建一个资产作为该身份。

运行以下composer participant add命令,将其复制到命令行以执行:

复制

composer participant add -c alice@trade-network -d '{"$class":"org.example.trading.Trader","tradeId":"trader1-org1", "firstName":"Jo","lastName":"Doe"}'

接下来trader1-org1使用以下composer issue identity命令创建标识:

复制

composer identity issue -c alice@trade-network -f jo.card -u jdoe -a "resource:org.example.trading.Trader#trader1-org1"

导入卡并进行测试

复制

composer card import -f jo.card

composer network ping -c jdoe@trade-network

下一步,我们将创建一个资产-在命令行中,提交交易创造商品资产,因为参与者jdoe(或者,如果你已经安装了作曲家游乐场,连接为jdoe@trade-networktrade-network创建资产“EMA” -的JSON片段是如下所示)。

要使用CLI创建资产 - 复制以下transaction submit序列 - 它会为您创建商品资产:

复制

composer transaction submit --card jdoe@trade-network -d '{"$class": "org.hyperledger.composer.system.AddAsset", "targetRegistry" : "resource:org.hyperledger.composer.system.AssetRegistry#org.example.trading.Commodity", "resources": [{"$class": "org.example.trading.Commodity","tradingSymbol":"EMA", "description":"Corn commodity","mainExchange":"EURONEXT", "quantity":"10","owner":"resource:org.example.trading.Trader#trader1-org1"}]}'

或者,要在Playground中创建 - 复制以下内容:

复制

{
  "$class": "org.example.trading.Commodity",
  "tradingSymbol": "EMA",
  "description": "Corn commodity",
  "mainExchange": "EURONEXT",
  "quantity": 10,
  "owner": "resource:org.example.trading.Trader#trader1-org1"
}

最后,执行a composer network list以确认业务网络中生成的工件:

复制

composer network list -c jdoe@trade-network

步骤十九:创建业务网卡,以Org2的身份访问业务网络

运行该composer card create命令以创建业务网络管理员Bob Org2可以用来访问业务网络的业务网卡:

复制

composer card create -p /tmp/composer/org2/byfn-network-org2.json -u bob -n trade-network -c bob/admin-pub.pem -k bob/admin-priv.pem

运行该composer card import命令以导入刚刚创建的业务网卡:

复制

composer card import -f [email protected]

运行该composer network ping命令以测试与区块链业务网络的连接:

复制

composer network ping -c bob@trade-network

如果命令成功完成,那么您应该org.hyperledger.composer.system.NetworkAdmin#bob在命令的输出中看到完全限定的参与者标识符。让我们登上另一位交易员,这次是Org 2:

再次创建一个参与者,发布一个身份(映射到该参与者) - 因为我们已经在区块链网络上拥有一个资产,我们将使用一个事务来更改所有权(从Org1交易者到Org2交易者):

运行以下composer participant add命令,将其复制到命令行以执行:

复制

composer participant add -c bob@trade-network -d '{"$class":"org.example.trading.Trader","tradeId":"trader2-org2", "firstName":"Dave","lastName":"Lowe"}'

接下来trader2-org2使用以下composer issue identity命令创建标识:

复制

composer identity issue -c bob@trade-network -f dave.card -u dlowe -a "resource:org.example.trading.Trader#trader2-org2"

导入卡并进行测试

复制

composer card import -f dave.card

composer network ping -c dlowe@trade-network

最后,提交交易以更改先前创建的商品资产的所有权。我们将作为资产所有者Jon Doe提交交易,并将其转让给交易员'Dave Lowe'。然后,当Org 2交易者参与者映射到dlowe身份时,我们将验证所有权变更是否已发生:执行以下步骤。

复制

composer transaction submit --card jdoe@trade-network -d '{"$class":"org.example.trading.Trade","commodity":"resource:org.example.trading.Commodity#EMA","newOwner":"resource:org.example.trading.Trader#trader2-org2"}'

最后,做一名composer network listOrg 2交易员参与者确认资产所有权的变更:

复制

composer network list -c dlowe@trade-network

结论

在本教程中,您已经了解了如何在多组织设置中基于Hyperledger Composer配置区块链网络。您还学习了如何将业务网络(例如我们的商品交易网络)部署到该区块链网络,并使用任一组织中的权威证书颁发的身份,作为每个组织的参与者执行一些简单的交易。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_25216471/article/details/86686158

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签