1

搭建一个Fabric网络

 2 years ago
source link: https://imnisen.github.io/fabric-build-test-network.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

搭建一个Fabric网络

注意:本文是我自己尝试本地搭建fabric的一个流程记录,可能对你没有意义

2 生成证书文件

2.1 生成证书配置文件目录

mkdir -p demo/crypto-dir

2.2 编辑证书配置文件

vim crypto-config.yaml

文件内容如下:

OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    Specs:
      - Hostname: orderer

PeerOrgs:

  - Name: Org1
    Domain: org1.example.com
    Template:
      Count: 2
    Users:
      Count: 1

  - Name: Org2
    Domain: org2.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1


2.3 根据配置文件生成证书

cryptogen generate --config=crypto-config.yaml --output ./crypto-dir

2.4 查看生成的证书文件

-> tree crypto-dir/ -L 3

crypto-dir/
├── ordererOrganizations
│   └── example.com
│       ├── ca
│       ├── msp
│       ├── orderers
│       ├── tlsca
│       └── users
└── peerOrganizations
    ├── org1.example.com
    │   ├── ca
    │   ├── msp
    │   ├── peers
    │   ├── tlsca
    │   └── users
    └── org2.example.com
        ├── ca
        ├── msp
        ├── peers
        ├── tlsca
        └── users

20 directories, 0 files

3 创始块生成

3.1 创建目录

mkdir order

3.2 编辑配置文件

vim configtx.yaml

文件内容如下
Profiles:

    TwoOrgsOrdererGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    TwoOrgsChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2

Organizations:

    - &OrdererOrg
        Name: OrdererOrg
        ID: OrdererMSP
        MSPDir: crypto-dir/ordererOrganizations/example.com/msp
    - &Org1
        Name: Org1MSP
        ID: Org1MSP
        MSPDir: crypto-dir/peerOrganizations/org1.example.com/msp
        AnchorPeers:
            - Host: peer0.org1.example.com
              Port: 7051
    - &Org2
        Name: Org2MSP
        ID: Org2MSP
        MSPDir: crypto-dir/peerOrganizations/org2.example.com/msp
        AnchorPeers:
            - Host: peer0.org2.example.com
              Port: 7051

Orderer: &OrdererDefaults

    OrdererType: solo
    Addresses:
        - orderer.example.com:7050
    BatchTimeout: 2s
    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB
    Kafka:
        Brokers:
            - 127.0.0.1:9092
    Organizations:

Application: &ApplicationDefaults

    Organizations:

3.3 根据配置文件生成初始Block

configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./order/order.genesis.block

2018-06-21 15:50:41.461 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-06-21 15:50:41.472 CST [msp] getMspConfig -> INFO 002 Loading NodeOUs
2018-06-21 15:50:41.472 CST [common/tools/configtxgen] doOutputBlock -> INFO 003 Generating genesis block
2018-06-21 15:50:41.473 CST [common/tools/configtxgen] doOutputBlock -> INFO 004 Writing genesis block

3.4 查看生成文件内容

tree order
order
└── order.genesis.block

0 directories, 1 file

3.5 创建channel

➜  configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./order/alicetestchannel.tx -channelID alicetestchannel

<CeateChannelTx ./order/alicetestchannel.tx -channelID alicetestchannel
2018-06-21 16:35:23.769 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-06-21 16:35:23.781 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
2018-06-21 16:35:23.784 CST [msp] getMspConfig -> INFO 003 Loading NodeOUs
2018-06-21 16:35:23.811 CST [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 004 Writing new channel tx

3.6 创建两个锚点文件

1). 第一个锚节点

➜  configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./order/Org1MSPanchors.tx -channelID alicetestchannel -asOrg Org1MSP

<chorPeersUpdate ./order/Org1MSPanchors.tx -channelID alicetestchannel -asOrg Org1MSP
2018-06-21 16:39:03.311 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-06-21 16:39:03.321 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2018-06-21 16:39:03.321 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update


2). 第二个锚节点

➜  configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./order/Org2MSPanchors.tx -channelID alicetestchannel -asOrg Org2MSP

