3.构建第一个网络

文档地址:https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html

 

示例代码地址:https://github.com/hyperledger/fabric-samples

 

 

打开例子的安装目录

 

设置环境变量

export CHANNEL_NAME=mychannel

export FABRIC_CFG_PATH=$PWD

 

可以先看一下byfn.sh(build your first network)的帮助文档内容

Usage:

byfn.sh [-c ] [-t ] [-d ] [-f ] [-s ] [-l ] [-i ] [-v]

- one of 'up', 'down', 'restart', 'generate' or 'upgrade'

- 'up' - bring up the network with docker-compose up

- 'down' - clear the network with docker-compose down

- 'restart' - restart the network

- 'generate' - generate required certificates and genesis block

- 'upgrade' - upgrade the network from v1.0.x to v1.1

-c - channel name to use (defaults to "mychannel")

-t - CLI timeout duration in seconds (defaults to 10)

-d - delay duration in seconds (defaults to 3)

-f - specify which docker-compose file use (defaults to docker-compose-cli.yaml)

-s - the database backend to use: goleveldb (default) or couchdb

-l - the chaincode language: golang (default), node or java

-i - the tag to be used to launch the network (defaults to "latest")

-v - verbose mode

byfn.sh -h (print this message)

 

Typically, one would first generate the required certificates and

genesis block, then bring up the network. e.g.:

 

byfn.sh generate -c mychannel

byfn.sh up -c mychannel -s couchdb

byfn.sh up -c mychannel -s couchdb -i 1.1.0-alpha

byfn.sh up -l node

byfn.sh down -c mychannel

byfn.sh upgrade -c mychannel

 

Taking all defaults:

byfn.sh generate

byfn.sh up

byfn.sh down

 

可以先试一下:

  1. 生成所需文件 ./byfn.sh generate
  2. 启动网络 ./byfn.sh up
  3. 停止 ./byfn.sh down

查看日志,可以正常运行,则表示配置没有问题。以上命令是默认配置下执行的操作。通过修改docker-compose-cli.yaml下的CORE_LOGGING_LEVEL为debug,执行命令后的日志可以看出byfn到底干了什么。

 

下面看一下手动操作步骤:

  1. 生成加密文件
  2. 创建orderer genesis块
  3. 创建通道配置事务
  4. 创建描点(组织)
  5. 使用 docker-compose-cli.yaml 启动docker
  6. 执行内部脚本
    1. 创建channel
    2. 将四个peer加入channel
    3. 根据Org1MSPanchors.tx和Org2MSPanchors.tx更新Org1MSP(peer0.org1.example.com)和Org2MSP(peer0.org2.example.com)
    4. 安装chaincode
    5. 实例化chaincode
    6. 查询chaincode
    7. 调用chaincode

日志

  1. docker logs -f cli
  2. docker logs dev-peer0.org2.example.com-mycc-1.0

具体细节可以直接看日志部分内容

 

以下为机翻修改

 

了解Docker Compose拓扑

BYFN示例为我们提供了两种Docker Compose文件,这两种文件都是从docker-compose-base.yaml(位于base 文件夹中)扩展而来的。我们的第一个测试,docker-compose-cli.yaml为我们提供了一个CLI容器,以及一个orderer,四个peer。上面说的也是针对这一个。

使用docker-compose-e2e.yaml构建第二种风格,用Node.js SDK运行端到端测试。除了使用SDK之外,它的主要区别在于Fabric-ca服务器还有容器。因此,我们可以向组织CA发送REST调用以进行用户注册和注册。

如果你想在docker-compose-e2e.yaml没有先运行byfn.sh脚本的情况下使用它,那么我们需要修改四个地方。我们需要指向组织CA的私钥。您可以在crypto-config文件夹中找到这些值。例如,要找到Org1的私钥,我们将遵循此路径 - crypto-config/peerOrganizations/org1.example.com/ca/。私钥是一个长哈希值后跟_sk。Org2的路径是 - crypto-config/peerOrganizations/org2.example.com/ca/。

