在CentOS 7.2下安裝Hyperledger fabric 1.0.0 preview版本的solo模式

在CentOS 7.2下安裝Hyperledger fabric 1.0.0 preview版本的solo模式

一. 安裝centos和docker 等組件

A. 安裝centos x86-64 Minimal(IP:192.168.2.10)

內核版本需要3.10 以上。centos 7 完全支持.

查看內核信息
$ uname -a
Linux localhost.localdomain 3.10.0-514.6.1.el7.x86_64

B. 安裝docker, 版本1.12.5(略過)

$ docker -v
Docker version 1.12.5, build 047e51b/1.12.5

C. 安裝python-pip(可選)

  • 安裝epel擴展
$ yum -y install epel-release
  • 然後安裝python-pip
$ yum -y install python-pip
# 更新到最新版本
$ pip install --upgrade pip
  • 確認安裝成功和確定版本
$ pip -V

d. 安裝docker-compose

docker-compose是docker集羣管理工具,可自定義一鍵啓動多個docker container。
官網二進制發佈:
https://github.com/docker/compose/releases
安裝手冊見網站 :
https://docs.docker.com/compose/install/
安裝命令如下:

$ curl -L https://github.com/docker/compose/releases/download/1.11.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ docker-compose -v

或者通過 pip 安裝

$ pip install -U docker-compose

二. 搭建Fabric 1.0.0 演示環境( solo共識方式,帶自定義channel)

楊寶華的項目主頁
https://github.com/yeasy/blockchain_guide/blob/master/hyperledger/1.0.md

A.下載所需組件

1. 安裝操作系統和docker (略)

2. 安裝python pip(略)

3. 安裝 docker-compose 最新發布版本

pip install docker-compose 

4.獲取docker的 image,並更新鏡像別名。

注意:這裏一定要用tag來更新別名,要和docker-compose.yml 中的匹配
2017年02月16日,楊寶華mail確定:

The latest tag is auto-building by triggered from code change.

While those number tag (e.g., 0.8) is stable and manually set.

所以, 我們使用:
最新的版本的pull命令如下:

以root用戶運行以下命令

ARCH=x86_64
BASE_VERSION=1.0.0-preview
PROJECT_VERSION=1.0.0-preview
IMG_VERSION=0.8.4
docker pull yeasy/hyperledger-fabric-base:$IMG_VERSION \
  && docker pull yeasy/hyperledger-fabric-peer:$IMG_VERSION \
  && docker pull yeasy/hyperledger-fabric-orderer:$IMG_VERSION \
  && docker pull yeasy/hyperledger-fabric-ca:$IMG_VERSION \
  && docker pull yeasy/blockchain-explorer:latest \
  && docker tag yeasy/hyperledger-fabric-peer:$IMG_VERSION hyperledger/fabric-peer \
  && docker tag yeasy/hyperledger-fabric-orderer:$IMG_VERSION hyperledger/fabric-orderer \
  && docker tag yeasy/hyperledger-fabric-ca:$IMG_VERSION hyperledger/fabric-ca \
  && docker tag yeasy/hyperledger-fabric-base:$IMG_VERSION hyperledger/fabric-baseimage \
  && docker tag yeasy/hyperledger-fabric-base:$IMG_VERSION hyperledger/fabric-ccenv:$ARCH-$BASE_VERSION \
  && docker tag yeasy/hyperledger-fabric-base:$IMG_VERSION hyperledger/fabric-baseos:$ARCH-$BASE_VERSION

5.設置網絡

$ docker network create fabric_noops
$ docker network create fabric_pbft

6.啓動 Fabric 1.0

a. 下載 Compose 模板文件。
$ cd ~
$ git clone https://github.com/yeasy/docker-compose-files
b. 進入hyperledger 1.0 模板目錄
$ cd /root/docker-compose-files/hyperledger/1.0
c. 查看包括若干模板文件,功能如下。

peers.yml: 包含 peer 節點的服務模板。
docker-compose.yml: 啓動 1 個 最小化的環境,包括 1 個 peer 節點、1 個 Orderer 節點、1 個 CA 節點。

d. 修改成3個peer的方式。

docker-compose.yml 裏面增加如下代碼

  peer1:
    extends:
      file: peer.yml
      service: peer
    container_name: fabric-peer1
    hostname: peer1
    environment:
      - CORE_PEER_ID=peer1
      - CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050
    links:
      - ca
      - orderer
    ports:
      - 8052:7051
    depends_on:
      - ca
      - orderer

  peer2:
    extends:
      file: peer.yml
      service: peer
    container_name: fabric-peer2
    hostname: peer2
    environment:
      - CORE_PEER_ID=peer2
      - CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050
    links:
      - ca
      - orderer
    ports:
      - 8053:7051
    depends_on:
      - ca
      - orderer
e. 部署和啓動 Fabric 1.0
$ docker-compose -f docker-compose.yml up -d

7. 查看容器信息

應該有5個啓動的容器,分別是
    1. fabric-peer0
    2. fabric-peer1
    3. fabric-peer2
    4. fabric-orderer
    5. fabric-ca
$ docker  ps 
# 或者
$ docker-compose ps 

8. 建立一個channel 名字是myc1

進入任何一個peer容器內均可

docker exec -it fabric-peer2 bash

CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer channel create -c myc1

# 確認myc1.block文件產生了。說明channel的創世紀塊建立成功
ls *.block 

9. 把相應的peer(0,1,2)節點加入myc1

在建立channel 的容器裏面,進行下面操作。

CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer0:7051 peer channel join -b myc1.block

CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer1:7051 peer channel join -b myc1.block

CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer2:7051 peer channel join -b myc1.block

10. 部署和實例化chaincode

  • 有幾個peer需要運行這個chaincode,那就需要在這幾個peer上都peer chaincode install。
  • 但是只需要在任意一個peer上peer chaincode instantiate 一次。
  • 如果在其他peer上再做 instantiate ,就會出現錯誤。
  • 修改CORE_PEER_ADDRESS參數值即可指定在哪個peer上 install 和 instantiate。
$ docker exec -it fabric-peer0 bash

# 部署一個chaincode
CORE_PEER_ADDRESS=peer2:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=fabric-orderer:7050 peer chaincode install  -C myc1 -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02   -c '{}'  -v 1.1.0    

# 實例化一個chaincode
CORE_PEER_ADDRESS=peer2:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=fabric-orderer:7050  peer chaincode instantiate -C myc1 -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Args":["init","a","100","b","200"]}'  -v 1.1.0

注意:
* 在docker宿主機器上,使用docker ps 命令可以看到,在第一次指定一個peer(由CORE_PEER_ADDRESS指定),成功install 並且instantiate一個chaincode後,就會產生,並且up起來一個以這個peer和chaincode ,版本號爲名字的容器。
* 接下來在其他peer上install這個相同的chaincode的時候,不會產生容器。(這個時候,由於已經有第一個peer進行了這個chaincode的instantiate,再在其他容器上instantiate 就會出錯的,錯誤信息是chaincode已經存在)
* 當指定peer進行業務操作的時候,就會產生,並且up起來一個以這個指定的peer和chaincode ,版本號爲名字的容器。

docker ps 
dev-peer0-mycc-1.1.0 

7. 查詢chaincode

部署完成後,等待幾秒,或者查看log。確定部署完成,然後進行查詢

CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=fabric-orderer:7050   peer chaincode query  -C myc1 -n mycc  -c '{"Args":["query","a"]}'

#返回結果是:
Query Result: 100
2017-03-15 08:05:17.429 UTC [main] main -> INFO 002 Exiting.....

#或者 

CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=fabric-orderer:7050  peer chaincode invoke  -C myc1  -n mycc -c '{"Args":["invoke","a","b","10"]}' peer chaincode invoke -n mycc -c '{"Args":["query","a"]}'

返回結果是:
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<status:200 message:"OK" payload:"100" > payload:"\n \...
[main] main -> INFO 002 Exiting.....
  1. 調用chaincode
    模擬轉賬業務
CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=fabric-orderer:7050  peer chaincode invoke  -C myc1  -n mycc -c '{"Args":["invoke","a","b","10"]}'

正確的返回內容:

[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Invoke result: version:1 response:<status:200 message:"OK" > payload:... 
[main] main -> INFO 002 Exiting.....
注意最終結果狀態正常 response:<status:200 message:"OK" >

過幾秒後再調用查詢業務,確認轉賬成功

CORE_PEER_ADDRESS=peer0:7051 peer chaincode query   -C myc1  -n mycc  -c '{"Args":["query","a"]}'

返回的正確內容,b賬號裏面多了轉賬的金額。

  1. 查看日誌
    在docker server上執行如下命令:
$ cd ~/docker-compose-files/hyperledger/1.0
$ docker-compose logs -f

三. 搭建Fabric 0.6 演示環境(noops 模式)

A.下載組件

  1. hyperledger Fabric使用的 docker-compose.yml
    Docker Compose 配置文件 yaml 參數簡單介紹
    http://debugo.com/docker-compose/
    使用HyperLedger github上的樣例

    curl -o docker-compose.yml https://raw.githubusercontent.com/hyperledger/fabric/master/examples/sdk/node/docker-compose.yml
  2. 下載membersrvc和peer 的Docker image

    $ docker pull hyperledger/fabric-membersrvc:latest
    $ docker pull hyperledger/fabric-peer:latest
    
    #查看images 信息
    
    $ docker images

B. build客戶端鏡像

1. 下載Fabric樣例Dockerfile

$ cd ~
$ curl -o Dockerfile https://raw.githubusercontent.com/hyperledger/fabric/master/examples/sdk/node/Dockerfile

2. build image

docker build -t hyperledger/fabric-starter-kit:latest .

3. 檢查images是否正確構建

docker images

C. 運行Fabric開發環境

1. 啓動Cluster

docker-compose -f docker-compose.yml up -d

2. 進入Docker

部署爲開發模式,直接進入peer

docker exec -it peer bash

3. 登陸

官方Image默認打開權限,需要先登陸用戶,使用內置用戶登陸。

  • CLI
peer network login jim
# 缺省密碼 6avZQLwcUe9b
  • REST API
    也可以使用REST API方式:
POST http://127.0.0.1:7050/
registrar
{
    "enrollId": "jim",
    "enrollSecret": "6avZQLwcUe9b"
}

Note: 爲了使用REST,你需要在docker-compose.yml文件的peer部分中加入端口映射:

    $ vim docker-compose.yml

    #增加端口映射在peer部分
    ports:
       - "0.0.0.0:7050:7050"
    #退出 vim

    #建議刪除原有的3個container
    $ docker rm -f  peer starter membersrvc 
    #然後重新生成容器
    $ docker-compose -f docker-compose.yml up -d
    # 查看進程
    $ docker-compose ps
    # 如果有錯誤 , 查看docker 日誌
    $ docker-compose logs

4. 部署Chaincode

  • CLI
    # 進入  peer容器
    $docker  exec -it peer bash

    #部署一個命名爲 mycc的chaincode
    $CORE_PEER_ADDRESS=127.0.0.1:7051
    $peer chaincode deploy -n mycc -c '{"Function": "init", "Args": ["roamer", "100", "she", "5000"]}' -u jim

注意: 在這裏 只能用 mycc 作爲 chiancode的名字。在0.6.1 preview版本中如果使用 hyperledger-demo-1 這類的名字,會拋出 sending init failed(handler not found for chaincode roamer-test) 錯誤!

Note: 部署返回成功僅僅意味着提交的指令已被接收,不代表指令執行完成。如果要查看是否部署成功,需要新開一個終端,在docker 服務器上(不是當前容器),運行查看日誌命令,確保沒有錯誤信息。

$ docker logs -f peer 
#或者
$ docker-compse logs -f peer
  • REST API
POST http://192.168.2.10:7050/chaincode

request 參數

    {
    "jsonrpc": "2.0",
    "method": "deploy",
    "params": {
        "type": 1,
        "chaincodeID": {
            "name": "mycc"
        },
        "ctorMsg": {
            "function": "init",
            "args": ["roamer", "100", "she", "5000"]
        },
        "secureContext": "jim"  
    },
    "id": 1
}

5. 查詢

  • CLI
    peer chaincode query -u jim  -n mycc -c '{"Function": "query", "Args": ["roamer"]}'

返回結果應該是

Query Result: 100
06:41:08.619 [main] main -> INFO 004 Exiting.....
  • REST API
http://192.168.2.10:7050/chaincode

request參數

    {
    "jsonrpc": "2.0",
    "method": "query",
    "params": {
        "type": 1,
        "chaincodeID": {
            "name": "mycc"
        },
        "ctorMsg": {
            "function": "query",
            "args": ["roamer"]
        },
        "secureContext": "jim"  
    },
    "id": 5
}

返回結果是:

    {
        "jsonrpc": "2.0",
        "result": {
            "status": "OK",
            "message": "100"
        },
        "id": 5
    }

6. 轉賬

  • CLI
peer chaincode invoke -n mycc  -u jim -c  '{"Function": "invoke", "Args": ["roamer", "she", "10"]}'
  • REST API
POST http://192.168.2.10:7050/chaincode
    {
        "jsonrpc": "2.0",
        "method": "invoke",
        "params": {
            "type": 1,
            "chaincodeID": {
                "name": "mycc"
            },
            "ctorMsg": {
                "function": "invoke",
                "args": ["roamer", "she", "5"]
            },
            "secureContext": "jim"  
        },
        "id": 3
    }

7. 獲取某個區塊的信息

  • REST API
GET 
http://192.168.2.10:7050/chain/blocks/1
http://192.168.2.10:7050/chain/blocks/2
......
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章