本文档介绍了用Docker容器在本地开发机器上设置网络环境。

所有的命令都应该在Vagrant中运行。

注意:如果peer是通过Docker镜像启动的,而且开启了安全验证,那就需要给peer配置正确的CA地址(默认是localhost)。在core.yaml的paddr下的eca,tca和tlsca中指定CA地址。

搭建Docker镜像

要为hyperledger/fabric创建Docker镜像,首先要使用命令docker ps -a and docker rm清除所有活跃的容器 (hyperledger-peer and chaincode) 。第二步,用docker images和docker rmi删除老的镜像。注意:不要删除其他的镜像 (比如busybox or openblockchain/baseimage) ,还需要他们来正确的运行。

现在我们准备好了构建一个新的Docker镜像:

cd $GOPATH/src/github.com/hyperledger/fabric/core/container
go test -run BuildImage_Peer

再次使用docker images检查可用的镜像,你就能看见hyperledger-peer了。

开启validating peers

在Vagrant环境中,使用ip add命令找出docker0网络接口绑定的IP地址。比如:

vagrant@vagrant-ubuntu-trusty-64:/opt/gopath/src/github.com/hyperledger/fabric$ ip add

<<< detail removed >>>

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:ad:be:70:cb brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
        valid_lft forever preferred_lft forever
    inet6 fe80::42:adff:febe:70cb/64 scope link
        valid_lft forever preferred_lft forever

你的输出信息里会包含类似的东西 inet 172.17.0.1/16 scope global docker0。这表示docker0 接口绑定在172.17.0.1上。把这个IP地址作为CORE_VM_ENDPOINT选项的值。要了解更多关于这个环境变量的信息,请查看core.yaml。

CORE_PEER_ID的值必须小写,因为我们将使用这个值作为我们构建的chaincode容器的一部分,而docker是不支持大写的。每个validating peer的ID都必须的唯一的。

默认情况下,我们使用一个叫做NOOPS的一致性插件,这个插件做不到真正的一致性。如果你想使用其他的一致性插件,请看文档的结尾部分:Using Consensus Plugin。

开启第一个validating peer:

docker run --rm -it -e CORE_VM_ENDPOINT=http://172.17.0.1:4243 -e CORE_PEER_ID=vp0 -e CORE_PEER_ADDRESSAUTODETECT=true hyperledger-peer peer peer

如果开启安全认证,环境变量的配置就要考略到安全设置,CA地址和peer的ID和密码都要改变:

docker run --rm -it -e CORE_VM_ENDPOINT=http://172.17.0.1:4243 -e CORE_PEER_ID=vp0 -e CORE_PEER_ADDRESSAUTODETECT=true -e CORE_SECURITY_ENABLED=true -e CORE_SECURITY_PRIVACY=true -e CORE_PEER_PKI_ECA_PADDR=172.17.0.1:50051 -e CORE_PEER_PKI_TCA_PADDR=172.17.0.1:50051 -e CORE_PEER_PKI_TLSCA_PADDR=172.17.0.1:50051 -e CORE_SECURITY_ENROLLID=vp0 -e CORE_SECURITY_ENROLLSECRET=XX  hyperledger-peer peer peer

另外,validating peer (enrollID vp0 and enrollSecret XX) 要添加到membersrvc.yaml文件中。

开启第二个validating peer:

我们要获取第一个validating peer的IP地址,第一个peer作为根节点,新的peer要连接到根节点。 这个地址会在第一个peer的终端窗口中打印出来(比如172.17.0.2)。我们要使用”vp1”作为第二个validating peer的ID。

docker run --rm -it -e CORE_VM_ENDPOINT=http://172.17.0.1:4243 -e CORE_PEER_ID=vp1 -e CORE_PEER_ADDRESSAUTODETECT=true -e CORE_PEER_DISCOVERY_ROOTNODE=172.17.0.2:30303 hyperledger-peer peer peer

你可以用类似的方式启动更多的validating peers。记得要修改ID。

Deploy, Invoke, and Query a Chaincode

我们要用命令行接口发布一个chaincode到网络中。你可以在下面的目录中发现chaincode $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

现在来发布,用CORE_PEER_ADDRESS可以把chaincode发布到任意一个指定的validating peer:

cd $GOPATH/src/github.com/hyperledger/fabric/peer
CORE_PEER_ADDRESS=172.17.0.2:30303 ./peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'

在安全模式下要使用下面的命令:

CORE_PEER_ADDRESS=172.17.0.2:30303 ./peer chaincode deploy -u jim -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'

你可以在所有validating peers的屏幕上看到信息:”Received build request for chaincode spec”。

当成功完成后,上面的命令就会打印出分配给刚发布的chaincode的”name”。这个”name”可以用作下面描述的invode和query命令的”-n”参数。这个”name”的值可以是:

bb540edfc1ee2ac0f5e2ec6000677f4cd1c6728046d5e32dede7fea11a42f86a6943b76a8f9154f4792032551ed320871ff7b7076047e4184292e01e3421889c

在脚本中,这个名字可以被暂存以备接下来用。比如:

NAME=`CORE_PEER_ADDRESS=172.17.0.2:30303 ./peer chaincode deploy ...`

然后用$NAME替换下面例子中的

我们可以发起一笔’a’ 到’b’,价值10个单位的交易:

CORE_PEER_ADDRESS=172.17.0.2:30303 ./peer chaincode invoke -n <name_value_returned_from_deploy_command> -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'

在安全模式下要使用下面的命令:

CORE_PEER_ADDRESS=172.17.0.2:30303 ./peer chaincode invoke -u jim -n <name_value_returned_from_deploy_command> -c '{"Function": "invoke", "Args": ["a", "b", "10"]}'

我们也可以运行一次查询,看看’a’当前拥有的值:

CORE_PEER_ADDRESS=172.17.0.2:30303 ./peer chaincode query -l golang -n <name_value_returned_from_deploy_command> -c '{"Function": "query", "Args": ["a"]}'

在安全模式下要使用下面的命令:

CORE_PEER_ADDRESS=172.17.0.2:30303 ./peer chaincode query -u jim -l golang -n <name_value_returned_from_deploy_command> -c '{"Function": "query", "Args": ["a"]}'

Using Consensus Plugin

一个一致性插件可能需要你设置一些指定的配置。比如,要使用框架里提供的Byzantine插件,要执行下面的配置:

  • 把core.yaml中的peer.validator.consensus设置为pbft
  • 确保core.yaml的peer.id按顺序的设置为vpX,其中X是一个从0到N-1的整数值。比如,有4台validating peers,把peer.id设置为vp0,vp1,vp2,vp3。
  • 在consensus/obcpbft/config.yaml中,把general.mode设置classic,batch或sieve中的一个值,把general.N设置为网络中validating peers的数量。(如果设置了batch,还要把general.batchsize设置为每批次中交易的数量。)
  • 在consensus/obcpbft/config.yaml中,还可以选择设置批次执行的超时时间(general.timeout.batch),请求和执行之间可接受的延迟时间(general.timeout.request),以及view-change (general.timeout.viewchange)

查看core.yaml和consensus/obcpbft/config.yaml获取更多的信息。

所有这些设置可以被命令行环境变量值替换,比如,CORE_PEER_VALIDATOR_CONSENSUS=pbft或者CORE_PBFT_GENERAL_MODE=sieve

原文地址:https://github.com/hyperledger/fabric/blob/master/docs/dev-setup/devnet-setup.md