<chorPeersUpdate ./order/Org2MSPanchors.tx -channelID alicetestchannel -asOrg Org2MSP
2018-06-21 16:39:33.978 CST [common/tools/configtxgen] main -> INFO 001 Loading configuration
2018-06-21 16:39:33.990 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2018-06-21 16:39:33.990 CST [common/tools/configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update

3.7 检查此时文件

➜  tree order
tree order
order
├── Org1MSPanchors.tx
├── Org2MSPanchors.tx
├── alicetestchannel.tx
└── order.genesis.block

0 directories, 4 files

4 Order节点启动

4.1 编辑Order节点配置文件

vim orderer.yaml

文件内容如下:
参考 fabric/sampleconfig/orderer.yaml to demo/orderer.yaml

General:

    LedgerType: file

    ListenAddress: 0.0.0.0

    ListenPort: 7050

    TLS:
        Enabled: false
        PrivateKey: ./crypto-dir/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key
        Certificate: ./crypto-dir/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
        RootCAs:
          - ./crypto-dir/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt
        ClientAuthRequired: false
        ClientRootCAs:

    Keepalive:
        ServerMinInterval: 60s
        ServerInterval: 7200s
        ServerTimeout: 20s

    LogLevel: debug

    LogFormat: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'

    GenesisMethod: file

    GenesisProfile: TwoOrgsOrdererGenesis

    GenesisFile: ./order/order.genesis.block

    LocalMSPDir: ./crypto-dir/ordererOrganizations/example.com/orderers/orderer.example.com/msp

    LocalMSPID: OrdererMSP

    Profile:
        Enabled: false
        Address: 0.0.0.0:6060

    BCCSP:
        Default: SW

        SW:
            Hash: SHA2
            Security: 256
            FileKeyStore:
                KeyStore:

    Authentication:
        TimeWindow: 15m

FileLedger:

    Location: ./order/production/orderer

    Prefix: hyperledger-fabric-ordererledger

RAMLedger:

    HistorySize: 1000

Kafka:

    Retry:
        ShortInterval: 5s
        ShortTotal: 10m
        LongInterval: 5m
        LongTotal: 12h
        NetworkTimeouts:
            DialTimeout: 10s
            ReadTimeout: 10s
            WriteTimeout: 10s
        Metadata:
            RetryBackoff: 250ms
            RetryMax: 3
        Producer:
            RetryBackoff: 100ms
            RetryMax: 3
        Consumer:
            RetryBackoff: 2s

    Verbose: false

    TLS:

      Enabled: false

      PrivateKey:

      Certificate:

      RootCAs:

    Version:

Debug:

    BroadcastTraceDir:

    DeliverTraceDir:

4.2 启动Order节点

orderer start

5 Peer节点启动

5.1 创建Peer节点目录

mkdir peer

5.2 创建Peer节点配置文件

vim core.yaml

文件内容如下:
logging:

    level:       info
    cauthdsl:   warning
    gossip:     warning
    grpc:       error
    ledger:     info
    msp:        warning
    policies:   warning
    peer:
        gossip: warning

    format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'

peer:

    id: peer0.org1.example.com
    networkId: dev
    listenAddress: 0.0.0.0:7051
    chaincodeListenAddress: 0.0.0.0:7052
    address: 0.0.0.0:7051
    addressAutoDetect: false
    gomaxprocs: -1
    keepalive:
        minInterval: 60s
        client:
            interval: 60s
            timeout: 20s
        deliveryClient:
            interval: 60s
            timeout: 20s
    gossip:
        bootstrap: 127.0.0.1:7051
        useLeaderElection: true
        orgLeader: false
        endpoint:
        maxBlockCountToStore: 100
        maxPropagationBurstLatency: 10ms
        maxPropagationBurstSize: 10
        propagateIterations: 1
        propagatePeerNum: 3
        pullInterval: 4s
        pullPeerNum: 3
        requestStateInfoInterval: 4s
        publishStateInfoInterval: 4s
        stateInfoRetentionInterval:
        publishCertPeriod: 10s
        skipBlockVerification: false
        dialTimeout: 3s
        connTimeout: 2s
        recvBuffSize: 20
        sendBuffSize: 200
        digestWaitTime: 1s
        requestWaitTime: 1500ms
        responseWaitTime: 2s
        aliveTimeInterval: 5s
        aliveExpirationTimeout: 25s
        reconnectInterval: 25s
        externalEndpoint:
        election:
            startupGracePeriod: 15s
            membershipSampleInterval: 1s
            leaderAliveThreshold: 10s
            leaderElectionDuration: 5s
        pvtData:
            pullRetryThreshold: 60s
            transientstoreMaxBlockRetention: 1000
            pushAckTimeout: 3s
            btlPullMargin: 10

    events:
        address: 0.0.0.0:7053
        buffersize: 100
        timeout: 10ms
        timewindow: 15m
        keepalive:
            minInterval: 60s

    tls:
        enabled:  false
        clientAuthRequired: false
        cert:
            file: ./crypto-dir/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/server.crt
        key:
            file: ./crypto-dir/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/server.key
        rootcert:
            file: ./crypto-dir/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crt
        clientRootCAs:
            files:
              - tls/ca.crt
        clientKey:
            file:
        clientCert:
            file:

    authentication:
        timewindow: 15m

    fileSystemPath: ./peer/production

    BCCSP:
        Default: SW
        SW:
            Hash: SHA2
            Security: 256
            FileKeyStore:
                KeyStore:
        PKCS11:
            Library:
            Label:
            Pin:
            Hash:
            Security:
            FileKeyStore:
                KeyStore:

    mspConfigPath: ./crypto-dir/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp

    localMspId: Org1MSP

    client:
        connTimeout: 3s

    deliveryclient:
        reconnectTotalTimeThreshold: 3600s
        connTimeout: 3s
        reConnectBackoffThreshold: 3600s

    localMspType: bccsp

    profile:
        enabled:     false
        listenAddress: 0.0.0.0:6060

    adminService:

    handlers:
        authFilters:
          -
            name: DefaultAuth
          -
            name: ExpirationCheck    # This filter checks identity x509 certificate expiration
        decorators:
          -
            name: DefaultDecorator
        endorsers:
          escc:
            name: DefaultEndorsement
            library:
        validators:
          vscc:
            name: DefaultValidation
            library:

    validatorPoolSize:

    discovery:
        enabled: true
        authCacheEnabled: true
        authCacheMaxSize: 1000
        authCachePurgeRetentionRatio: 0.75
        orgMembersAllowedAccess: false

vm:

    endpoint: unix:///var/run/docker.sock

    docker:
        tls:
            enabled: false
            ca:
                file: docker/ca.crt
            cert:
                file: docker/tls.crt
            key:
                file: docker/tls.key

        attachStdout: false

        hostConfig:
            NetworkMode: host
            Dns:
               # - 192.168.0.1
            LogConfig:
                Type: json-file
                Config:
                    max-size: "50m"
                    max-file: "5"
            Memory: 2147483648

chaincode:

    id:
        path:
        name:

    builder: $(DOCKER_NS)/fabric-ccenv:latest

    pull: false

    golang:
        runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)

        dynamicLink: false

    car:
        runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)

    java:
        Dockerfile:  |
            from $(DOCKER_NS)/fabric-javaenv:$(ARCH)-1.1.0

    node:
        runtime: $(BASE_DOCKER_NS)/fabric-baseimage:$(ARCH)-$(BASE_VERSION)

    startuptimeout: 300s

    executetimeout: 30s

    mode: net

    keepalive: 0

    system:
        cscc: enable
        lscc: enable
        escc: enable
        vscc: enable
        qscc: enable

    systemPlugins:

    logging:
      level:  info
      shim:   warning
      format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'

