在进行镜像安装前,提供了一个sample脚本的下载,可以使用该脚本进行容器的启停。这里对该脚本进行分析。
fabric/release/linux-amd64/network_setup.sh
脚本提供了四个参数项目,
UP_DOWN="$1" CH_NAME="$2" CLI_TIMEOUT="$3" IF_COUCHDB="$4" : ${CLI_TIMEOUT:="10000"}
第一个:up down restart参数:可以进行容器的启停,这里主要关注up,也就是了解容器是如何拉起的。
第二个:字符串参数:通道名称,这里与fabric多通道有关
第三个:数值:管理工具超时时间(单位不明)
第四个:couchdb或'': 是否使用COUCHDB(CouchDB 是一个开源的面向文档的数据库管理系统)
执行up后,首先调用networkUp函数。之后转到generateArtifacts.sh脚本
function networkUp () { #Generate all the artifacts that includes org certs, orderer genesis block, # channel configuration transaction source generateArtifacts.sh $CH_NAME
解析generateArtifacts.sh执行过程
注:这块涉及到了证书相关的内容 ca证书 Membership Service Providers (MSP) https://fabric-rtd.readthedocs.io/en/latest/msp.html x.509 certificates and public key infrastructure https://en.wikipedia.org/wiki/Public_key_infrastructure 后续再进行研究
function generateCerts ()
首先使用cryptogen工具生成密钥,密钥的生成模版为crypto-config.yam文件
$CRYPTOGEN generate --config=./crypto-config.yaml
等同与
cd/opt/fabric/release/linux-amd64/
bin/cryptogen generate --config=./crypto-config.yaml
crypto-config.yaml文件内容,根据这个定义结构,生成下面的密钥认证目录和文件
OrdererOrgs: - Name: Orderer Domain: example.com Specs: - Hostname: orderer PeerOrgs: - Name: Org1 Domain: org1.example.com Template: Count: 2 Users: Count: 1 - Name: Org2 Domain: org2.example.com Template: Count: 2 Users: Count: 1
可以执行该命令,生成生成的目录结构,如果反复执行,一些目录下会多次生成密钥
密钥的存储地址为:/opt/fabric/release/linux-amd64/crypto-config
使用tree crypto-config查看目录下的文件结构
crypto-config ├── ordererOrganizations │ └── example.com │ ├── ca │ │ ├── 0f63cc42f0f1fcf00a89ddd3b5da0936503c46802a07dbe45ff12882e78edf32_sk │ │ └── ca.example.com-cert.pem │ ├── msp │ │ ├── admincerts │ │ │ └── Admin@example.com-cert.pem │ │ ├── cacerts │ │ │ └── ca.example.com-cert.pem │ │ ├── keystore │ │ └── signcerts │ │ └── ca.example.com-cert.pem │ ├── orderers │ │ └── orderer.example.com │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── Admin@example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.example.com-cert.pem │ │ │ ├── keystore │ │ │ │ └── 8b24878c3b0d92bfbb58db333d0ff3cb15b7d4b27401e3f40a8efa6bd2d4df05_sk │ │ │ └── signcerts │ │ │ └── orderer.example.com-cert.pem │ │ └── tls │ │ ├── ca.crt │ │ ├── server.crt │ │ └── server.key │ └── users │ └── Admin@example.com │ ├── msp │ │ ├── admincerts │ │ │ └── ca.example.com-cert.pem │ │ ├── cacerts │ │ │ └── ca.example.com-cert.pem │ │ ├── keystore │ │ │ └── f11e42721d96e1dd5408f33a81dd74759a9d1ca294cc1dade6b8bf7b48dc1c9a_sk │ │ └── signcerts │ │ └── Admin@example.com-cert.pem │ └── tls │ ├── ca.crt │ ├── server.crt │ └── server.key └── peerOrganizations ├── org1.example.com │ ├── ca │ │ ├── 94cbaa1ffab32105d323007ffe831bbc14be58d31b1e8e534fc48c8dfa405ef1_sk │ │ └── ca.org1.example.com-cert.pem │ ├── msp │ │ ├── admincerts │ │ │ └── Admin@org1.example.com-cert.pem │ │ ├── cacerts │ │ │ └── ca.org1.example.com-cert.pem │ │ ├── keystore │ │ └── signcerts │ │ └── ca.org1.example.com-cert.pem │ ├── peers │ │ ├── peer0.org1.example.com │ │ │ ├── msp │ │ │ │ ├── admincerts │ │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ │ ├── cacerts │ │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ │ ├── keystore │ │ │ │ │ └── e300201ec6785972a88f89d6586ed913d46d228d6cb2fe0a7043a46a61dd4402_sk │ │ │ │ └── signcerts │ │ │ │ └── peer0.org1.example.com-cert.pem │ │ │ └── tls │ │ │ ├── ca.crt │ │ │ ├── server.crt │ │ │ └── server.key │ │ └── peer1.org1.example.com │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ ├── keystore │ │ │ │ └── e38cc67f6a49fd60aa44acc8fd328f00778b3df4868b2bfb8e254141d75e9a73_sk │ │ │ └── signcerts │ │ │ └── peer1.org1.example.com-cert.pem │ │ └── tls │ │ ├── ca.crt │ │ ├── server.crt │ │ └── server.key │ └── users │ ├── Admin@org1.example.com │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ ├── keystore │ │ │ │ └── 10c59c2596366e4a6e1046120a10a7977c019458786ac86b3f99d64474c97529_sk │ │ │ └── signcerts │ │ │ └── Admin@org1.example.com-cert.pem │ │ └── tls │ │ ├── ca.crt │ │ ├── server.crt │ │ └── server.key │ └── User1@org1.example.com │ ├── msp │ │ ├── admincerts │ │ │ └── ca.org1.example.com-cert.pem │ │ ├── cacerts │ │ │ └── ca.org1.example.com-cert.pem │ │ ├── keystore │ │ │ └── 78730dac6a0358428e3556275567883bc1c7e818875a9925f4e7c1517053f438_sk │ │ └── signcerts │ │ └── User1@org1.example.com-cert.pem │ └── tls │ ├── ca.crt │ ├── server.crt │ └── server.key └── org2.example.com ├── ca │ ├── 683f20c00dd655b5ed6073098c62acbd1efa660d9f5f585258a3a4e61739ef9c_sk │ └── ca.org2.example.com-cert.pem ├── msp │ ├── admincerts │ │ └── Admin@org2.example.com-cert.pem │ ├── cacerts │ │ └── ca.org2.example.com-cert.pem │ ├── keystore │ └── signcerts │ └── ca.org2.example.com-cert.pem ├── peers │ ├── peer0.org2.example.com │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── Admin@org2.example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.org2.example.com-cert.pem │ │ │ ├── keystore │ │ │ │ └── 000e0b35ff61c8e2c07f516346daf11aeabe5d0f5b6914c179ff11ad7c4f678e_sk │ │ │ └── signcerts │ │ │ └── peer0.org2.example.com-cert.pem │ │ └── tls │ │ ├── ca.crt │ │ ├── server.crt │ │ └── server.key │ └── peer1.org2.example.com │ ├── msp │ │ ├── admincerts │ │ │ └── Admin@org2.example.com-cert.pem │ │ ├── cacerts │ │ │ └── ca.org2.example.com-cert.pem │ │ ├── keystore │ │ │ └── 55d455f9d1bf47f0320484b322791f43e94d8e7e5e8ed8383f7daf1adeb2c2d2_sk │ │ └── signcerts │ │ └── peer1.org2.example.com-cert.pem │ └── tls │ ├── ca.crt │ ├── server.crt │ └── server.key └── users ├── Admin@org2.example.com │ ├── msp │ │ ├── admincerts │ │ │ └── ca.org2.example.com-cert.pem │ │ ├── cacerts │ │ │ └── ca.org2.example.com-cert.pem │ │ ├── keystore │ │ │ └── 20b446c7b6bf5006fccb1fc11168c56e48e937e2775bd46eec627fe7d37d5101_sk │ │ └── signcerts │ │ └── Admin@org2.example.com-cert.pem │ └── tls │ ├── ca.crt │ ├── server.crt │ └── server.key └── User1@org2.example.com ├── msp │ ├── admincerts │ │ └── ca.org2.example.com-cert.pem │ ├── cacerts │ │ └── ca.org2.example.com-cert.pem │ ├── keystore │ │ └── b72634c677b36bb05718416db8dbdb5dc118ee54a3db8a2b7a6415df87c92e8b_sk │ └── signcerts │ └── User1@org2.example.com-cert.pem └── tls ├── ca.crt ├── server.crt └── server.key
function replacePrivateKey ()
复制一个docker-compose-e2e.yaml,然后将CA的密码替换进去
cp docker-compose-e2e-template.yaml docker-compose-e2e.yaml
generateChannelArtifacts()
执行configtxgen生成创世块
export FABRIC_CFG_PATH=$PWD
./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
这里需要设置FABRIC_CFG_PATH,因为configtxgen是根据configtx.yaml这个文件取的内容,默认的名称是写在代码中,可以通过参数进行修改。
会生成多个块,都放在channel-artifacts文件夹下面。默认的通道名是:CHANNEL_NAME:="mychannel"
$CONFIGTXGEN -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME $CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP $CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
generateArtifacts.sh文件执行完毕
继续network_setup.sh的内容。
需要选择是否使用COUCHDB,CouchDB 是一个开源的面向文档的数据库管理系统
之后使用docker-compose -f docker-compose-cli.yaml 开始启动容器了。这里很奇怪没有使用新生成的docker-compose-e2e.yaml。这个后续要研究一下。
function networkUp () { #Generate all the artifacts that includes org certs, orderer genesis block, # channel configuration transaction source generateArtifacts.sh $CH_NAME if [ "${IF_COUCHDB}" == "couchdb" ]; then CHANNEL_NAME=$CH_NAME TIMEOUT=$CLI_TIMEOUT docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_COUCH up -d 2>&1 else CHANNEL_NAME=$CH_NAME TIMEOUT=$CLI_TIMEOUT docker-compose -f $COMPOSE_FILE up -d 2>&1 fi if [ $? -ne 0 ]; then echo "ERROR !!!! Unable to pull the images " exit 1 fi docker logs -f cli }
至此启动过程结束。