network.sh
对参量进行定义:
crypto: 加密方式,cryptogen与fabric-ca
max_retry:最大的等待响应次数
cli_delay:命令间的延迟
channel_name
cc_name
cc_src_path:链码路径
cc_end_policy:背书策略
cc_coll_config:链码集配置
cc_init_fcn:链码初始化功能
会涉及以下默认目录
# use this as the default docker-compose yaml definition
COMPOSE_FILE_BASE=docker/docker-compose-test-net.yaml
# docker-compose.yaml file if you are using couchdb
COMPOSE_FILE_COUCH=docker/docker-compose-couch.yaml
# certificate authorities compose file
COMPOSE_FILE_CA=docker/docker-compose-ca.yaml
# use this as the docker compose couch file for org3
COMPOSE_FILE_COUCH_ORG3=addOrg3/docker/docker-compose-couch-org3.yaml
# use this as the default docker-compose yaml definition for org3
COMPOSE_FILE_ORG3=addOrg3/docker/docker-compose-org3.yaml
CC_SRC_LANGUAGE:链码语言
CC_VERSION:链码版本
CC_SEQUENCE:链码定义序列
DATABASE:leveldb或couchdb
networkup
启动网络networkup需要以下步骤:
-
先要检查先决条件:
- 查看是否克隆了peer的binary文件及是否克隆了配置文件
- 使用fabric的工具容器查看是否二进制文件和例子符合docker镜像
- 检查fabric-CA,若crypto变量为CA,则查看fabric-ca-client version,若输出不为零,则未找到binary文件
-
如果organizations/peerorganizations存在,则创建组织:(就只拿cryptogen为例)
- 对cryptogen进行判断,看是否存在
- 用cryptogen的generate来生成organization,generate需要用到yaml文件
- 用cryptogen的generate来生成orderer,generate需要用到yaml文件
-
再创建联盟:
- 对configtxgen进行判断,是否存在
- 用configtxgen来生成创世块,用到channelid,outputblock,twoorgsorderergensis,这里的是系统通道
createchannel
创建用户通道:
-
如果organizations/peerorganizations不存在,则调用networkup
-
调用createchannel.sh,将$CHANNEL_NAME $CLI_DELAY $MAX_RETRY $VERBOSE传入
-
设置局部变量,和需要投票的轮数,对应Raft
-
调用
osnadmin channel join --channelID $CHANNEL_NAME --config-block ./channel-artifacts/${CHANNEL_NAME}.block -o localhost:7053 --ca-file "$ORDERER_CA" --client-cert "$ORDERER_ADMIN_TLS_SIGN_CERT" --client-key "$ORDERER_ADMIN_TLS_PRIVATE_KEY" >&log.txt来生成osn admin,并加入通道
-
将其写入日志中
-
将所有的Peer节点加入channel,会调用Peer中的channel.join:
peer channel join -b $BLOCKFILE >&log.txt -
为两个组织设置锚节点
-
deploycc
部署链码:
-
将以下参数
$CHANNEL_NAME $CC_NAME $CC_SRC_PATH $CC_SRC_LANGUAGE $CC_VERSION $CC_SEQUENCE $CC_INIT_FCN $CC_END_POLICY $CC_COLL_CONFIG $CLI_DELAY $MAX_RETRY $VERBOSE传入deploycc.sh
-
首先需要将链码打包,用该命令:
peer lifecycle chaincode package ${CC_NAME}.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label ${CC_NAME}_${CC_VERSION} >&log.txt并对结果进行验证
-
为通道内的组织安装链码:
-
定义变量ORG,为传入的组织号
-
通过Peer工具的
peer lifecycle chaincode install ${CC_NAME}.tar.gz >&log.txt来进行安装同样对结果进行验证
-
对不同的组织通过
peer lifecycle chaincode queryinstalled >&log.txt来查看是否安装好了
-
对安装的链码进行投票,用到的工具为
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "$ORDERER_CA" --channelID $CHANNEL_NAME --name ${CC_NAME} --version ${CC_VERSION} --package-id ${PACKAGE_ID} --sequence ${CC_SEQUENCE} ${INIT_REQUIRED} ${CC_END_POLICY} ${CC_COLL_CONFIG} >&log.txt对投票结果进行输出
-
查看组织的链码定义提交情况,传入的也为org,用到的工具为
peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name ${CC_NAME} --version ${CC_VERSION} --sequence ${CC_SEQUENCE} ${INIT_REQUIRED} ${CC_END_POLICY} ${CC_COLL_CONFIG} --output json >&log.txt等到所有的组织完成,并将结果进行输出
-
将两个组织的链码定义进行提交:
peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "$ORDERER_CA" --channelID $CHANNEL_NAME --name ${CC_NAME} "${PEER_CONN_PARMS[@]}" --version ${CC_VERSION} --sequence ${CC_SEQUENCE} ${INIT_REQUIRED} ${CC_END_POLICY} ${CC_COLL_CONFIG} >&log.txt -
查看组织的提交情况:
peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name ${CC_NAME} >&log.txt -
若$CC_INIT_FCN不为空,才能进行调用,即对其参数进行了初始化,
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "$ORDERER_CA" -C $CHANNEL_NAME -n ${CC_NAME} "${PEER_CONN_PARMS[@]}" --isInit -c ${fcn_call} >&log.txt
-
networkdown
-
先设置docker_sock:
DOCKER_SOCK=$DOCKER_SOCK docker-compose -f $COMPOSE_FILE_BASE -f $COMPOSE_FILE_COUCH -f $COMPOSE_FILE_CA down --volumes --remove-orphansdocker-compose -f $COMPOSE_FILE_COUCH_ORG3 -f $COMPOSE_FILE_ORG3 down --volumes --remove-orphans -
若模式为restart:
-
清理容器:
docker rm -f $(docker ps -aq --filter label=service=hyperledger-fabric) 2>/dev/null || true docker rm -f $(docker ps -aq --filter name='dev-peer*') 2>/dev/null || true -
删除创建的链码镜像
docker image rm -f $(docker images -aq --filter reference='dev-peer*') 2>/dev/null || true -
删除orderer区块和其他的通道配置交易及证书
docker run --rm -v "$(pwd):/data" busybox sh -c 'cd /data && rm -rf system-genesis-block/*.block organizations/peerOrganizations organizations/ordererOrganizations' -
去除fabric artifacts
docker run --rm -v "$(pwd):/data" busybox sh -c 'cd /data && rm -rf organizations/fabric-ca/org1/msp organizations/fabric-ca/org1/tls-cert.pem organizations/fabric-ca/org1/ca-cert.pem organizations/fabric-ca/org1/IssuerPublicKey organizations/fabric-ca/org1/IssuerRevocationPublicKey organizations/fabric-ca/org1/fabric-ca-server.db'docker run --rm -v "$(pwd):/data" busybox sh -c 'cd /data && rm -rf organizations/fabric-ca/org2/msp organizations/fabric-ca/org2/tls-cert.pem organizations/fabric-ca/org2/ca-cert.pem organizations/fabric-ca/org2/IssuerPublicKey organizations/fabric-ca/org2/IssuerRevocationPublicKey organizations/fabric-ca/org2/fabric-ca-server.db'docker run --rm -v "$(pwd):/data" busybox sh -c 'cd /data && rm -rf organizations/fabric-ca/ordererOrg/msp organizations/fabric-ca/ordererOrg/tls-cert.pem organizations/fabric-ca/ordererOrg/ca-cert.pem organizations/fabric-ca/ordererOrg/IssuerPublicKey organizations/fabric-ca/ordererOrg/IssuerRevocationPublicKey organizations/fabric-ca/ordererOrg/fabric-ca-server.db'docker run --rm -v "$(pwd):/data" busybox sh -c 'cd /data && rm -rf addOrg3/fabric-ca/org3/msp addOrg3/fabric-ca/org3/tls-cert.pem addOrg3/fabric-ca/org3/ca-cert.pem addOrg3/fabric-ca/org3/IssuerPublicKey addOrg3/fabric-ca/org3/IssuerRevocationPublicKey addOrg3/fabric-ca/org3/fabric-ca-server.db' -
移除通道
docker run --rm -v "$(pwd):/data" busybox sh -c 'cd /data && rm -rf channel-artifacts log.txt *.tar.gz'
-