热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【链块技术57期】超级账本Fabric教程(四):使用docker编译fabric源码(下)

【链块技术57期】超级账本Fabric教程(四):使用docker编译fabric源码(下),Go语言社区,Golang程序员人脉社

原文链接:超级账本Fabric教程(四):使用docker编译fabric源码(中);超级账本Fabric教程(四):使用docker编译fabric源码(下)

本文继续介绍如何在docker镜像中编译fabric源码,方便修改代码后快速测试。

7.2 生成交易配置

在主机的工程目录my-basic-network下新建configtx.yaml,具体内容如下:

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
 
---
################################################################################
#
#   Profile
#
#   - Different configuration profiles may be encoded here to be specified
#   as parameters to the configtxgen tool
#
################################################################################
Profiles:
 
    OneOrgOrdererGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
    OneOrgChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
 
################################################################################
#
#   Section: Organizations
#
#   - This section defines the different organizational identities which will
#   be referenced later in the configuration.
#
################################################################################
Organizations:
 
    # SampleOrg defines an MSP using the sampleconfig.  It should never be used
    # in production but may be used as a template for other definitions
    - &OrdererOrg
        # DefaultOrg defines the organization which is used in the sampleconfig
        # of the fabric.git development environment
        Name: OrdererOrg
 
        # ID to load the MSP definition as
        ID: OrdererMSP
 
        # MSPDir is the filesystem path which contains the MSP configuration
        MSPDir: crypto-config/ordererOrganizations/example.com/msp
 
    - &Org1
        # DefaultOrg defines the organization which is used in the sampleconfig
        # of the fabric.git development environment
        Name: Org1MSP
 
        # ID to load the MSP definition as
        ID: Org1MSP
 
        MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
 
        AnchorPeers:
            # AnchorPeers defines the location of peers which can be used
            # for cross org gossip communication.  Note, this value is only
            # encoded in the genesis block in the Application section context
            - Host: peer0.org1.example.com
              Port: 7051
 
################################################################################
#
#   SECTION: Orderer
#
#   - This section defines the values to encode into a config transaction or
#   genesis block for orderer related parameters
#
################################################################################
Orderer: &OrdererDefaults
 
    # Orderer Type: The orderer implementation to start
    # Available types are "solo" and "kafka"
    OrdererType: solo
 
    Addresses:
        - orderer.example.com:7050
 
    # Batch Timeout: The amount of time to wait before creating a batch
    BatchTimeout: 2s
 
    # Batch Size: Controls the number of messages batched into a block
    BatchSize:
 
        # Max Message Count: The maximum number of messages to permit in a batch
        MaxMessageCount: 10
 
        # Absolute Max Bytes: The absolute maximum number of bytes allowed for
        # the serialized messages in a batch.
        AbsoluteMaxBytes: 99 MB
 
        # Preferred Max Bytes: The preferred maximum number of bytes allowed for
        # the serialized messages in a batch. A message larger than the preferred
        # max bytes will result in a batch larger than preferred max bytes.
        PreferredMaxBytes: 512 KB
 
    Kafka:
        # Brokers: A list of Kafka brokers to which the orderer connects
        # NOTE: Use IP:port notation
        Brokers:
            - 127.0.0.1:9092
 
    # Organizations is the list of orgs which are defined as participants on
    # the orderer side of the network
    Organizations:
 
################################################################################
#
#   SECTION: Application
#
#   - This section defines the values to encode into a config transaction or
#   genesis block for application related parameters
#
################################################################################
Application: &ApplicationDefaults
 
    # Organizations is the list of orgs which are defined as participants on
    # the application side of the network
    Organizations:

使用~/go/bin/confitxgen 工具来生成交易配置:

# 创建一个配置目录
mkdir config
export FABRIC_CFG_PATH=$PWD
export CHANNEL_NAME=mychannel
# 生成创世区块
configtxgen -profile OneOrgOrdererGenesis -outputBlock ./config/genesis.block
# 生成创建通道的配置文件
configtxgen -profile OneOrgChannel -outputCreateChannelTx ./config/channel.tx -channelID $CHANNEL_NAME
# 创建锚节点配置文件
configtxgen -profile OneOrgChannel -outputAnchorPeersUpdate ./config/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP

成功执行完以上命令后会在~/my-basic-network/config目录下生成以下三个文件:

channel.tx  genesis.block  Org1MSPanchors.tx

7.3 启动orderer和peer节点

编辑一个docker-compose的配置文件

#
# Copyright IBM Corp All Rights Reserved
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'
 
networks:
  basic:
 
services:
  orderer.example.com:
    container_name: orderer.example.com
    image: yeasy/hyperledger-fabric:1.0.0
    environment:
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp/orderer/msp
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderer
    command: orderer
    ports:
      - 7050:7050
    volumes:
        - ./config/:/etc/hyperledger/configtx
        - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/:/etc/hyperledger/msp/orderer
        - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/msp/peerOrg1
    networks:
      - basic
 
  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    image: yeasy/hyperledger-fabric:1.0.0
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_PEER_ID=peer0.org1.example.com
      - CORE_LOGGING_PEER=debug
      - CORE_CHAINCODE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_MSPCOnFIGPATH=/etc/hyperledger/msp/peer/
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      # # the following setting starts chaincode containers on the same
      # # bridge network as the peers
      # # https://docs.docker.com/compose/networking/
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_basic
      #- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
      #- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb:5984
      # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
      # provide the credentials for ledger to connect to CouchDB.  The username and password must
      # match the username and password set for the associated CouchDB.
      - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
      - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: peer node start
    # command: peer node start --peer-chaincodedev=true
    ports:
      - 7051:7051
      - 7053:7053
    volumes:
        - /var/run/:/host/var/run/
        - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/msp/peer
        - ./crypto-config/peerOrganizations/org1.example.com/users:/etc/hyperledger/msp/users
        - ./config:/etc/hyperledger/configtx
        - ~/go/bin:/go/bin
    depends_on:
      - orderer.example.com
    networks:
      - basic

启动前关闭网络,防止之前启动过

docker-compose  -f docker-compose.yaml down

启动orderer和peer节点

docker-compose -f docker-compose.yaml up -d peer0.org1.example.com orderer.example.com

查看容器进程

docker ps
CONTAINER ID      IMAGE        COMMAND          CREATED     STATUS      PORTS     NAMES
6f9d4ad6af8b      yeasy/hyperledger-fabric:1.0.0   "peer node start"        56 seconds ago      Up 53 seconds      0.0.0.0:7051->7051/tcp, 7050/tcp, 7054/tcp, 0.0.0.0:7053->7053/tcp   peer0.org1.example.com
0965146445ca       yeasy/hyperledger-fabric:1.0.0   "orderer"          58 seconds ago      Up 56 seconds       7051/tcp, 0.0.0.0:7050->7050/tcp, 7054/tcp                           orderer.example.com
99edaa3a60c5        yeasy/hyperledger-fabric:1.0.0   "/bin/bash -c 'sleep…"   2 hours ago         Up 2 hours          7050-7051/tcp, 7054/tcp                                              compile

创建通道

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCOnFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx
----------Welcome to my-basic-network----------
2018-11-14 08:13:05.098 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-11-14 08:13:05.098 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-11-14 08:13:05.107 UTC [channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized
2018-11-14 08:13:05.114 UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP
2018-11-14 08:13:05.116 UTC [msp] GetDefaultSigningIdentity -> DEBU 005 Obtaining default signing identity
2018-11-14 08:13:05.116 UTC [msp] GetLocalMSP -> DEBU 006 Returning existing local MSP
2018-11-14 08:13:05.117 UTC [msp] GetDefaultSigningIdentity -> DEBU 007 Obtaining default signing identity
2018-11-14 08:13:05.117 UTC [msp/identity] Sign -> DEBU 008 Sign: plaintext: 0A8C060A074F7267314D53501280062D...53616D706C65436F6E736F727469756D 
2018-11-14 08:13:05.118 UTC [msp/identity] Sign -> DEBU 009 Sign: digest: 5D1863244822DCB9603797144AD9F1BAA86A12AC3A730C069F510039530F35EC 
2018-11-14 08:13:05.119 UTC [msp] GetLocalMSP -> DEBU 00a Returning existing local MSP
2018-11-14 08:13:05.119 UTC [msp] GetDefaultSigningIdentity -> DEBU 00b Obtaining default signing identity
2018-11-14 08:13:05.119 UTC [msp] GetLocalMSP -> DEBU 00c Returning existing local MSP
2018-11-14 08:13:05.120 UTC [msp] GetDefaultSigningIdentity -> DEBU 00d Obtaining default signing identity
2018-11-14 08:13:05.120 UTC [msp/identity] Sign -> DEBU 00e Sign: plaintext: 0AC3060A1508021A060891B2AFDF0522...B9F3BEFA93B397ABE731E5922EB2AD40 
2018-11-14 08:13:05.120 UTC [msp/identity] Sign -> DEBU 00f Sign: digest: D6292E9E7628D66F3F2F227906C57901F400E361F0BFF889D6AF281EB8464E05 
2018-11-14 08:13:05.167 UTC [msp] GetLocalMSP -> DEBU 010 Returning existing local MSP
2018-11-14 08:13:05.167 UTC [msp] GetDefaultSigningIdentity -> DEBU 011 Obtaining default signing identity
2018-11-14 08:13:05.167 UTC [msp] GetLocalMSP -> DEBU 012 Returning existing local MSP
2018-11-14 08:13:05.167 UTC [msp] GetDefaultSigningIdentity -> DEBU 013 Obtaining default signing identity
2018-11-14 08:13:05.167 UTC [msp/identity] Sign -> DEBU 014 Sign: plaintext: 0AC3060A1508021A060891B2AFDF0522...63451B96B86D12080A021A0012021A00 
2018-11-14 08:13:05.167 UTC [msp/identity] Sign -> DEBU 015 Sign: digest: 660D6E5A80DA1D1C46FB93E63B697A4362E0A3201D08484EDB7EAB15798596E1 
2018-11-14 08:13:05.168 UTC [channelCmd] readBlock -> DEBU 016 Got status:*orderer.DeliverResponse_Status 
2018-11-14 08:13:05.168 UTC [msp] GetLocalMSP -> DEBU 017 Returning existing local MSP
2018-11-14 08:13:05.168 UTC [msp] GetDefaultSigningIdentity -> DEBU 018 Obtaining default signing identity
2018-11-14 08:13:05.170 UTC [channelCmd] InitCmdFactory -> INFO 019 Endorser and orderer connections initialized
2018-11-14 08:13:05.371 UTC [msp] GetLocalMSP -> DEBU 01a Returning existing local MSP
2018-11-14 08:13:05.371 UTC [msp] GetDefaultSigningIdentity -> DEBU 01b Obtaining default signing identity
2018-11-14 08:13:05.372 UTC [msp] GetLocalMSP -> DEBU 01c Returning existing local MSP
2018-11-14 08:13:05.372 UTC [msp] GetDefaultSigningIdentity -> DEBU 01d Obtaining default signing identity
2018-11-14 08:13:05.372 UTC [msp/identity] Sign -> DEBU 01e Sign: plaintext: 0AC3060A1508021A060891B2AFDF0522...763BCEC0A59A12080A021A0012021A00 
2018-11-14 08:13:05.372 UTC [msp/identity] Sign -> DEBU 01f Sign: digest: FEB035372AC14E18601FE0D76D77663902FE971F5E4C69C1DD8EC9C7823F3A6D 
2018-11-14 08:13:05.390 UTC [channelCmd] readBlock -> DEBU 020 Received block:0 
2018-11-14 08:13:05.397 UTC [main] main -> INFO 021 Exiting.....

将peer将入通道

docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCOnFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel join -b mychannel.block
----------Welcome to my-basic-network----------
2018-11-14 08:14:04.808 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-11-14 08:14:04.808 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-11-14 08:14:04.810 UTC [channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized
2018-11-14 08:14:04.811 UTC [msp/identity] Sign -> DEBU 004 Sign: plaintext: 0A8A070A5C08011A0C08CCB2AFDF0510...D06A96FA3B5F1A080A000A000A000A00
2018-11-14 08:14:04.811 UTC [msp/identity] Sign -> DEBU 005 Sign: digest: 1D06F595E5B39045672FA2476B6ECA972FE674864ECC13A14F8201C416594444
2018-11-14 08:14:04.862 UTC [channelCmd] executeJoin -> INFO 006 Peer joined the channel!
2018-11-14 08:14:04.862 UTC [main] main -> INFO 007 Exiting.....

 

7.4 总结

我们可以看到上面创建通道和将peer加入通道的输出中, 我们在源码里面的改动生效了, 通过这样的方式可以改动fabric源码后不用频繁编译超级账本镜像文件了。

如果我们要改动源码,流程是首先在主机上改动代码,然后到compile容器中编译代码, 然后在其他容器中执行编译后的程序,由于这几个容器都能看到主机上~/go/bin目录中的内容,只要compile容器中代码编译完成后,其他容器中立马就能使用它

八、 操作过程中的问题解决

8.1 没有权限执行dock命令解决办法

原因:

ocker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问

解决办法:

#添加docker用户组
sudo groupadd docker  
#将登陆用户加入到docker用户组中
sudo gpasswd -a $USER docker   
 #更新用户组
newgrp docker 
#测试docker命令是否可以使用sudo正常使  
 docker ps

-END-


推荐阅读
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • MyBatis入门指南:环境搭建与基础配置详解
    本文详细介绍了MyBatis的基础配置流程,包括在Maven项目中添加MyBatis依赖、IDEA中配置数据库连接、导入SQL脚本以及编写mybatis-config.xml配置文件等关键步骤。 ... [详细]
  • IntelliJ IDEA配置微服务启动显示
    通过编辑IntelliJ IDEA的workspace.xml文件,可以实现微服务启动对象的显示。具体步骤包括定位并修改workspace.xml中的RunDashboard部分。 ... [详细]
  • 本文详细探讨了编程中的命名空间与作用域概念,包括其定义、类型以及在不同上下文中的应用。 ... [详细]
  • 本文探讨了如何选择一个合适的序列化版本ID(serialVersionUID),包括使用生成器还是简单的整数,以及在不同情况下应如何处理序列化版本ID。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 本文介绍了Tomcat的基本操作,包括启动、关闭及首次访问的方法,并详细讲解了如何在IDEA中创建Web项目,配置Servlet及其映射,以及如何将项目部署到Tomcat。 ... [详细]
  • Spring Security基础配置详解
    本文详细介绍了Spring Security的基础配置方法,包括如何搭建Maven多模块工程以及具体的安全配置步骤,帮助开发者更好地理解和应用这一强大的安全框架。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
author-avatar
粗陶工作室
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有