cryptogen generate --config=./crypto-config.yaml
会在crypto-config目录下根据配置文件中信息给相关组织、节点、用户创建证书、秘钥。配置文件中设置了一个order组织,下挂一个order节点,两个peer组织,每个peer组织下挂2个peer节点,每个peer组织含有2个普通用户,默认存在一个管理员用户。Template.Count控制peer节点数量,Users.Count控制普通用户数量。
configtxgen -profile genesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
该命令会在/opt/fabric-demo/channel-artifacts中创建genesis.block文件,主要生成创建创世块的配置文件。 byfn-sys-channel是一个系统channel与后面手动创建的channel不同。
configtxgen -profile 参数名与configtx.yaml中配置的名称一致即可。里面包含order组织的信息,order节点的属性,联盟名称SampleConsortium,组成该联盟的peer组织信息等。
configtxgen -profile myChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
该命令会在/opt/fabric-demo/channel-artifacts中创建channel.tx文件,主要生成创建通道的配置文件。
configtxgen -profile 参数名与configtx.yaml中配置的名称一致即可。里面包含该通道关联的联盟,参与该通道的peer组织信息,channelID的名称必须小写。
configtxgen -profile myChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
configtxgen -profile myChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
该命令用来更新peer组织的anchor peer角色的peer节点的。一个peer组织最多只有一个anchor peer角色的peer节点,代表该peer组织与其他组织进行通信,该命令生成一个新的anchor peer角色的peer节点配置文件。channelID与上面创建的channel.tx中channelID名称一致,-asOrg 后面MSPID与下列展示一致。
执行完上面命令后,最终展示如下:
通过观察该配置文件中内容发现 启动order服务的时候会依赖base/docker-compose-base.yaml配置文件中名称为orderer.example.com的服务。拷贝base/docker-compose-base.yaml到当前目录。
观察发现orderer.example.com名称的服务依赖peer-base.yaml配置文件,将该配置文件拷贝到base目录。结果如下:
如果修改了相关节点的domain,需要修改配置文件中相关路径。主要涉及到6个容器的配置信息,1个cli,1个order,4个peer。msp,tls,gossip,连接peer的用户、日志级别等信息。注意peer-base.yaml配置文件中含有一个变量${COMPOSE_PROJECT_NAME},该变量取值是docker-compose-cli.yaml所在目录的名称。会根据该变量构建docker network名称。
chaincode目录中保存的是链码示例,含有go、java、node三种版本。该处使用go语言的chaincode_example02.go链码
chaincode目录的路径需要和docker-compose-cli.yaml中cli服务的chaincode一致。
执行下列命令,传入变量IMAGE_TAG、COMPOSE_PROJECT_NAME值
IMAGE_TAG=1.4.1 COMPOSE_PROJECT_NAME=fabric-demo docker-compose -f docker-compose-cli.yaml up -d
执行下列命令,进入cli容器,根据 docker-compose-cli.yaml 配置文件信息,默认连接的peer0.org1节点。
docker exec -it cli bash
执行下列命令,创建channel,该channel名称与创建channel.tx文件的时候设置的一致mychannel 。
peer channel create -o orderer.lfl.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/lfl.com/orderers/orderer.lfl.com/msp/tlscacerts/tlsca.lfl.com-cert.pem
容器内当前目录下生成了一个mychannel.block文件,代表创建channel成功。
执行下列命令,将peer加入channel。
peer channel join -b mychannel.block
可以看到,当前peer添加到名称为mychannel的channel中。
依次执行下列命令可以切换不同的peer进行加入channel的动作。主要是改变环境变量的值。
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org1.lfl.com:8051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lfl.com/peers/peer1.org1.lfl.com/tls/ca.crt peer channel join -b mychannel.block
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer0.org2.lfl.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer0.org2.lfl.com/tls/ca.crt peer channel join -b mychannel.block
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org2.lfl.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer1.org2.lfl.com/tls/ca.crt peer channel join -b mychannel.block
执行下列命令,进行链码的打包处理。
peer chaincode package -n mychaincode -v 1.0 -p github.com/chaincode/chaincode_example02/go mychaincode.package
链码包的名称mychaincode,版本1.0,包文件mychaincode.package,链码源文件路径github.com/chaincode/chaincode_example02/go(该处是容器内$GOPATH/src的相对路径)。当前目录下存在mychaincode.package文件。
执行下列命令,进行链码安装,链码可以不安装到所有peer节点,主要在endorsing peer上发挥作用。
peer chaincode install mychaincode.package
安装成功。
执行下列命令,依次在其他peer节点上进行链码安装。
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org1.lfl.com:8051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lfl.com/peers/peer1.org1.lfl.com/tls/ca.crt peer chaincode install mychaincode.package
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer0.org2.lfl.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer0.org2.lfl.com/tls/ca.crt peer chaincode install mychaincode.package
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org2.lfl.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer1.org2.lfl.com/tls/ca.crt peer chaincode install mychaincode.package
执行下列命令,将安装的链码初始化到channel上,相同的链码在同一个channel上只能初始化一次。
peer chaincode instantiate -o orderer.lfl.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/lfl.com/orderers/orderer.lfl.com/msp/tlscacerts/tlsca.lfl.com-cert.pem -C mychannel -n mychaincode -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
设置初始化参数 a=100,b=200 背书策略 -P “AND (‘Org1MSP.peer’,‘Org2MSP.peer’)” 需要Org1和Org2两个peer组织中的任意一个peer同时认可这笔交易,交易才算生效。
初始化成功后,容器列表会多出来一个名称为dev-peer0.org1.lfl.com-mychaincode-1.0的容器。
执行下列命令,进行参数a,b初始值的查询。
peer chaincode query -C mychannel -n mychaincode -c '{"Args":["query","a"]}'
peer chaincode query -C mychannel -n mychaincode -c '{"Args":["query","b"]}'
当前peer节点是peer0.org1,进行更新操作a转给b 10。
查看当前节点
echo $CORE_PEER_ADDRESS
peer chaincode invoke -o orderer.lfl.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/lfl.com/orderers/orderer.lfl.com/msp/tlscacerts/tlsca.lfl.com-cert.pem -C mychannel -n mychaincode --peerAddresses peer0.org1.lfl.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lfl.com/peers/peer0.org1.lfl.com/tls/ca.crt --peerAddresses peer0.org2.lfl.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer0.org2.lfl.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
执行更新操作的时候,同时向peer0.org1、peer0.org2这两个peer节点发送交易提议,会在这两个peer节点上进行模拟交易,所以此时容器又增加一个dev-peer0.org2.lfl.com-mychaincode-1.0。
执行下列命令切换peer节点到peer1.org2
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/users/[email protected]/msp CORE_PEER_ADDRESS=peer1.org2.lfl.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.lfl.com/peers/peer1.org2.lfl.com/tls/ca.crt
在peer1.org2节点上查询a、b的值
peer chaincode query -C mychannel -n mychaincode -c '{"Args":["query","a"]}'
peer chaincode query -C mychannel -n mychaincode -c '{"Args":["query","b"]}'