技术标签: hyperledger-composer 区块链-hyperledger-composer
本教程深入介绍了跨区域链网络的配置过程,涵盖了多个组织。
它概述了配置基于Hyperledger Fabric的多组织区块链网络所需的步骤。双组织区块链网络基于Hyperledger Fabric提供的示例网络。此外,它描述了在任一组织中生成必要的安全工件并保护网络的步骤。
一旦配置了区块链网络,我们将展示如何部署业务网络(例如,来自我们的示例网络的商品交易业务网络),该网络在其自己的链代码容器中运行,并在两个组织共享的分类账上实例化。然后,我们将与共享分类帐的交互显示为不同的参与者/身份,由每个组织中的身份提供者生成。
建议您先按照随附的单一组织教程进行操作; 本教程演示了如何将区块链网络部署到单个组织的Hyperledger Fabric实例,并将更详细地解释一些概念。
本教程中的Hyperledger Fabric区块链网络(适用于两个组织)使用docker容器配置,在同一台机器上使用两个组织的结构网络 - 显然,在现实世界中,它们将位于不同的IP网络或域中,或者安全的云环境。
为方便起见,本教程使用了颜色编码的步骤,以指示“哪个组织”应遵循特定的步骤或顺序 - 或者实际上,如果两个组织都需要步骤。
第一种步骤是两个组织遵循:
该组织Org1
由绿色康加块的Alice代表:
该组织Org2
由Violet Conga Block的Bob代表:
您可以自己执行这些步骤,也可以与朋友或同事配对,并一起执行这些步骤。
让我们开始吧!
如果您以前安装了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 网络。
将目录更改为 fabric-samples
cd fabric-samples
使用此命令下载平台二进制文件,包括cryptogen(bash命令需要三个参数):
复制curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.1 1.2.1 0.4.10
验证下载的docker映像列表没有问题。
(请注意,您可以忽略输出中的初始“错误:pathspec v1.xx不匹配”消息 - 您甚至可能看不到此消息)
我们需要使用我们之前克隆的Git repo中的'multi-org'分支(以使用当前的Fabric级别):
复制git checkout multi-org
将目录更改为first-network
示例
cd first-network
接下来,启动BYFN网络 - byfn.sh
必须指定其他标志(到下面的脚本),因为我们使用CouchDB作为世界状态数据库(与Fabric BYFN页面上指定的不同) - 我们还想启动证书颁发机构(CA)每个组织。
从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
此步骤将探讨BFYN网络配置和组件。需要配置详细信息才能完成后续步骤。
组织
BYFN网络由两个组织组成:Org1
和Org2
。组织Org1
使用域名org1.example.com
。会员服务提供商(MSP)Org1
被称为Org1MSP
。组织Org2
使用域名org2.example.com
。MSP for Org2
被称为Org2MSP
。在本教程中,您将部署一个blockchain业务网络,无论是组织Org1
,并Org2
能与之交互。
网络组件
Hyperledger Fabric网络由几个组件组成:
Org1
,命名peer0.org1.example.com
和peer1.org1.example.com
。
peer0
是7051。peer0
7053。peer1
8051。peer1
8053。Org1
,名称为ca.org1.example.com
。
Org2
,命名peer0.org2.example.com
和peer1.org2.example.com
。
peer0
9051。peer0
9053。peer1
10051。peer1
10053。Org2
,名称为ca.org2.example.com
。
orderer.example.com
。
这些组件在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网络进行交互。
除了管理员,中科院(证书颁发机构)的Org1
和Org2
已经配置了默认用户。此默认用户的注册ID为admin
,注册密码为adminpw
。但是,该用户无权部署区块链业务网络。
建议创建一个临时工作目录(和子目录)来管理我们将在本教程中使用的Composer连接配置文件和密钥/证书文件。
复制
mkdir -p /tmp/composer/org1
mkdir -p /tmp/composer/org2
渠道
mychannel
已创建名为的通道。这四个等节点- ,peer0.org1.example.com
,peer1.org1.example.com
,peer0.org2.example.com
和peer1.org2.example.com
已经加入到这个频道。
连接配置文件
我们需要一个描述此结构网络的基本连接配置文件,然后可以为其组织提供alice
并bob
自定义。
复制
{
"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_CERT
Org1
复制
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只能与单个通道交互,因此只应定义一个通道。
这只是指定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": {
...
重复相同的过程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": {
...
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
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
在此步骤中,您将创建业务网卡,供管理员用于将区块链业务网络部署到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]
将写入当前目录。
在此步骤中,您将创建业务网卡,供管理员用于将区块链业务网络部署到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]
将写入当前目录。
运行composer card import
命令将业务网卡Org1
导入钱包:
复制
composer card import -f [email protected] --card PeerAdmin@byfn-network-org1
如果该命令成功运行,PeerAdmin@byfn-network-org1
则会将已调用的业务网卡导入钱包。
运行composer card import
命令将业务网卡Org2
导入钱包:
复制
composer card import -f [email protected] --card PeerAdmin@byfn-network-org2
如果该命令成功运行,PeerAdmin@byfn-network-org2
则会将已调用的业务网卡导入钱包。
运行该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
命令的一个有用功能是它将输出业务网络的名称和刚刚安装的版本号,您可以在以后的“步骤十七”中使用它们。
运行该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
}
]
}
}
您刚刚创建的认可政策规定,在将业务网络中的事务提交到区块链之前Org1
,Org2
必须同意并且必须认可这些事务。如果Org1
或Org2
不认可交易,或者对交易结果不一致,那么交易将被商业网络拒绝。
启动业务网络时,必须使用一组初始参与者配置业务网络。这些参与者将负责引导业务网络并将其他参与者加入业务网络。在Hyperledger Composer中,我们将这些初始参与者称为业务网络管理员。
在我们的业务网络,组织Org1
和Org2
享有平等的权利。每个组织都将为业务网络提供业务网络管理员,并且这些业务网络管理员将登录其组织中的其他参与者。商业网络管理员Org1
将是Alice,商业网络管理员Org2
将是Bob。
启动业务网络时,必须将所有业务网络管理员的证书(标识的公共部分)传递给执行命令以启动业务网络的组织。业务网络启动后,所有业务网络管理员都可以使用其身份与业务网络进行交互。
您可以在部署业务网络中找到有关业务网络管理员的更多信息。
运行该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
文件必须保密,因为它可以代表发证机构签署交易。
运行该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.pem
Alice和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都必须使用他们在之前步骤中创建的证书创建新的业务网卡,以便他们可以访问业务网络。
运行该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-network
以trade-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
运行该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 list
Org 2交易员参与者确认资产所有权的变更:
复制
composer network list -c dlowe@trade-network
在本教程中,您已经了解了如何在多组织设置中基于Hyperledger Composer配置区块链网络。您还学习了如何将业务网络(例如我们的商品交易网络)部署到该区块链网络,并使用任一组织中的权威证书颁发的身份,作为每个组织的参与者执行一些简单的交易。
文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别
文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具
文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量
文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置
文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖
文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...
文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序
文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码
文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型
文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件
文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令
文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线