step-by-step搭建fabric的开发环境

搭建一个只有一个orderer/peer/cli一共就三个节点的fabric环境,让orderer使用solo模式,peer使用leveldb作为状态数据库。
当然这个环境只能用来作为开发调试chaincode使用。

这个教程是基于官方的byfn例子简化而来,所以里面很多的配置文件都是从byfn例子改出来的。

第一步:生产所有的证书文件

1.1 定义证书配置文件 crypto-config.yaml

$ cat crypto-config.yaml
OrdererOrgs:
  - Name: OrdererOrg
    Domain: example.com
    Specs:
      - Hostname: orderer
PeerOrgs:
  - Name: PeerOrg
    Domain: example.com
    Template:
      Count: 2
    Users:
      Count: 1

这里我们只定义了一个peer Org。

1.2 使用cryptogen工具生产证书文件

${GOPATH}/src/github.com/hyperledger/fabric/build/docker/bin/cryptogen generate --config=./crypto-config.yaml

运行完成后,会在当前目录下面生产一个文件夹:crypto-config

$ ls -1 crypto-config   
ordererOrganizations
peerOrganizations

包含整个fabric网络中所有节点的证书信息。

第二步:生成genesis block文件

2.1 定义fabric网络genesis block配置文件

$ cat configtx.yaml
Profiles:
    OrdererOrgGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *PeerOrg
    PeerOrgChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *PeerOrg

Organizations:
    - &OrdererOrg
        Name: OrdererOrg
        ID: OrdererMSP
        MSPDir: crypto-config/ordererOrganizations/example.com/msp

    - &PeerOrg
        Name: PeerOrg
        ID: PeerOrgMSP
        MSPDir: crypto-config/peerOrganizations/example.com/msp
        AnchorPeers:
            - Host: peer0.example.com
              Port: 7051

Orderer: &OrdererDefaults
    OrdererType: solo
    Addresses:
        - orderer.example.com:7050
    BatchTimeout: 2s
    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB
    Organizations:

Application: &ApplicationDefaults
    Organizations:

2.2 使用工具configtxgen生成genesis block

创建channel-artifacts子目录,存储genesis block

mkdir -p ./channel-artifacts

然后使用configtxgen工具生产genesis block

FABRIC_CFG_PATH=. ${GOPATH}/src/github.com/hyperledger/fabric/build/docker/bin/configtxgen -profile OrdererOrgGenesis -outputBlock ./channel-artifacts/genesis.block

生成的genesis block文件存放在 channel-artifacts/genesis.block

第三步:定义channel初始block

假设channel的名字为:mychannel

FABRIC_CFG_PATH=. ${GOPATH}/src/github.com/hyperledger/fabric/build/docker/bin/configtxgen -profile PeerOrgChannel -outputCreateChannelTx ./channel-artifacts/mychannel.tx -channelID mychannel

比较第三步和第二步,第二步是生成genesis block文件是包含整个fabric网络的信息,在orderer加载的时候被引用;第三步生成的是channel个block文件,包含针对特定channel的初始信息文件,在channel创建的时候被引用。

最后生成的文件是:channel-artifacts/mychannel.block

第四步:启动fabric

4.0 首先需要准备fabric用到的image

  1. hyperledger/fabric-tools
  2. hyperledger/fabric-peer
  3. hyperledger/fabric-orderer

4.1 定义core.yaml和orderer.yaml

可以从byfn例子里面拷过来了,按需要做一些调整。

4.2 定义.env 文件

这个文件只有一行,定义了变量COMPOSE_PROJECT_NAME的值。

$ cat .env 
COMPOSE_PROJECT_NAME=net

否则chaincode instantiate的时候回失败;但是我认为这应该算是fabric或者docker-compose,或者他们之间现衔接的一个bug。
这个变量在docker-compose.yaml里面用到。

4.3 定义docker compose 文件

$ cat docker-compose.yaml
version: '2'

networks:
  byfn:

services:

  orderer.example.com:
    container_name: orderer.example.com
    image: hyperledger/fabric-orderer
    environment:
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
    - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
    - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
    - ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
    - ./orderer.yaml:/etc/hyperledger/fabric/orderer.yaml
    ports:
      - 7050:7050
    networks:
      - byfn

  peer0.example.com:
    container_name: peer0.example.com
    image: hyperledger/fabric-peer
    environment:
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn
      - CORE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
      - CORE_PEER_ID=peer0.example.com
      - CORE_PEER_ADDRESS=peer0.example.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.example.com:7051
      - CORE_PEER_LOCALMSPID=PeerOrgMSP
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    volumes:
        - ./crypto-config/peerOrganizations/example.com/peers/peer0.example.com/msp:/etc/hyperledger/fabric/msp
        - ./crypto-config/peerOrganizations/example.com/peers/peer0.example.com/tls:/etc/hyperledger/fabric/tls
        - ./core.yaml:/etc/hyperledger/fabric/core.yaml
        - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 7051:7051
      - 7053:7053
    networks:
      - byfn

  cli:
    container_name: cli
    image: hyperledger/fabric-tools
    tty: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_LOGGING_LEVEL=DEBUG
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    volumes:
        - ./:/opt/gopath/src/github.com/hyperledger/fabric/peer
    depends_on:
      - orderer.example.com
      - peer0.example.com
    networks:
      - byfn

4.4 启动docker-compose

$ docker-compose -d up
$ docker-compose ps
       Name               Command       State                       Ports                      
----------------------------------------------------------------------------------------------
cli                   /bin/bash         Up                                                     
orderer.example.com   orderer           Up      0.0.0.0:7050->7050/tcp                         
peer0.example.com     peer node start   Up      0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp 

看到有三个container在运行,一个orderer,一个peer,和一个cli。

第五步:进入到cli容器运行fabric接口命令

$ docker exec -it cli bash
root@482e1e3001c3:/opt/gopath/src/github.com/hyperledger/fabric/peer#

5.1 设置环境

export FABRIC_CFG_PATH=.

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_ROOTCERT_FILE=${FABRIC_CFG_PATH}/crypto-config/peerOrganizations/example.com/peers/peer0.example.com/tls/ca.crt
export CORE_PEER_TLS_KEY_FILE=${FABRIC_CFG_PATH}/crypto-config/peerOrganizations/example.com/peers/peer0.example.com/tls/server.key
export CORE_PEER_TLS_CERT_FILE=${FABRIC_CFG_PATH}/crypto-config/peerOrganizations/example.com/peers/peer0.example.com/tls/server.crt

export CORE_PEER_ADDRESS=peer0.example.com:7051
export CORE_PEER_LOCALMSPID=PeerOrgMSP
export CORE_PEER_MSPCONFIGPATH=${FABRIC_CFG_PATH}/crypto-config/peerOrganizations/example.com/users/Admin@example.com/msp

5.2 创建channel

# peer channel create \
  -t 15 \
  -o orderer.example.com:7050 \
  -c mychannel \
  -f ./channel-artifacts/mychannel.tx \
  --tls true \
  --cafile ${FABRIC_CFG_PATH}/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

创建完channel之后会在当前目录生成一个文件:mychannel.block

5.3 加入channel

# peer channel join -b ./mychannel.block

5.4 安装chaincode

假定chaincode的源代码放在如下路径:

# ls chaincode/go/chaincode_example02
chaincode_example02.go

安装脚本

# peer chaincode install -n mychaincode -v 1.0 -p github.com/hyperledger/fabric/peer/chaincode/go/chaincode_example02

5.5 实例化chaincode

# peer chaincode instantiate \
  -o orderer.example.com:7050 \
  --tls true \
  --cafile ${FABRIC_CFG_PATH}/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
  -C mychannel -n mychaincode -v 1.0 -c '{"Args":["init","a","1000","b","2000"]}'

5.6 查询和调用chaincode

至此整个chaincode的部署已经完成了,下面就可以调用chaincode的代码逻辑了。

5.6.1 查询

# peer chaincode query -C mychannel -n mychaincode -c '{"Args":["query","a"]}'

5.6.2 转账

# peer chaincode invoke \
  -o orderer.example.com:7050  \
  --tls true \
  --cafile ${FABRIC_CFG_PATH}/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
  -C mychannel -n mychaincode -c '{"Args":["invoke","b","a","1"]}'

第六步,停止

$ docker-compose down
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容