在docker-compose-e2e.yaml更新中为ca0和ca1的FABRIC_CA_SERVER_TLS_KEYFILE变量。您还需要编辑命令中提供的路径以启动ca服务器。您为每个CA容器提供两次相同的私钥。

 

使用CouchDB

状态数据库可以从默认(goleveldb)切换到CouchDB。CouchDB提供了相同的链代码功能,但是,链代码数据被建模为JSON,还可以根据状态数据库数据内容执行丰富而复杂的查询。

要使用CouchDB而不是默认数据库(goleveldb),请按照前面概述的相同步骤生成工件,在启动网络传递时docker-compose-couch.yaml可实现相同效果:

docker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml up -d

chaincode_example02现在应该使用下面的CouchDB。

注意

如果您选择将fabric-couchdb容器端口映射到主机端口,请确保您了解安全隐患。在开发环境中映射端口使CouchDB REST API可用,并允许通过CouchDB Web界面(Fauxton)可视化数据库。生产环境可能会避免实施端口映射,以限制对CouchDB容器的外部访问。

您可以使用上面列出的步骤对CouchDB状态数据库使用chaincode_example02链代码,但是为了实现CouchDB查询功能,您需要使用具有建模为JSON的数据的链代码(例如marbles02)。您可以在目录中找到marbles02链代码 fabric/examples/chaincode/go。

我们将按照相同的流程创建和加入频道,如上面的“ 创建和加入频道”部分所述。将对等方加入频道后,请使用以下步骤与marbles02链代码进行交互:

  • 安装并实例化链代码peer0.org1.example.com:

# be sure to modify the $CHANNEL_NAME variable accordingly for the instantiate command peer chaincode install -n marbles -v 1.0 -p github.com/chaincode/marbles02/go peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -v 1.0 -c '{"Args":["init"]}' -P "OR ('Org0MSP.peer','Org1MSP.peer')"

  • 制作一些大理石并移动它们:

# be sure to modify the $CHANNEL_NAME variable accordingly peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble1","blue","35","tom"]}' peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble2","red","50","tom"]}' peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["initMarble","marble3","blue","70","tom"]}' peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarble","marble2","jerry"]}' peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["transferMarblesBasedOnColor","blue","jerry"]}' peer chaincode invoke -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n marbles -c '{"Args":["delete","marble1"]}'

  • 如果您选择在docker-compose中映射CouchDB端口,现在可以通过打开浏览器并导航到以下URL,通过CouchDB Web界面(Fauxton)查看状态数据库:

http://localhost:5984/_utils

您应该看到一个名为mychannel(或您的唯一通道名称)的数据库及其中的文档。

注意

对于以下命令,请确保适当更新$ CHANNEL_NAME变量。

您可以从CLI运行常规查询(例如,阅读marble2):

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["readMarble","marble2"]}'

输出应显示以下内容的详细信息marble2:

Query Result: {"color":"red","docType":"marble","name":"marble2","owner":"jerry","size":50}

您可以检索特定大理石的历史记录 - 例如marble1:

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["getHistoryForMarble","marble1"]}'

输出应显示以下事务marble1:

Query Result: [{"TxId":"1c3d3caf124c89f91a4c0f353723ac736c58155325f02890adebaa15e16e6464", "Value":{"docType":"marble","name":"marble1","color":"blue","size":35,"owner":"tom"}},{"TxId":"755d55c281889eaeebf405586f9e25d71d36eb3d35420af833a20a2f53a3eefd", "Value":{"docType":"marble","name":"marble1","color":"blue","size":35,"owner":"jerry"}},{"TxId":"819451032d813dde6247f85e56a89262555e04f14788ee33e28b232eef36d98f", "Value":}]

您还可以对数据内容执行丰富的查询,例如按所有者查询大理石字段jerry:

peer chaincode query -C $CHANNEL_NAME -n marbles -c '{"Args":["queryMarblesByOwner","jerry"]}'

输出应显示拥有的两个大理石jerry:

Query Result: [{"Key":"marble2", "Record":{"color":"red","docType":"marble","name":"marble2","owner":"jerry","size":50}},{"Key":"marble3", "Record":{"color":"blue","docType":"marble","name":"marble3","owner":"jerry","size":70}}]

为何选择CouchDB

CouchDB是一种NoSQL解决方案。它是一个面向文档的数据库,其中文档字段存储为键值映射。字段可以是简单的键值对,列表或映射。除了LevelDB支持的键控/复合键/键范围查询外,CouchDB还支持完全数据丰富的查询功能,例如针对整个区块链数据的非键查询,因为其数据内容以JSON格式存储,完全可查询。因此,CouchDB可以满足LevelDB不支持的许多用例的链代码,审计和报告要求。

CouchDB还可以增强区块链中的合规性和数据保护的安全性。因为它能够通过过滤和屏蔽事务中的各个属性来实现字段级安全性,并且只在需要时授权只读权限。

此外,CouchDB属于CAP定理的AP类型(可用性和分区容差)。它使用主 - 主复制模型。可以在CouchDB文档的Eventual Consistency页面上找到更多信息 。但是,在每个结构对等体下,没有数据库副本,对数据库的写入保证一致且持久(不)。Eventual ConsistencyEventual Consistency

CouchDB是Fabric的第一个外部可插拔状态数据库,可能也应该有其他外部数据库选项。例如,IBM为其区块链启用了关系数据库。并且CP类型(一致性和分区容差)数据库也可能需要,以便在没有应用程序级别保证的情况下实现数据一致性。

关于数据持久性的注记

如果在对等容器或CouchDB容器上需要数据持久性,则可以选择将docker-host中的目录安装到容器中的相关目录中。例如,您可以在docker-compose-base.yaml文件中的对等容器规范中添加以下两行:

volumes: - /var/hyperledger/peer0:/var/hyperledger/production

对于CouchDB容器,您可以在CouchDB容器规范中添加以下两行:

volumes: - /var/hyperledger/couchdb0:/opt/couchdb/data

故障排除

  • 始终保持网络新鲜。使用以下命令删除工件,加密,容器和链代码图像:

./byfn.sh down

注意

如果你不删除旧容器和图像,你会看到错误。

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

如果他们坚持删除你的图像并从头开始:

docker rm -f $(docker ps -aq) docker rmi -f $(docker images -q)

  • 如果在创建,实例化,调用或查询命令上看到错误,请确保已正确更新通道名称和链代码名称。提供的示例命令中有占位符值。
  • 如果您看到以下错误:

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-mycc-1.0或dev-peer0.org1.example.com-mycc-1.0)。删除它们然后再试一次。

docker rmi -f $(docker images | grep peer[0-9]-peer[0-9] | awk '{print $3}')

  • 如果您看到类似于以下内容的内容:

Error connecting: rpc error: code = 14 desc = grpc: RPC failed fast due to transport failure Error: rpc error: code = 14 desc = grpc: RPC failed fast due to transport failure

确保您正在使用已被重新标记为“最新”的“1.0.0”图像运行您的网络。

  • 如果您看到以下错误:

[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

  • 要清理网络,请使用以下down选项:

./byfn.sh down

  • 如果您看到一条错误,指出您仍然有“活动端点”,那么请修剪您的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/script.sh: /bin/bash^M: bad interpreter: No such file or directory

确保有问题的文件(本例中为script.sh)以Unix格式编码。这是最有可能通过不设置导致 core.autocrlf对false使用Git的配置(见 的Windows演员)。有几种方法可以解决这个问题。例如,如果您有权访问vim编辑器,请打开文件:

vim ./fabric-samples/first-network/scripts/script.sh

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

:set ff=unix

注意

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

你可能感兴趣的:(超级账本官方流程学习记录)