我想使用木筏合成创建Hyperledger Fabric。 知道木筏需要TLS,因此我仅在订购服务上使用了TLS。
crypto-config.yaml
OrdererOrgs:
- Name: Orderer
Domain: ttp.com
Specs:
- Hostname: orderer
- Hostname: orderer1
- Hostname: orderer2
PeerOrgs:
- Name: Org1
Domain: org1.ttp.com
Template:
Count: 3
Users:
Count: 1
由1个用户组成3个订购者和3个对等实体。
configtx.yaml
---
Organizations:
- &OrdererOrg
Name: OrdererOrg
ID: OrdererMSP
MSPDir: ../crypto-config/ordererOrganizations/ttp.com/msp
- &Org1
Name: Org1MSP
ID: Org1MSP
MSPDir: ../crypto-config/peerOrganizations/org1.ttp.com/msp
AnchorPeers:
- Host: peer0.org1.ttp.com
port: 7051
Orderer: &OrdererDefaults
OrdererType: etcdraft
Addresses:
- orderer.ttp.com:7050
- orderer1.ttp.com:7050
- orderer2.ttp.com:7050
BatchTimeout: 2s
BatchSize:
MaxMessageCount: 10
AbsoluteMaxBytes: 99 MB
PreferredMaxBytes: 512 KB
EtcdRaft:
Consenters:
- Host: orderer.ttp.com
Port: 7050
ClientTLSCert: ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer.ttp.com/tls/server.crt
ServerTLSCert: ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer.ttp.com/tls/server.crt
- Host: orderer1.ttp.com
Port: 7050
ClientTLSCert: ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer1.ttp.com/tls/server.crt
ServerTLSCert: ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer1.ttp.com/tls/server.crt
- Host: orderer2.ttp.com
Port: 7050
ClientTLSCert: ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer2.ttp.com/tls/server.crt
ServerTLSCert: ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer2.ttp.com/tls/server.crt
Organizations:
Application: &ApplicationsDefaults
Organizations:
Profiles:
TwoOrgsOrdererGenesis:
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Consortiums:
SampleConsortium:
Organizations:
- *Org1
TwoOrgsChannel:
Consortium: SampleConsortium
Application:
<<: *ApplicationsDefaults
Organizations:
- *Org1
docker-compose-base.yaml
version: '2'
services:
orderer:
image: hyperledger/fabric-orderer:1.4
environment:
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${CORE_PEER_NETWORKID}_behave
- ORDERER_HOME=/var/hyperledger/orderer
- ORDERER_GENERAL_LOGLEVEL=debug
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/msp
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_LISTENPORT=7050
- ORDERER_GENERAL_LEDGERTYPE=ram
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/configs/orderer.block
- CONFIGTX_ORDERER_ORDERERTYPE=etcdraft
- CONFIGTX_ORDERER_BATCHSIZE_MAXMESSAGECOUNT=${CONFIGTX_ORDERER_BATCHSIZE_MAXMESSAGECOUNT}
- CONFIGTX_ORDERER_BATCHTIMEOUT=${CONFIGTX_ORDERER_BATCHTIMEOUT}
- CONFIGTX_ORDERER_ADDRESS=[127.0.0.1:7050]
# TLS settings
- ORDERER_GENERAL_TLS_ENABLED=${ORDERER_GENERAL_TLS_ENABLED}
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/tls/ca.crt]
- ORDERER_TLS_CLIENTAUTHREQUIRED=${ORDERER_TLS_CLIENTAUTHREQUIRED}
- ORDERER_TLS_CLIENTROOTCAS_FILES=/var/hyperledger/users/Admin@ttp.com/tls/ca.crt
- ORDERER_TLS_CLIENTCERT_FILE=/var/hyperledger/users/Admin@ttp.com/tls/client.crt
- ORDERER_TLS_CLIENTKEY_FILE=/var/hyperledger/users/Admin@ttp.com/tls/client.key
# Raft configuration
- ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
- ORDERER_KAFKA_VERBOSE=true
- ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/tls/server.crt
- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/tls/server.key
- ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/tls/ca.crt]
volumes:
- ../network-config/:/var/hyperledger/configs
- ../crypto-config/ordererOrganizations/ttp.com/users:/var/hyperledger/users
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderer
command: orderer
ports:
- '7050'
couchdb:
image: hyperledger/fabric-couchdb
orderer-base:
image: hyperledger/fabric-orderer
environment:
- FABRIC_LOGGING_SPEC=INFO
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/configs/orderer.block
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/msp
# enabled TLS
- ORDERER_GENERAL_TLS_ENABLED=false
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/tls/server.key
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/tls/server.crt
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/tls/ca.crt]
- ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
- ORDERER_KAFKA_VERBOSE=true
- ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/tls/server.crt
- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/tls/server.key
- ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/tls/ca.crt]
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: orderer
volumes:
- ../network-config/:/var/hyperledger/configs/
- ../crypto-config/ordererOrganizations/ttp.com/users:/var/hyperledger/users
peer:
image: hyperledger/fabric-peer
environment:
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_PEER_NETWORKID=${CORE_PEER_NETWORKID}
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${CORE_PEER_NETWORKID}_behave
- CORE_PEER_ADDRESSAUTODETECT=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_MSPCONFIGPATH=/var/hyperledger/msp
- CORE_LEDGER_STATE_STATEDATABASE=LevelDB
- CORE_LOGGING_LEVEL=DEBUG
- CORE_LOGGING_GOSSIP=${CORE_LOGGING_GOSSIP}
- CORE_LOGGING_MSP=DEBUG
# TLS settings
- CORE_PEER_TLS_ENABLED=${CORE_PEER_TLS_ENABLED}
- CORE_PEER_TLS_CLIENTAUTHREQUIRED=${CORE_PEER_TLS_CLIENTAUTHREQUIRED}
- CORE_PEER_TLS_CERT_FILE=${CORE_PEER_TLS_CERT_FILE}
- CORE_PEER_TLS_KEY_FILE=${CORE_PEER_TLS_KEY_FILE}
- CORE_PEER_TLS_ROOTCERT_FILE=/var/hyperledger/tls/ca.crt
volumes:
- /var/run/:/host/var/run/
- $GOPATH/hyperledger/fabric:/opt/gopath/src/github.com/hyperledger/fabric/
- ../crypto-config:/var/hyperledger/configs
- ../network-config:/var/hyperledger/configs
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start
ports:
- '7051'
- '7053'
docker-compose.yaml
version: '2'
networks:
behave:
services:
ca.ttp.com:
image: hyperledger/fabric-ca
environment:
- FABRIC_CA_HOME=/var/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca.ttp.com
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_CA_CERTFILE=/var/hyperledger/fabric-ca-server-config/ca.org1.ttp.com-cert.pem
- FABRIC_CA_SERVER_CA_KEYFILE=/var/hyperledger/fabric-ca-server-config/4d1f1d67152110976242af5faa1e01b22aede6d1ca4bb2fd6750fca1ea8a4e0c_sk
ports:
- "7054:7054"
command: sh -c 'fabric-ca-server start --ca.certfile /var/hyperledger/fabric-ca-server-config/ca.org1.ttp.com-cert.pem --ca.keyfile /var/hyperledger/fabric-ca-server-config/4d1f1d67152110976242af5faa1e01b22aede6d1ca4bb2fd6750fca1ea8a4e0c_sk -b adminpw:adminpw'
volumes:
- ../crypto-config/peerOrganizations/org1.ttp.com/ca/:/var/hyperledger/fabric-ca-server-config
container_name: ca.ttp.com
networks:
behave:
aliases:
- ${CORE_PEER_NETWORKID}
orderer.ttp.com:
extends:
file: docker-compose-base.yml
service: orderer
container_name: orderer.ttp.com
volumes:
- ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer.ttp.com/msp:/var/hyperledger/msp
- ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer.ttp.com/tls:/var/hyperledger/tls
- ../network-config/:/var/hyperledger/configs
networks:
behave:
aliases:
- ${CORE_PEER_NETWORKID}
ports:
- 7050:7050
orderer1.ttp.com:
extends:
file: docker-compose-base.yml
service: orderer
container_name: orderer1.ttp.com
volumes:
- ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer1.ttp.com/msp:/var/hyperledger/msp
- ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer1.ttp.com/tls:/var/hyperledger/tls
- ../network-config/:/var/hyperledger/configs/
networks:
behave:
aliases:
- ${CORE_PEER_NETWORKID}
ports:
- 8050:7050
orderer2.ttp.com:
extends:
file: docker-compose-base.yml
service: orderer
container_name: orderer2.ttp.com
volumes:
- ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer2.ttp.com/msp:/var/hyperledger/msp
- ../crypto-config/ordererOrganizations/ttp.com/orderers/orderer2.ttp.com/tls:/var/hyperledger/tls
- ../network-config/:/var/hyperledger/configs
networks:
behave:
aliases:
- ${CORE_PEER_NETWORKID}
ports:
- 9050:7050
peer0.org1.ttp.com:
extends:
file: docker-compose-base.yml
service: peer
container_name: peer0.org1.ttp.com
environment:
- CORE_PEER_CHAINCODELISTENADDRESS=peer0.org1.ttp.com:7052
- CORE_PEER_LISTENADDRESS=peer0.org1.ttp.com:7051
- CORE_PEER_ID=peer0.org1.ttp.com
- CORE_PEER_ADDRESS=peer0.org1.ttp.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.ttp.com:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.ttp.com:7051
- CORE_PEER_GOSSIP_ORGLEADER=${CORE_PEER_GOSSIP_ORGLEADER_PEER0_ORG1}
- CORE_PEER_GOSSIP_USELEADERELECTION=${CORE_PEER_GOSSIP_USELEADERELECTION_PEER0_ORG1}
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_CLIENTROOTCAS_FILES=/var/hyperledger/users/Admin@org1.ttp.com/tls/ca.crt
- CORE_PEER_TLS_CLIENTCERT_FILE=/var/hyperledger/users/Admin@org1.ttp.com/tls/client.crt
- CORE_PEER_TLS_CLIENTKEY_FILE=/var/hyperledger/users/Admin@org1.ttp.com/tls/client.key
volumes:
- ../crypto-config/peerOrganizations/org1.ttp.com/peers/peer0.org1.ttp.com/msp:/var/hyperledger/msp
- ../crypto-config/peerOrganizations/org1.ttp.com/peers/peer0.org1.ttp.com/tls:/var/hyperledger/tls
- ../crypto-config/peerOrganizations/org1.ttp.com/users:/var/hyperledger/users
- ../network-config/:/var/hyperledger/configs
depends_on:
- orderer.ttp.com
- orderer1.ttp.com
- orderer2.ttp.com
networks:
behave:
aliases:
- ${CORE_PEER_NETWORKID}
ports:
- 7051:7051
- 7053:7053
peer1.org1.ttp.com:
extends:
file: docker-compose-base.yml
service: peer
container_name: peer1.org1.ttp.com
environment:
- CORE_PEER_CHAINCODELISTENADDRESS=peer1.org1.ttp.com:7052
- CORE_PEER_LISTENADDRESS=peer1.org1.ttp.com:7051
- CORE_PEER_ID=peer1.org1.ttp.com
- CORE_PEER_ADDRESS=peer1.org1.ttp.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.ttp.com:7051
- CORE_PEER_GOSSIP_ORGLEADER=${CORE_PEER_GOSSIP_ORGLEADER_PEER1_ORG1}
- CORE_PEER_GOSSIP_USELEADERELECTION=${CORE_PEER_GOSSIP_USELEADERELECTION_PEER1_ORG1}
- CORE_PEER_PROFILE_ENABLED=true
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_CLIENTROOTCAS_FILES=/var/hyperledger/users/Admin@org1.ttp.com/tls/ca.crt
- CORE_PEER_TLS_CLIENTCERT_FILE=/var/hyperledger/users/Admin@org1.ttp.com/tls/client.crt
- CORE_PEER_TLS_CLIENTKEY_FILE=/var/hyperledger/users/Admin@org1.ttp.com/tls/client.key
volumes:
- ../crypto-config/peerOrganizations/org1.ttp.com/peers/peer1.org1.ttp.com/msp:/var/hyperledger/msp
- ../crypto-config/peerOrganizations/org1.ttp.com/peers/peer1.org1.ttp.com/tls:/var/hyperledger/tls
- ../crypto-config/peerOrganizations/org1.ttp.com/users:/var/hyperledger/users
- ../network-config/:/var/hyperledger/configs
depends_on:
- orderer.ttp.com
- orderer1.ttp.com
- orderer2.ttp.com
- peer0.org1.ttp.com
networks:
behave:
aliases:
- ${CORE_PEER_NETWORKID}
ports:
- 8051:7051
- 8053:7053
peer2.org1.ttp.com:
extends:
file: docker-compose-base.yml
service: peer
container_name: peer2.org1.ttp.com
environment:
- CORE_PEER_CHAINCODELISTENADDRESS=peer2.org1.ttp.com:7052
- CORE_PEER_LISTENADDRESS=peer2.org1.ttp.com:7051
- CORE_PEER_ID=peer2.org1.ttp.com
- CORE_PEER_ADDRESS=peer2.org1.ttp.com:7051
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.ttp.com:7051
- CORE_PEER_GOSSIP_ORGLEADER=${CORE_PEER_GOSSIP_ORGLEADER_PEER2_ORG1}
- CORE_PEER_GOSSIP_USELEADERELECTION=${CORE_PEER_GOSSIP_USELEADERELECTION_PEER2_ORG1}
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_CLIENTROOTCAS_FILES=/var/hyperledger/users/Admin@org1.ttp.com/tls/ca.crt
- CORE_PEER_TLS_CLIENTCERT_FILE=/var/hyperledger/users/Admin@org1.ttp.com/tls/client.crt
- CORE_PEER_TLS_CLIENTKEY_FILE=/var/hyperledger/users/Admin@org1.ttp.com/tls/client.key
volumes:
- ../crypto-config/peerOrganizations/org1.ttp.com/peers/peer2.org1.ttp.com/msp:/var/hyperledger/msp
- ../crypto-config/peerOrganizations/org1.ttp.com/peers/peer2.org1.ttp.com/tls:/var/hyperledger/tls
- ../crypto-config/peerOrganizations/org1.ttp.com/users:/var/hyperledger/users
- ../network-config/:/var/hyperledger/configs
depends_on:
- orderer.ttp.com
- orderer1.ttp.com
- orderer2.ttp.com
- peer0.org1.ttp.com
networks:
behave:
aliases:
- ${CORE_PEER_NETWORKID}
ports:
- 9051:7051
- 9053:7053
docker-compose-cli.yaml
version: '2'
networks:
behave:
services:
cli:
container_name: cli
image: hyperledger/fabric-tools
tty: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org1.ttp.com:7051
- CORE_PEER_LISTENADDRESS=peer0.org1.ttp.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.ttp.com/peers/peer0.org1.ttp.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.ttp.com/peers/peer0.org1.ttp.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.ttp.com/peers/peer0.org1.ttp.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.ttp.com/users/Admin@org1.ttp.com/msp
- CORE_PEER_TLS_CLIENTKEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.ttp.com/users/Admin@org1.ttp.com/tls/client.key
- CORE_PEER_TLS_CLIENTROOTCAS_FILES=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.ttp.com/users/Admin@org1.ttp.com/tls/ca.crt
- CORE_PEER_TLS_CLIENTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.ttp.com/users/Admin@org1.ttp.com/tls/client.crt
- CORE_CHAINCODE_KEEPALIVE=10
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
volumes:
- /var/run/:/host/var/run/
- ../chaincode/:/opt/gopath/src/github.com/chaincode
- $GOPATH/src/github.com/hyperledger/fabric/:/opt/gopath/src/github.com/hyperledger/fabric/
- ../crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ../network-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/network-config/
networks:
- behave
.env文件
COMPOSE_PROJECT_NAME=net
CONFIGTX_ORDERER_BATCHSIZE_MAXMESSAGECOUNT=10
CONFIGTX_ORDERER_BATCHTIMEOUT=2s
KAFKA_DEFAULT_REPLICATION_FACTOR=3
CORE_LOGGING_GOSSIP=WARNING
ORDERER_GENERAL_TLS_ENABLED=true
ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/tls/server.key
ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/tls/server.crt
ORDERER_TLS_CLIENTAUTHREQUIRED=true
CORE_PEER_TLS_ENABLED=false
CORE_PEER_TLS_CERT_FILE=/var/hyperledger/tls/server.crt
CORE_PEER_TLS_KEY_FILE=/var/hyperledger/tls/server.key
CORE_PEER_TLS_CLIENTAUTHREQUIRED=false
CORE_PEER_GOSSIP_ORGLEADER_PEER0_ORG1=false
CORE_PEER_GOSSIP_USELEADERELECTION_PEER0_ORG1=true
CORE_PEER_GOSSIP_ORGLEADER_PEER1_ORG1=false
CORE_PEER_GOSSIP_USELEADERELECTION_PEER1_ORG1=true
CORE_PEER_GOSSIP_ORGLEADER_PEER2_ORG1=false
CORE_PEER_GOSSIP_USELEADERELECTION_PEER2_ORG1=true
ORDERER_ABSOLUTEMAXBYTES=10 MB
ORDERER_PREFERREDMAXBYTES=512 KB
KAFKA_MESSAGE_MAX_BYTES=1000012 B
KAFKA_REPLICA_FETCH_MAX_BYTES=1048576 B
KAFKA_REPLICA_FETCH_RESPONSE_MAX_BYTES=10485760 B
CORE_PEER_NETWORKID=net
我已经成功创建了加密概要文件和创始块,通道tx文件。
让docker使用cli容器。正在发送
peer channel create -o orderer.ttp.com:7050 -c $CHANNEL_NAME -f ./network-config/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/ttp.com/orderers/orderer.ttp.com/msp/tlscacerts/tlsca.ttp.com-cert.pem
返回成功的响应。
当我尝试peer channel join -b mychannel.block --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/ttp.com/orderers/orderer.ttp.com/msp/tlscacerts/tlsca.ttp.com-cert.pem --clientauth /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.ttp.com/peers/peer0.org1.ttp.com/msp/tlscacerts/tlsca.org1.ttp.com-cert.pem
将同伴加入频道时,它向我发送错误消息
Error: error getting endorser client for channel: endorser client failed to connect to peer0.org1.ttp.com:7051: failed to create new connection: context deadline exceeded
我试图更改CORE_PEER_ADDRESS环境,但是没有用。
我也尝试过
docker kill $(docker ps -q) && docker rm $(docker ps -a -q)
docker volume prune
docker image prune
重新启动环境,它也不起作用。 感谢您的帮助