ledger:

  blockchain:

  state:
    stateDatabase: goleveldb
    couchDBConfig:
       couchDBAddress: 127.0.0.1:5984
       username:
       password:
       maxRetries: 3
       maxRetriesOnStartup: 10
       requestTimeout: 35s
       queryLimit: 10000
       maxBatchUpdateSize: 1000
       warmIndexesAfterNBlocks: 1

  history:
    enableHistoryDatabase: true

metrics:
        enabled: false
        reporter: statsd
        interval: 1s
        statsdReporter:
              address: 0.0.0.0:8125
              flushInterval: 2s
              flushBytes: 1432

        promReporter:
              listenAddress: 0.0.0.0:8080


5.3 启动Peer节点

# 设置环境变量为当前目录
export set FABRIC_CFG_PATH=/Users/nisen/fabric-dir/demo

# 启动
peer node start

6 创建Channel

6.1 创建Channel

# 设置环境变量
➜  export set CORE_PEER_LOCALMSPID=Org1MSP
➜  export set CORE_PEER_MSPCONFIGPATH=/Users/nisen/fabric-dir/demo/crypto-dir/peerOrganizations/org1.example.com/users/[email protected]/msp

# 应当运行:
peer channel create -t 50 -o orderer.example.com:7050 -c alicetestchannel -f /Users/nisen/fabric-dir/demo/order/alicetestchannel.tx

