Hyperledger Fabric网络环境搭建 CA,RAFT,SOLO 单机 多机

Hyperledger Fabric 区块链多机部署 目录 目录 Hyperledger Fabric 区块链多机部署 环境介绍 源码编译以及fabric 区块链网络部署环境准备 编译 fabric区块链相关可执行程序 编译 go 相关工具 编译 fabric基础环境 编译区块链服务相关工具 多机部署fabric网络solo共识 配置 fabric 网络用户拓扑关系 配置Orderer 节点的启动创世区块新建通道交易的相 阅读详情

环境搭建demo如下:

  • 现已完成 2020-07-30 15:12
    • solo模式
    • raft多组织
    • raft单机部署
    • raft多机部署
    • 纯CA手动搭建raft
    • go-sdk 实例化区块链网络
  • 不行找我~~~~~,很自信,搭建过太多遍了:-(,遇到过很多问题~~~~
  • 库
  • 自己的chaincode个人库
  • demo链接

自定义CA服务器搭建RAFT区块链网络

export DIRECTORY_NAME=/examples/blockchain/manualca
export DOMAIN=demo.com
export CERTIFICATE_DOMAIN=demo-com

mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/{artifacts,crypto-config,network}
mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/{caOrganizations,ordererOrganizations,peerOrganizations}
mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/{tls-ca,order-ca,org-ca}

搭建TLS服务器

  • mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/{tls-ca,order-ca,org-ca}
    
  • 在tls中创建tls.ca.yaml,order-ca.yaml 和org-ca.yaml

    • tlsa-ca.yaml:

      • # ca-tls 服务器,用于控制所有的组织之间的交流
        version: '2'
        networks:
          ca:
        services:
          tls.ca:
            container_name: tls.ca.${DOMAIN}
            image: hyperledger/fabric-ca:1.4.4
            command: sh -c 'fabric-ca-server start -d -b admin:adminpw '
            environment:
              - FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca
              - FABRIC_CA_SERVER_TLS_ENABLED=true
              - FABRIC_CA_SERVER_CSR_CN=ca-tls
              - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
              - FABRIC_CA_SERVER_DEBUG=true
            volumes:
              - ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca:/tmp/hyperledger/fabric-ca
            ports:
              - 4052:7054
            networks:
              ca:
        
    • 启动 tls-ca: docker-compose -f tls-ca.yaml up -d

    • 登记admin角色:

      • fabric-ca-client enroll -d -u https://admin:adminpw@0.0.0.0:4052  -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/admin/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/ca-cert.pem
        
        
    • 注册相关的节点信息:

      fabric-ca-client register -d --id.name orderer0.${DOMAIN} --id.secret order0pw --id.type order --id.attrs '"hf.Registrar.Roles=orderer"' -u https://0.0.0.0:4052 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/admin/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/ca-cert.pem && \
       fabric-ca-client register -d --id.name orderer1.${DOMAIN} --id.secret order1pw --id.type order --id.attrs '"hf.Registrar.Roles=orderer"' -u https://0.0.0.0:4052 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/admin/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/ca-cert.pem && \
      fabric-ca-client register -d --id.name orderer2.${DOMAIN} --id.secret order2pw --id.type order --id.attrs '"hf.Registrar.Roles=orderer"' -u https://0.0.0.0:4052 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/admin/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/ca-cert.pem && \
       fabric-ca-client register -d --id.name orderer3.${DOMAIN} --id.secret order3pw --id.type order --id.attrs '"hf.Registrar.Roles=orderer"' -u https://0.0.0.0:4052 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/admin/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/ca-cert.pem && \
       fabric-ca-client register -d --id.name orderer4.${DOMAIN} --id.secret order4pw --id.type order --id.attrs '"hf.Registrar.Roles=orderer"' -u https://0.0.0.0:4052 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/admin/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/ca-cert.pem && \
       fabric-ca-client register -d --id.name peer1.${DOMAIN} --id.secret peer1pw --id.type peer --id.attrs '"hf.Registrar.Roles=peer"' -u https://0.0.0.0:4052 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/admin/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/ca-cert.pem && \
       fabric-ca-client register -d --id.name peer2.${DOMAIN} --id.secret peer2pw --id.type peer --id.attrs '"hf.Registrar.Roles=peer"' -u https://0.0.0.0:4052 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/admin/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/ca-cert.pem
      
      

搭建并且启动order的ca服务器

  • prepare

    • mkdir -p  ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/{ca,orderers,tlsca,users}/
      
    • 启动order-ca

      • yaml配置文件为:

        • # ca-order 服务器,用于控制orderer节点
          version: '2'
          networks:
            ca:
          services:
            order.ca:
              container_name: orderer.ca.${DOMAIN}
              image: hyperledger/fabric-ca:1.4.4
              command: sh -c 'fabric-ca-server start -d -b admin:adminpw'
              environment:
                - FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca
                - FABRIC_CA_SERVER_TLS_ENABLED=true
                - FABRIC_CA_SERVER_CSR_CN=ca-order
                - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
                - FABRIC_CA_SERVER_DEBUG=true
              volumes:
                - ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/order-ca:/tmp/hyperledger/fabric-ca
              ports:
                - 4053:7054
              networks:
                ca:
          
      • docker-compose -f order-ca.yaml up -d

    • 复制order的 ca的根证书文件到msp目录下

      • cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/order-ca/ca-cert.pem ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt
        
    • 复制tls 服务器的根证书到 tlscacerts下

      • cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/ca-cert.pem ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/tlsca/ca.crt
        
  • 登记order的admin角色:

    • fabric-ca-client enroll -d -u https://admin:adminpw@0.0.0.0:4053 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt
      
    • 为了方便后续的使用,这里将admin用户的msp 证书相关文件 取别名:尤其是sdk的使用

      • cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/cacerts/*.pem ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/ca.crt
        
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/signcerts/*.pem ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/server.crt
        
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/keystore/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/server.key
        
  • 创建config.yaml: 很重要

    • echo  \
      'NodeOUs:
          Enable: true
          ClientOUIdentifier:
            Certificate: cacerts/0-0-0-0-4053.pem
            OrganizationalUnitIdentifier: client
          PeerOUIdentifier:
            Certificate: cacerts/0-0-0-0-4053.pem
            OrganizationalUnitIdentifier: peer
          AdminOUIdentifier:
            Certificate: cacerts/0-0-0-0-4053.pem
            OrganizationalUnitIdentifier: admin
          OrdererOUIdentifier:
            Certificate: cacerts/0-0-0-0-4053.pem
            OrganizationalUnitIdentifier: orderer ' > ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/config.yaml
      
  • 注册相关的节点信息

    • fabric-ca-client register -d --id.name orderer0.${DOMAIN} --id.secret orderer0pw --id.type orderer --id.attrs '"hf.Registrar.Roles=orderer"' -u https://0.0.0.0:4053 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt && \
      fabric-ca-client register -d --id.name orderer1.${DOMAIN} --id.secret orderer1pw --id.type orderer --id.attrs '"hf.Registrar.Roles=orderer"' -u https://0.0.0.0:4053 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt && \
      fabric-ca-client register -d --id.name orderer2.${DOMAIN} --id.secret orderer2pw --id.type orderer --id.attrs '"hf.Registrar.Roles=orderer"' -u https://0.0.0.0:4053 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt && \
      fabric-ca-client register -d --id.name orderer3.${DOMAIN} --id.secret orderer3pw --id.type orderer --id.attrs '"hf.Registrar.Roles=orderer"' -u https://0.0.0.0:4053 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt && \
      fabric-ca-client register -d --id.name orderer4.${DOMAIN} --id.secret orderer4pw --id.type orderer --id.attrs '"hf.Registrar.Roles=orderer"' -u https://0.0.0.0:4053 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt
      
    • 注册admin用户: 这一步与官网的不同, 这步需要使用admin角色的才可以

    • fabric-ca-client register -d --id.name Admin@${DOMAIN} --id.secret adminpw --id.type admin --id.attrs "hf.Registrar.Roles=admin,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:4053 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt
      
  • 获取各个节点

    • mkdir -p  ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/{orderer0.${DOMAIN},orderer1.${DOMAIN},orderer2.${DOMAIN},orderer3.${DOMAIN},orderer4.${DOMAIN}}
      
      
    • fabric-ca-client enroll -d -u https://orderer0.${DOMAIN}:orderer0pw@0.0.0.0:4053  -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt && \
      fabric-ca-client enroll -d -u https://orderer1.${DOMAIN}:orderer1pw@0.0.0.0:4053  -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt && \
      fabric-ca-client enroll -d -u https://orderer2.${DOMAIN}:orderer2pw@0.0.0.0:4053  -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt && \
      fabric-ca-client enroll -d -u https://orderer3.${DOMAIN}:orderer3pw@0.0.0.0:4053  -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt && \
      fabric-ca-client enroll -d -u https://orderer4.${DOMAIN}:orderer4pw@0.0.0.0:4053  -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt
      
  • 获取各个节点的tls证书:

    • fabric-ca-client enroll -d -u https://orderer0.${DOMAIN}:order0pw@0.0.0.0:4052 --enrollment.profile tls --csr.hosts orderer0.${DOMAIN} -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/tls --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/tlsca/ca.crt && \
      fabric-ca-client enroll -d -u https://orderer1.${DOMAIN}:order1pw@0.0.0.0:4052 --enrollment.profile tls --csr.hosts orderer1.${DOMAIN} -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/tls --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/tlsca/ca.crt && \
      fabric-ca-client enroll -d -u https://orderer2.${DOMAIN}:order2pw@0.0.0.0:4052 --enrollment.profile tls --csr.hosts orderer2.${DOMAIN} -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/tls --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/tlsca/ca.crt && \
      fabric-ca-client enroll -d -u https://orderer3.${DOMAIN}:order3pw@0.0.0.0:4052 --enrollment.profile tls --csr.hosts orderer3.${DOMAIN} -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/tls --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/tlsca/ca.crt && \
      fabric-ca-client enroll -d -u https://orderer4.${DOMAIN}:order4pw@0.0.0.0:4052 --enrollment.profile tls --csr.hosts orderer4.${DOMAIN} -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/tls --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/tlsca/ca.crt
      
    • 更改tls下的几个文件名字,方便编写

      • cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/tls/tlscacerts/*.pem  ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/tls/ca.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/tls/signcerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/tls/server.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/tls/keystore/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/tls/server.key && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/tls/tlscacerts/*.pem  ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/tls/ca.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/tls/signcerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/tls/server.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/tls/keystore/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/tls/server.key && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/tls/tlscacerts/*.pem  ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/tls/ca.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/tls/signcerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/tls/server.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/tls/keystore/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/tls/server.key && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/tls/tlscacerts/*.pem  ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/tls/ca.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/tls/signcerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/tls/server.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/tls/keystore/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/tls/server.key && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/tls/tlscacerts/*.pem  ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/tls/ca.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/tls/signcerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/tls/server.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/tls/keystore/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/tls/server.key
        
    • 在各自的msp文件夹下创建tlscacerts

      • mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/msp/tlscacerts && \
        mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/msp/tlscacerts && \
        mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/msp/tlscacerts && \
        mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/msp/tlscacerts && \
        mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/msp/tlscacerts
        
      • 将tls下的tls文件移过去 不然启动不了

      • cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/tls/tlscacerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/msp/tlscacerts/tlsca.pem && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/tls/tlscacerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/msp/tlscacerts/tlsca.pem && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/tls/tlscacerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/msp/tlscacerts/tlsca.pem && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/tls/tlscacerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/msp/tlscacerts/tlsca.pem && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/tls/tlscacerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/msp/tlscacerts/tlsca.pem
        
      • 组织下的msp文件创建tlscacert文件,并且复制,用于编写configtx.yaml

      • mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/tlscacerts  && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/msp/tlscacerts/tlsca.pem ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/tlscacerts/
        
      • 复制config.yaml

      • cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/config.yaml ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/msp/ && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/config.yaml ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/msp/ && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/config.yaml ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/msp/ && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/config.yaml ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/msp/ && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/msp/config.yaml ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/msp/
        
  • 获取admin用户的msp信息:

  • fabric-ca-client enroll -d -u https://Admin@${DOMAIN}:adminpw@0.0.0.0:4053 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/users/Admin@${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/ca/ca.crt
    
    • 修改admin用户的证书文件名称:,非必要

      • mv ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/users/Admin@${DOMAIN}/msp/signcerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/ordererOrganizations/${DOMAIN}/users/Admin@${DOMAIN}/msp/signcerts/Admin@${DOMAIN}-cert.pem
        

启动组织的ca服务器

  • prepare:

    • mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/{ca,tlsca,peers,users}
      
  • 启动组织的ca服务器

    • Yaml:

      • version: '2'
        
        networks:
          ca:
        services:
          org.ca:
            container_name: org.ca.${DOMAIN}
            image: hyperledger/fabric-ca:1.4.4
            command: sh -c 'fabric-ca-server start -d -b admin:adminpw'
            environment:
              - FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca
              - FABRIC_CA_SERVER_TLS_ENABLED=true
              - FABRIC_CA_SERVER_CSR_CN=ca-demo
              - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
              - FABRIC_CA_SERVER_DEBUG=true
            volumes:
              - ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/org-ca:/tmp/hyperledger/fabric-ca
            ports:
              - 4054:7054
            networks:
              ca:
        
  • 将ca服务器的根证书 和 tls服务器的根证书移动到组织下

    • cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/org-ca/ca-cert.pem ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/ca/ && \
      cp  ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/caOrganizations/tls-ca/ca-cert.pem ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/tlsca/
      
  • 登记admin用户并且重新命名一些文件:

    • fabric-ca-client enroll -d -u https://admin:adminpw@0.0.0.0:4054 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/ca/ca-cert.pem && \
      cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp/cacerts/*.pem ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp/ca.crt && \
      cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp/signcerts/*.pem ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp/server.crt && \
      cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp/keystore/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp/server.key
      
      
  • 注册节点和相关用户

    • fabric-ca-client register -d --id.name peer1.${DOMAIN} --id.secret peer1pw --id.type peer --id.attrs '"hf.Registrar.Roles=peer"' -u https://0.0.0.0:4054 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/ca/ca-cert.pem && \
      fabric-ca-client register -d --id.name peer2.${DOMAIN} --id.secret peer2pw --id.type peer --id.attrs '"hf.Registrar.Roles=peer"' -u https://0.0.0.0:4054 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/ca/ca-cert.pem && \
      fabric-ca-client register -d --id.name Admin@${DOMAIN} --id.secret adminpw --id.type admin --id.attrs '"hf.Registrar.Roles=admin"' -u https://0.0.0.0:4054 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/ca/ca-cert.pem && \
      fabric-ca-client register -d --id.name User0@${DOMAIN} --id.secret user0pw --id.type client -u https://0.0.0.0:4054 --id.attrs '"hf.Registrar.Roles=client"' -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/ca/ca-cert.pem
      
  • 登记msp证书

    • 创建文件夹

      • mkdir -p ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/{peer1.${DOMAIN},peer2.${DOMAIN}}
        
        
    • 登记msp证书

      • fabric-ca-client enroll -d -u https://peer1.${DOMAIN}:peer1pw@0.0.0.0:4054 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/ca/ca-cert.pem && \
        fabric-ca-client enroll -d -u https://peer2.${DOMAIN}:peer2pw@0.0.0.0:4054 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/ca/ca-cert.pem
        fabric-ca-client enroll -d -u https://Admin@${DOMAIN}:adminpw@0.0.0.0:4054 -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/users/Admin@${DOMAIN}/msp --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/ca/ca-cert.pem
        
      • 复制config.yaml到各个节点下

      • echo  \
         'NodeOUs:
             Enable: true
             ClientOUIdentifier:
               Certificate: cacerts/0-0-0-0-4054.pem
               OrganizationalUnitIdentifier: client
             PeerOUIdentifier:
               Certificate: cacerts/0-0-0-0-4054.pem
               OrganizationalUnitIdentifier: peer
             AdminOUIdentifier:
               Certificate: cacerts/0-0-0-0-4054.pem
               OrganizationalUnitIdentifier: admin
             OrdererOUIdentifier:
               Certificate: cacerts/0-0-0-0-4054.pem
               OrganizationalUnitIdentifier: orderer ' > ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp/config.yaml
        
      • 复制config.yaml到各个节点和用户下:

      • cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp/config.yaml ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/msp && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp/config.yaml ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/msp && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/msp/config.yaml ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/users/Admin@${DOMAIN}/msp
        
      • admin用户下的证书签名需要将其修改名字为 用户@域名-cert.pem形式,sdk注册的形式需要当与sdk的yaml配置也有关系

      • mv ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/users/Admin@${DOMAIN}/msp/signcerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/users/Admin@${DOMAIN}/msp/signcerts/Admin@${DOMAIN}-cert.pem
        
    • 登记tls证书

      • fabric-ca-client enroll -d -u https://peer1.${DOMAIN}:peer1pw@0.0.0.0:4052 --enrollment.profile tls --csr.hosts peer1.${DOMAIN} -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/tls --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/tlsca/ca-cert.pem && \
        fabric-ca-client enroll -d -u https://peer2.${DOMAIN}:peer2pw@0.0.0.0:4052 --enrollment.profile tls --csr.hosts peer2.${DOMAIN} -M ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/tls --tls.certfiles ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/tlsca/ca-cert.pem
        
      • 修改tls证书名和密钥

      • cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/tls/tlscacerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/tls/ca.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/tls/signcerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/tls/server.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/tls/keystore/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/tls/server.key && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/tls/tlscacerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/tls/ca.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/tls/signcerts/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/tls/server.crt && \
        cp ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/tls/keystore/* ${GOPATH}/src/${DIRECTORY_NAME}/crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/tls/server.key
        

编写configtx.yaml


---
Organizations:
    - &OrdererOrg
        Name: OrdererMSP
        ID: OrdererMSP
        MSPDir: crypto-config/ordererOrganizations/demo.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('OrdererMSP.member')"
            Writers:
                Type: Signature
                Rule: "OR('OrdererMSP.member')"
            Admins:
                Type: Signature
                Rule: "OR('OrdererMSP.admin')"
    - &Org0
        Name: Org0MSP
        ID: Org0MSP
        MSPDir: crypto-config/peerOrganizations/demo.com/msp
        Policies:
            Readers:
                Type: Signature
                Rule: "OR('Org0MSP.admin', 'Org0MSP.peer', 'Org0MSP.client')"
            Writers:
                Type: Signature
                Rule: "OR('Org0MSP.admin', 'Org0MSP.client')"
            Admins:
                Type: Signature
                Rule: "OR('Org0MSP.admin')"
        AnchorPeers:
            - Host: peer1.demo.com
              Port: 11051

Capabilities:
    Channel: &ChannelCapabilities
        V1_4_3: true
        V1_3: false
        V1_1: false

    Orderer: &OrdererCapabilities
        V1_4_2: true
        V1_1: false

    Application: &ApplicationCapabilities
        V1_4_2: true
        V1_3: false
        V1_2: false
        V1_1: false

Application: &ApplicationDefaults

    Organizations:

    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"

    Capabilities:
        <<: *ApplicationCapabilities
Orderer: &OrdererDefaults

    OrdererType: solo

    Addresses:
        - orderer0.demo.com:5050

    BatchTimeout: 2s

    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB
    Organizations:
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
        BlockValidation:
            Type: ImplicitMeta
            Rule: "ANY Writers"

Channel: &ChannelDefaults
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
    Capabilities:
        <<: *ChannelCapabilities

Profiles:
    SoloOrdererGenesis:
        <<: *ChannelDefaults
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org0
    DemoChannel:
        Consortium: SampleConsortium
        <<: *ChannelDefaults
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org0
            Capabilities:
                <<: *ApplicationCapabilities
    OrdererSoloGenesis:
        <<: *ChannelDefaults
        Capabilities:
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            OrdererType: solo
            Addresses:
                - orderer0.demo.com:5050
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - <<: *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org0
    OrdererRaftGenesis:
        <<: *ChannelDefaults
        Capabilities:
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            OrdererType: etcdraft
            EtcdRaft:
                Consenters:
                    - Host: orderer0.demo.com
                      Port: 5050
                      ClientTLSCert: crypto-config/ordererOrganizations/demo.com/orderers/orderer0.demo.com/tls/server.crt
                      ServerTLSCert: crypto-config/ordererOrganizations/demo.com/orderers/orderer0.demo.com/tls/server.crt
                    - Host: orderer1.demo.com
                      Port: 5051
                      ClientTLSCert: crypto-config/ordererOrganizations/demo.com/orderers/orderer1.demo.com/tls/server.crt
                      ServerTLSCert: crypto-config/ordererOrganizations/demo.com/orderers/orderer1.demo.com/tls/server.crt
                    - Host: orderer2.demo.com
                      Port: 5052
                      ClientTLSCert: crypto-config/ordererOrganizations/demo.com/orderers/orderer2.demo.com/tls/server.crt
                      ServerTLSCert: crypto-config/ordererOrganizations/demo.com/orderers/orderer2.demo.com/tls/server.crt
                    - Host: orderer3.demo.com
                      Port: 5053
                      ClientTLSCert: crypto-config/ordererOrganizations/demo.com/orderers/orderer3.demo.com/tls/server.crt
                      ServerTLSCert: crypto-config/ordererOrganizations/demo.com/orderers/orderer3.demo.com/tls/server.crt
                    - Host: orderer4.demo.com
                      Port: 5054
                      ClientTLSCert: crypto-config/ordererOrganizations/demo.com/orderers/orderer4.demo.com/tls/server.crt
                      ServerTLSCert: crypto-config/ordererOrganizations/demo.com/orderers/orderer4.demo.com/tls/server.crt
            Addresses:
                - orderer0.demo.com:5050
                - orderer1.demo.com:5051
                - orderer2.demo.com:5052
                - orderer3.demo.com:5053
                - orderer4.demo.com:5054
            Organizations:
                - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - <<: *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org0

  • 生成相关配置文件:

    • #!/usr/bin/env bash
      if [[ ! -d "artifacts" ]]; then
        mkdir artifacts
      else
         rm -rf artifacts/*
      fi
      export FABRIC_CFG_PATH=${GOPATH}/src/${DIRECTORY_NAME}
      if [[ $? -ne 0 ]]; then
          echo "生成证书失败"
          exit -1
      fi
      echo "solo 创世快"
      configtxgen  --profile OrdererSoloGenesis -channelID sysdemochannel -outputBlock ./artifacts/orderer.solo.genesis.block
      echo "初始化创世块"
      configtxgen  --profile OrdererRaftGenesis -channelID sysdemochannel -outputBlock ./artifacts/orderer.genesis.block
      echo "生成channel的配置信息"
      configtxgen  --profile DemoChannel  -outputCreateChannelTx ./artifacts/demochannel.tx -channelID demochannel
      echo "生成组织1的锚节点信息"
      configtxgen  --profile DemoChannel -outputAnchorPeersUpdate ./artifacts/demomspanchors.tx -channelID demochannel -asOrg Org0MSP
      

启动整个网络

  • orderer:

    • 注意: order 需要在添加 extra_hosts 映射,因为默认端口是7050,而我们并没有重新配置5050,并且在confitx.yaml指定的端口也不是5050,所以自己需要额外指定hosts

    • version: '2'
      
      networks:
        vlink:
      services:
        orderer0:
          container_name: orderer0.${DOMAIN}
          extends:
            file: ../base/peer-base.yaml
            service: orderer-base
          ports:
            - "5050:7050"
          volumes:
            - ../../artifacts:/var/hyperledger/configtx
            - ../../artifacts/orderer.genesis.block:/var/hyperledger/orderer/orderer.genesis.block
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/msp:/var/hyperledger/orderer/msp
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer0.${DOMAIN}/tls:/var/hyperledger/orderer/tls
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/tlsca:/var/hyperledger/tlsca
      #      - /tmp/hyperledger/production/orderer0:/var/hyperledger/production
          networks:
            vlink:
      
        orderer1:
          container_name: orderer1.${DOMAIN}
          extends:
            file: ../base/peer-base.yaml
            service: orderer-base
          ports:
            - "5051:7050"
          volumes:
            - ../../artifacts:/var/hyperledger/configtx
            - ../../artifacts/orderer.genesis.block:/var/hyperledger/orderer/orderer.genesis.block
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/msp:/var/hyperledger/orderer/msp
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer1.${DOMAIN}/tls:/var/hyperledger/orderer/tls
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/tlsca:/var/hyperledger/tlsca
      #      - /tmp/hyperledger/production/orderer1:/var/hyperledger/production
          networks:
            vlink:
      
        orderer2:
          container_name: orderer2.${DOMAIN}
          extends:
            file: ../base/peer-base.yaml
            service: orderer-base
          ports:
            - "5052:7050"
          volumes:
            - ../../artifacts:/var/hyperledger/configtx
            - ../../artifacts/orderer.genesis.block:/var/hyperledger/orderer/orderer.genesis.block
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/msp:/var/hyperledger/orderer/msp
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer2.${DOMAIN}/tls:/var/hyperledger/orderer/tls
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/tlsca:/var/hyperledger/tlsca
      #      - /tmp/hyperledger/production/orderer2:/var/hyperledger/production
          networks:
            vlink:
        orderer3:
          container_name: orderer3.${DOMAIN}
          extends:
            file: ../base/peer-base.yaml
            service: orderer-base
          ports:
            - "5053:7050"
          volumes:
            - ../../artifacts:/var/hyperledger/configtx
            - ../../artifacts/orderer.genesis.block:/var/hyperledger/orderer/orderer.genesis.block
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/msp:/var/hyperledger/orderer/msp
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer3.${DOMAIN}/tls:/var/hyperledger/orderer/tls
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/tlsca:/var/hyperledger/tlsca
      #      - /tmp/hyperledger/production/orderer3:/var/hyperledger/production
          networks:
            vlink:
        orderer4:
          container_name: orderer4.${DOMAIN}
          extends:
            file: ../base/peer-base.yaml
            service: orderer-base
          ports:
            - "5054:7050"
          volumes:
            - ../../artifacts:/var/hyperledger/configtx
            - ../../artifacts/orderer.genesis.block:/var/hyperledger/orderer/orderer.genesis.block
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/msp:/var/hyperledger/orderer/msp
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/orderers/orderer4.${DOMAIN}/tls:/var/hyperledger/orderer/tls
            - ../../crypto-config/ordererOrganizations/${DOMAIN}/tlsca:/var/hyperledger/tlsca
      #      - /tmp/hyperledger/production/orderer4:/var/hyperledger/production
          networks:
            vlink:
      
      
      
  • Peer:

    • version: '2'
      networks:
        vlink:
      services:
        peer1:
          container_name: peer1.${DOMAIN}
          extends:
            file: ../base/peer-base.yaml
            service: peer-base
          environment:
            - CORE_PEER_ID=peer1.${DOMAIN}
            - CORE_PEER_ADDRESS=peer1.${DOMAIN}:11051
            - CORE_PEER_LISTENADDRESS=0.0.0.0:11051
            - CORE_PEER_CHAINCODEADDRESS=peer1.${DOMAIN}:11052
            - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:11052
            - CORE_PEER_GOSSIP_BOOTSTRAP=peer2.${DOMAIN}:11061
            - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.${DOMAIN}:11051
            - CORE_PEER_LOCALMSPID=VlinkOrgMSP
          ports:
            - "11051:11051"
            - "11052:11052"
          volumes:
            - /var/run/:/host/var/run/
            - ../../crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/msp:/etc/hyperledger/fabric/msp
            - ../../crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/tls:/etc/hyperledger/fabric/tls
          #      - /tmp/hyperledger/production/peer0:/var/hyperledger/production
          networks:
            vlink:
        peer2:
          container_name: peer2.${DOMAIN}
          extends:
            file: ../base/peer-base.yaml
            service: peer-base
          environment:
            - CORE_PEER_ID=peer2.${DOMAIN}
            - CORE_PEER_ADDRESS=peer2.${DOMAIN}:11061
            - CORE_PEER_LISTENADDRESS=0.0.0.0:11061
            - CORE_PEER_CHAINCODEADDRESS=peer2.${DOMAIN}:11062
            - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:11062
            - CORE_PEER_GOSSIP_BOOTSTRAP=peer2.${DOMAIN}:11051
            - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer2.${DOMAIN}:11061
            - CORE_PEER_LOCALMSPID=VlinkOrgMSP
          ports:
            - "11061:11061"
            - "11062:11062"
          volumes:
            - /var/run/:/host/var/run/
            - ../../crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/msp:/etc/hyperledger/fabric/msp
            - ../../crypto-config/peerOrganizations/${DOMAIN}/peers/peer2.${DOMAIN}/tls:/etc/hyperledger/fabric/tls
          #      - /tmp/hyperledger/production/peer1:/var/hyperledger/production
          networks:
            vlink:
      
      
      
        cli:
          container_name: cli
          image: hyperledger/fabric-tools:1.4.4
          tty: true
          stdin_open: true
          environment:
            - SYS_CHANNEL=sysdemochannel
            - GOPATH=/opt/gopath
            - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
            #- FABRIC_LOGGING_SPEC=DEBUG
            - FABRIC_LOGGING_SPEC=INFO
            - CORE_PEER_ID=cli
            - CORE_PEER_ADDRESS=peer1.${DOMAIN}:11051
            - CORE_PEER_LOCALMSPID=Org0MSP
            - CORE_PEER_TLS_ENABLED=true
            - CORE_PEER_TLS_CERT_FILE=/var/hyperledger/fabric/tls/server.crt
            - CORE_PEER_TLS_KEY_FILE=/var/hyperledger/fabric/tls/server.key
            - CORE_PEER_TLS_ROOTCERT_FILE=/var/hyperledger/fabric/tls/ca.crt
            - CORE_PEER_MSPCONFIGPATH=/var/hyperledger/fabric/msp
          working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
          command: /bin/bash
          volumes:
            - /var/run/:/host/var/run/
            - ../../../v2/vlink-chaincodes:/opt/gopath/src/github.com/hyperledger/fabric/chaincode
            - ../../crypto-config/peerOrganizations/${DOMAIN}/peers/peer1.${DOMAIN}/tls:/var/hyperledger/fabric/tls
            - ../../crypto-config/peerOrganizations/${DOMAIN}/users/peer1.${DOMAIN}/msp:/var/hyperledger/fabric/msp
            - ../../crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
            - ../../artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/artifacts
          networks:
            vlink:
          extra_hosts:
            - "orderer0.demo.com:172.224.2.2"
            - "orderer1.demo.com:172.224.2.2"
            - "orderer2.demo.com:172.224.2.2"
            - "orderer3.demo.com:172.224.2.2"
            - "orderer4.demo.com:172.224.2.2"
      

命令行的形式部署

  • docker exec -it cli /bin/bash
    
    
    export DOMAIN=demo.com && \
    export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/demo.com/users/Admin@demo.com/msp && \
    peer channel create -o orderer0.${DOMAIN}:5050 -c demochannel -f ../peer/artifacts/demochannel.tx --tls true --cafile /var/hyperledger/fabric/tls/ca.crt && \
    sleep 10 && \
    peer channel join -b ${PWD}/demochannel.block && \
    peer chaincode install -n democc -v 1.0 -p github.com/hyperledger/fabric/chaincode/ && \
    peer chaincode instantiate -C demochannel -n democc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -o orderer0.${DOMAIN}:5050 --tls  --cafile /var/hyperledger/fabric/tls/ca.crt && \
    peer chaincode invoke -C demochannel -n democc -c '{"Args":["invoke","a","b","10"]}' --tls --cafile /var/hyperledger/fabric/tls/ca.crt
    
    
    

SDK的形式部署

  • 详情请看github连接

遇到的问题

  • joinchannel的是时候提示:
    • Error: proposal failed (err: rpc error: code = Unknown desc = access denied: channel [] creator org [Org0MSP])
    • 解决方法: 在docker文件中 msp错误
  • endorsement failure during invoke. response: status:500 message:"make sure the chaincode democc has been successfully instantiated and try again: chaincode democc not found
    • 安装了却报错,原因在于缓存
    • 解决方法:
        1. docker images 删除之前的缓存即可
        2. 如果是raft模式,create channel 之后要等待一定时间,等待raft选举完毕

问题

  • order和 ledger的关系

Channel

  • channel: 不同的公司有不同的业务,因此需要创建多种channel

  • channel是多个成员之间,以机密交易为目的而建立的私网

  • 每个channel都要维护自己的账本,账本和账本之间都是隔离的(通过peer维护)

  • 一个channel 可以部署多个cc,不同的cc可以进行互相调用

  • 不同的channel之间也可以互相调用,不同的channel之间可以读数据,但是暂时不可以写数据


Fabric Peer

  • 区块链网络 由一系列peer节点组成

  • peer是整个区块链网络的基础

    • 是账本和智能合约的基础(载体)
  • 一个peer可以连接多个channel,(channel:不同公司有不同业务,因而需要创建多种联盟链(channel))

  • peer上可以安装多种智能合约,同时当事件完成时会发送事件给client端

  • peer的分类:

    • Endorser节点(背书节点):
    • Commit节点(记账节点):
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmNBJBxC-1572951195863)(/Users/joker/Desktop/个人/区块链/架构设计参考/交易流程.png)]:

      1. (Endorser节点) 当Endorser节点收到交易请求之后
      2. (Endorser节点) Endorser节点会先模拟交易请求(但并不会更新worldstate)
      3. (Endorser节点) 将结果加密返回给Client端
      4. (Client) Client端收到resp之后,会将resp submit给Order节点
      5. (Order节点) Order节点收到resp之后,打包然后发送给 commit节点(记账节点)
      6. (Commit节点) **commit节点(记账节点)**收到Order节点commit信息之后,会进行一系列的校验操纵
      7. (Commit节点) commit节点,将 transacttion commit到worldstate,更新区块链数据
      8. (Commit节点) commit节点最终通知client端,交易失败还是成功
    • commit节点如何判断一个交易是成功还是失败:
      • 通过Endorsing Policy(背书策略)
  • Endorsing Policy背书策略:

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5W1WZUPP-1572951195866)(/Users/joker/Desktop/个人/区块链/架构设计参考/交易校验流程.png)]

      • 每个cc deploy的时候,都会安装背书策略
      • Endorser节点: 当模拟执行交易完毕之后,通过ESCC对执行结果进行加密
      • Commit节点: 通过VSCC 背书策略对交易判断是否合理
    • 背书策略的指定:(cc实例化的时候指定)

      • peer chaincode instantiate  
        -C mychannel (指定channel的名字)
        -n mycc (指定cc的名字)
        -v 1.0 (指定版本信息)
        -p chaincode_example002
        -c '{"Args":["init":1]}' (指定初始化数据的内容)
        -P "AND('Org1MSP.member')" (指定背书策略)
        

Fabric Ledger:

  • 有序的,不可修改的,历史交易记录
  • 有2部分组成:
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYnCxbbf-1572951195867)(/Users/joker/Desktop/个人/区块链/架构设计参考/账本组成-区块.png)]
    • 区块:
      • 保存了区块配置信息
    • WorldState: 维护账本的当前状态,方便Application快速查询
区块的组成:
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-syox1UVs-1572951195868)(/Users/joker/Desktop/个人/区块链/架构设计参考/区块结构.png)]

  • 区块头部:

    • 区块Number:
    • 当前区块Hash: 对当前区块中的所有tx进行加密然后处理得到的数据
    • 上一个区块的Hash
  • 区块数据:包含交易信息

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xvdM0vgz-1572951195869)(/Users/joker/Desktop/个人/区块链/架构设计参考/交易-数据结构.png)]
    • Header里面包含了:
      • cc的名字
      • version:版本
      • …
    • 签名: client用户的签名
    • proposal: client端给endorser节点发送的proposal,主要为input的参数
    • Response: 执行结果前的数据和执行结果后的数据
    • Endorsements: 每个背书节点返回的结果集,(如若背书策略中指定3个org,则这里存了3个endorsements)
  • 区块元数据:

    • 区块写入的时间
    • 区块写入的人
    • 区块写入的签名等
WorldState
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A29rjtGd-1572951195871)(/Users/joker/Desktop/个人/区块链/架构设计参考/WorldState数据结构.png)]

  • 当Query的时候,直接从WorldState中去获取数据,当被修改一次之后,version就会被增加


智能合约

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-usvU8mpa-1572951195873)(/Users/joker/Desktop/个人/区块链/架构设计参考/智能合约.png)]

  • 定义各个不同的organization之间的业务规则

  • 智能合约就是来创建transaction

ChainCode

  • 当智能合约编写完毕,则需要打包成ChainCode
  • 一个ChainCode包含多种智能合约

智能合约与账本的交互

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jlveOwjH-1572951195874)(/Users/joker/Desktop/个人/区块链/架构设计参考/智能合约与账本的交互.png)]

  • 智能合约也能发送events

ChainCode的生命周期:

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6D2ZP0Z8-1572951195874)(/Users/joker/Desktop/个人/区块链/架构设计参考/cc的生命周期.png)]

  • 打包:

    • peer chaincode package -n mycc 
      -p github.com/myhyperledger/chaincode (指定path)
      -v 1.0 
      mypack.out  (打包的结果为mypack.out)
      打包完毕之后就可以对其进行签名
      peer chaincode signpackage ccpack.out signpack.out 
      
  • 安装: cc是安装在peer节点上的,一个peer节点可以安装多个cc

    • 注意,cc必须安装在所有的endorser节点上

    • peer chaincode install signpack.out
      
  • 实例化:

    • 注意:

      • 要setup 背书策略
    • peer chaincode instantiate -n mycc -v 1.0 -c '"Args":1' -P "AND('Orga.menber','Orgb.menber')"
      
  • 运行:

    • peer chaincode query 
      -C mychannel (指定channel名称)
      -n mycc (cc的名字)
      -c 参数
      
  • 更新:

    • 注意:

      • 可以在任意时间都进行更新
      • 更新之前,必须将最新的版本install到所有的背书节点上
      • 多条channel与实例化的时候相同,只能一条一条来
    • peer chaincode upgrade -C mychannel -n mycc -v 2.0 -c 参数
      
系统链码(System Chaincode)
  • LSCC(Life Cycle system chaincode):
    • 专门处理cc的 lifecycle(打包,安装,升级等)
  • CSCC(Configuration System ChainCode)
    • 处理channel的配置信息
  • QSCC(Query System Chaincode)
    • 提供了账本相关的api

Gossip 协议

  • 存在的起源: 为了优化网络性能,提高安全性,分为endorser节点,order节点和commit节点,每个tx在每种节点上用处不同,该网络解耦方式需要一种安全的协议

  • 定义:

  • 在gossipe 中,根据不同的功能,peer可以分为

    • leader peer
    • anchor peer

Leader peer

  • 当有新的交易产生,连接order节点,拉取新的区块

  • 将tx 发送给commit peer

  • 选举方式:

    • 静态指定

      • 配置文件:
        peer: 
        	gossip: useLeaderElection: false
        	orgLeader: true
        将当前节点设置为leader节点
        
    • 动态选取

      • 通过发送心跳包

      • 配置文件
        peer: 
        	useLeaderElection: true
        	orgLeader: false
        	election:
        		leaderAliveThreshold: 10s
        
Anchor peer
  • 通过gossip 协议,使得不同的组织互相可知
私有数据 Private Data
  • !]外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传]()

    1. proposal到来
    2. endorser节点模拟执行
    3. private data存储到临时的数据库中
    4. 通过gossip协议,将数据传输到有权限的peer节点,当 达到一定数量之后,返回给client端, 这时候不会返回private data,只会是hash值,所以order节点看不到private data信息
    5. 当order 节点将信息发送给commit节点之后,commit节点除了validate还会校验private data的hash和临时数据库里的private data比较,最终将private data 从临时数据库中存储到真实的数据库中
    {
    	"name":"ss",
    	"policy":"AND('Orga.menber')",
    	"requirePeerCount":2,  	// 当private data已经传播给其他的peer节点了,只有当至少传播给2个节点之后,endorser
    	// 才可以返回给client,既上面的达到一定数量
    	"maxPeerCount":3,
    	"blockToLive":1000000,
    	"memberOnlyRead":true
    
    
    }
    
    
Hyperledger Fabric 部署在多个主机上 前言 在实验Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、TLS组织运行维护Orderer服务中,我们已经完成了使用提供 TLS-CA 服务的 council 组织运行维护 Raft 协议的三个 orderer 节点。但目前我们都是在单个主机上启动 Fabric 网络,本文将尝试将 Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、TLS组织运行维护Orderer服务 中的网络结构部署在多个主机上。 工作准备 本文工作 将 Hy 阅读详情

相关推荐

SAP-PM设备模块-PM主数据之功能位置

SAP-PM模块学习

TRUIXIANG的博客 5138

HyperLedger FabricV2.3 Raft单机集群部署

目录 云主机配置 依赖环境配置 部署步骤 0.更新yum 1.安装golang 2.安装docker 3.安装docker-compose 4.安装git 5.安装java 6.防火墙配置 7.网络配置 fabric资源规划 0.修改hosts文件 1.部署节点端口分配 2.官方测试网络demo测试 创建工作目录 3.fabricraft集群环境搭建 3.1编写配置文件 3.2生成证书以及通道信息 3.3编写docker-compose.yaml...

qq_36807862的博客 1523

使用 Python+PaddleOCR 实现图文识别:从入门到精通

在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等。PaddleOCR 是百度开源的一款强大的 OCR 工具包,它集成了多种先进的算法和模型,能够高效准确地进行图文识别。本文将详细介绍如何使用 PaddleOCR 和 Python 实现图文识别,并给出具体的代码和步骤。

爱搬砖的程序猿 5475

Fabric Raft网络环境搭建

1. Raft排序服务介绍 在fabric1.4.1的版本中,提供了基于raft共识的raft排序服务。raft的模型可以容忍奔溃,如果有节点故障掉线可以正常运行。前提是要有大多数存活,也就是要保证1/2以上的节点个数正常运行。raft共识是“主从模型”,主节点通过动态选举决定,从节点是主节点的复制。raft排序服务比kafka排序服务易于设置和管理。并且raft的设计允许不同的组织贡献节点来共...

zhanlanzhilian的博客 902

华为手机连接Win11失败?内核隔离与驱动签名冲突的终极解决指南

在Windows操作系统中,驱动程序是硬件与系统通信的桥梁,其数字签名机制是保障系统内核安全的核心防线。基于虚拟化的安全技术通过强制验证驱动签名,能有效隔离恶意代码,提升系统抵御高级威胁的能力。然而,严格的签名策略有时会与部分硬件驱动产生兼容性问题,导致设备无法识别,直接影响文件传输、应用调试等核心工作流。本文聚焦于华为手机在开启Windows 11内核隔离功能时出现的连接故障,深入剖析驱动签名验证与Hypervisor保护的代码完整性原理,并提供从驱动更新、策略调整到无线替代方案的完整解决路径,帮助用户在

weixin_31309419的博客 354

磁栅尺的基本原理

一、磁栅尺简介 磁栅尺(Magnetic scale)是一种常见于工业自动化设备领域的线性位移测量方案,因为其耐用性强,对环境要求不高,逐渐替代了对环境要求苛刻的光学直线测量方案。 作为自动化设备领域里不多见的精密位移检测方案,磁栅尺使用广泛,尤其适用于检测行程长、测量精度要求高、工况复杂的大型机床。磁栅尺安装方便,抗干扰能力强,抗冲击性强,不易受到振动、粉尘、水垢、油污等影响,耐高温和耐低温性能也较为突出。 二、磁栅尺基本组成与原理 磁栅尺主要由两个部分组成,磁尺和读磁头。 磁尺 磁尺是磁栅尺

Luckboy_shy的博客 1万+

2022-03-01 快速搭建raft集群

目录 摘要: raft测试代码: raft-grpc-example: raftadmin: 快速组建raft集群: 一. 生成需要的文件目录 二. 分别启动一个bootstrap节点和两个常规节点 三. 给bootstrap节点增加follow节点 摘要: 简单测试raft, 给出快速测试例子的方式 raft测试代码: raft-grpc-example: https://github.com/Jille/raft-grpc-example raftad

悟世之路 1447

C# MVVM的“核武器”:CommunityToolkit.Mvvm的RelayCommand实战全解

你默默打开VS:“该用RelayCommand的‘量子纠缠’魔法了!用户点击按钮无响应,调试器显示命令未绑定,但代码看起来完美无缺。“我的MVVM应用?那可是能穿越线程的命令量子计算机!异步操作阻塞了UI线程,用户界面变成“加载中”死循环。:UI与业务逻辑通过命令“量子隧道”解耦。:所有长时间操作自动进入“量子跃迁”模式。:携带任意上下文的“量子信封”传递。:命令可用性随数据变化实时同步。

java专栏 663

fabric1.4.1raft网络搭建

基于Raft共识算法搭建多机Fabric1.4.1网络环境 fabric官方继fabric1.4LTS版本之后,又推出了fabric1.4.1的正式补丁版本,虽然fabric1.4.1是fabric1.4后续的补丁版本,但是这一小版本更新了fabric1.4.0版本没有完成的工作,,比如Raft共识,从fabric0.6版本开始,共识推出过BFT算法,用于实现拜占庭容错,但由于性能原因在后续版本...

fbbqt的博客 2268

ShowDoc item_id 未授权SQL注入漏洞复现

2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前置条件,易于利用,且默认情况下可暴破用户token获取系统后台权限,建议所有使用该系统的企业尽快升级修复,以确保系统安全。

0xSec 2358

SystemVerilog从入门到实战

SystemVerilog复合数据类型概述 SystemVerilog增强了Verilog的数据建模能力,提供多种复合数据类型: 数组类型:包括定宽数组(固定大小)、动态数组(运行时分配)和多维数组,支持高效索引访问。 队列:结合数组和链表特性,支持两端快速插入/删除操作,提供push/pop等方法。 关联数组:键值对存储结构,支持稀疏数据存储和快速查找,提供exists/delete等方法。 结构体:组合不同类型数据成员,支持打包(packed)形式以优化存储空间。 枚举类型:为数值赋予语义名称,支持状态

2301_79143213的博客 1227

区块链——Hyperledger Fabric2.2多机搭建及区块链浏览器(修改版)

参考(内容有错误,已修改): 区块链——Hyperledger Fabric2.2多机搭建及区块链浏览器前提: order---10.10.10.65,org1---10.10.10.64,org2---10.10.10.53三台服务器都要设置vim /etc/hosts 3、安装golang环境 二、生成Fabric证书(order上执行) 克隆项目fabric和fabric-samples git clone https://gitee.com/hyperledger/fabric.git

qq_43197915的博客 2779

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Hyperledger Fabric部署运维实战:从环境准备到故障排查全解析

在分布式系统领域,区块链技术通过共识机制、密码学和分布式账本构建了去中心化的信任网络。其核心原理在于多个节点协同维护一个不可篡改的数据链,实现了数据的确权与透明流转。这项技术的工程价值在于为金融、供应链、政务等场景提供了安全可信的协作基础。在实际应用中,企业级区块链平台Hyperledger Fabric的部署与运维是技术落地的关键环节,涉及复杂的网络配置、证书管理和容器化部署。本文聚焦于**系统部署**与**运维排错**两大实战维度,深入剖析在受限环境下的节点启动、通道创建、链码生命周期管理以及典型故障的

weixin_30596165的博客 322

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Fabric CA 官方用户指南

一、Fabric CA概述图1.1 fabric-ca架构图Fabric Server端由一个服务器集群组成,以树形架构组织CA Server节点,包含一个Root 节点和多个中间节点。每个CA要么是根CA,要么是中间CA。每个中间CA都有一个父CA,它要么是根CA,要么是另一个中间CA。可以通过Client或SDK与服务器集群中的CA服务器进行交互。客户端首先路由到HA代理,由代理进行负载均衡,...

Mac_cm的专栏 4188

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Hyperledger Fabric2.4 使用二进制文件多机部署

前面我们的区块链网络是使用docker启动,但是生产环境不建议使用docker部署。生产环境应该多服务器部署,这里使用Hyperledger Fabric二进制文件部署了由多台服务器组成的Fabric网络。

qq_28052455的博客 1772

Hyperledger Fabric 2.2.5_CA方式_搭建生产网络

CA服务器搭建Fabric生产网络

屋卢狸卡 804

Hyperledger Fabric CA 使用教程

Hyperledger Fabric CA 使用教程 项目介绍 Hyperledger Fabric CA 是 Hyperledger Fabric 项目的证书颁发机构(CA)。它主要用于身份注册、证书颁发、证书更新和撤销等功能。Fabric CA 包含服务器和客户端组件,支持与 LDAP 集成,适用于需要安全身份管理的区块链网络。 项目快速启动 安装 首先,克隆项目仓库: git clone h...

gitblog_00160的博客 569

Hyperledger Fabric 2.2.1 多机部署教程

Fabric 多机部署教程

qq_62778805的博客 1015

html基础教程

html基础教程

bat_and_vbs的博客 692

Hyperledger Fabric Docker 方式多机部署生产网络

用。

y19910825的博客 1220

Fabric-CA 架构及安装

一、Fabric-CA架构 官方手册给的图示 根据自己理解整理的图示 总结: Hyperledger Fabric CA由服务端和客户端组件组成 Fabric CA Server服务端由一个树形结构的服务器集群组成,有一个ROOT节点(Root Server)和诺干个不同层级的中间节点(Intermediate Server)组成,如节点A,B是同级关系,它的上级为ROOT节点,而节点C,D的上级是节点B,因此中间CA节点上级可以是ROOT节点,也可以是其它中间节点。 与

水上铁的专栏 1311

Fabric CA

参考 1.fabric-ca安装 2.Fabric-CA 架构及安装 3.Fabric-Ca使用 4.Fabric CA的部署与使用 5.HyperLedger Fabric中Fabric-CA的使用 6.Fabric CA源码和镜像编译 sudo gedit /etc/profile 7.Fabric-CA 架构及安装 8.Fabric CA的部署与使用 【GO】详解GOROOT和GOPATH go语言的工作空间和GOPATH环境变量 待学习 Go Modules 终极入门 HyperLedger Fab

qq_22016915的博客 2675

HyperLedger Fabric2.2环境搭建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

sama_AA的博客 1047

基于raft共识搭建的Fabric1.4网络环境

基于Raft共识搭建多机Fabric1.4网络环境 ​ 由于近期fabric官方继fabric1.4LTS版本之后,又推出了fabric1.4.1的正式补丁版本,虽然fabric1.4.1是fabric1.4后续的补丁版本,但是这一小版本更新了fabric1.4.0版本没有完成的工作,,比如就本文当药介绍的Raft共识,从fabric0.6版本开始,共识推出过BFT算法,用于实现拜...

weixin_44542127的博客 5466

记一次Minecraft游戏服务器搭建实践经历

Minecraft简介 Minecraft是一款沙盒游戏,整个游戏没有剧情,玩家在游戏中自由建设和破坏,透过像积木一样来对元素进行组合与拼凑,轻而易举的就能制作出小木屋、城堡甚至城市,玩家可以通过自己创造的作品来体验上帝一般的感觉。在这款游戏里,不仅可以单人娱乐,还可以多人联机,玩家也可以安装一些模组来增加游戏趣味性。Minecraft几乎不包含任何目前...

weixin_34318272的博客 655
上一篇: 小技巧 && 算法 浅谈
下一篇: 环境搭建
Coder_Joker
博客等级 码龄8年 39粉丝 67原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值