# 但因为都在本地部署,实际上没有域名,所以实际运行:
peer channel create -t 50 -o 127.0.0.1:7050 -c alicetestchannel -f /Users/nisen/fabric-dir/demo/order/alicetestchannel.tx


2018-06-21 17:31:20.399 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2018-06-21 17:31:20.462 CST [channelCmd] InitCmdFactory -> INFO 002 Endorser and orderer connections initialized
2018-06-21 17:31:20.683 CST [main] main -> INFO 003 Exiting.....


# 运行完后会在当前目录生成alicetestchannel.block

6.2 让已经运行的peer加入channel

➜  export set CORE_PEER_LOCALMSPID=Org1MSP
➜  export set CORE_PEER_MSPCONFIGPATH=/Users/nisen/fabric-dir/demo/crypto-dir/peerOrganizations/org1.example.com/users/[email protected]/msp
➜  export set CORE_PEER_ADDRESS=peer0.org1.example.com:7051
➜  peer channel join -b ./alicetestchannel.block
Error: Error getting endorser client channel: endorser client failed to connect to peer0.org1.example.com:7051: failed to create new connection: context deadline exceeded

域名不可用,修改为
➜  export set CORE_PEER_ADDRESS=localhost:7051
➜  peer channel join -b ./alicetestchannel.block
2018-06-21 17:36:02.053 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2018-06-21 17:36:02.106 CST [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel
2018-06-21 17:36:02.106 CST [main] main -> INFO 003 Exiting.....


6.3 更新锚节点peer

➜  export set CORE_PEER_LOCALMSPID=Org1MSP
➜  export set CORE_PEER_MSPCONFIGPATH=/Users/nisen/fabric-dir/demo/crypto-dir/peerOrganizations/org1.example.com/users/[email protected]/msp
➜  export set CORE_PEER_ADDRESS=peer0.org1.example.com:7051  # 域名不可用,需要修改

➜  peer channel update -o localhost:7050 -c alicetestchannel -f ./order/Org1MSPanchors.tx
2018-06-21 17:39:03.820 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2018-06-21 17:39:03.884 CST [channelCmd] update -> INFO 002 Successfully submitted channel update
2018-06-21 17:39:03.885 CST [main] main -> INFO 003 Exiting.....

7 部署chancode

7.1 显示peer所加入的channel

➜  peer channel list

2018-06-21 17:40:16.125 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Channels peers has joined:
alicetestchannel
2018-06-21 17:40:16.132 CST [main] main -> INFO 002 Exiting.....

7.2 部署chancode

➜  peer chaincode install -n examplechaincode -v 1.1 -p simpledemo
2018-06-21 17:49:58.103 CST [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2018-06-21 17:49:58.103 CST [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2018-06-21 17:49:59.043 CST [main] main -> INFO 003 Exiting.....

7.3 实例化chaincode

➜  peer chaincode instantiate -o localhost:7050 -C \
         alicetestchannel -n examplechaincode -v 1.1 -c '{"Args":["init","a","100","b","200"]}' \
         -P "OR ('Org1MSP.member','Org2MSP.member')"
2018-06-21 17:52:25.318 CST [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2018-06-21 17:52:25.318 CST [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2018-06-21 17:52:48.665 CST [main] main -> INFO 003 Exiting.....

7.4 查看运行的容器

➜  docker ps
CONTAINER ID        IMAGE                                                                                                               COMMAND                  CREATED             STATUS              PORTS               NAMES
47d28c47b6eb        dev-peer0.org1.example.com-examplechaincode-1.1-d2b990146ffe74fcdfcdc76dbb4ad69ae46eb0a557d438972c6b66673ce3517e   "chaincode -peer.add…"   9 seconds ago       Up 8 seconds                            dev-peer0.org1.example.com-examplechaincode-1.1

7.5 调用chaincode

➜  peer chaincode invoke -o localhost:7050 -C alicetestchannel -n examplechaincode -c '{"Args":["invoke","a","b","1"]}'


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK