1. 程式人生 > >Hyperledger Fabric開發(二):建立網路

Hyperledger Fabric開發(二):建立網路

執行fabric-samples專案中的一個例子:first-network,建立第一個網路(Building Your First Network)。
該網路共有4個peer節點,劃分為2個組織(organizations),以及1個單獨的orderer節點,另外還需要一個容器來執行建立和加入channel、部署和執行chaincode等命令。
執行該例子需要下載的檔案有:fabric-samples專案特定的平臺二進位制檔案所需的映象檔案

準備

專案下載

在已設定的GOPATH路徑下從github克隆fabric-samples專案

mkdir -p ~/go/src/github.com
/hyperledger cd ~/go/src/github.com/hyperledger git clone -b master https://github.com/hyperledger/fabric-samples.git cd fabric-samples
平臺檔案和映象檔案

一、指令碼自動化下載

1.官方文件提供了極為簡便的命令,執行即可完成下載

curl https://goo.gl/6wtTN5 | bash -s 1.1.0-alpha

版本可自由選擇,這裡選的是1.1.0-alpha

2.由於上面的curl命令使用的是google的短網址,在國內下載緩慢,文件提供了可替換的url

,命令如下:

curl -sSL https://github.com/hyperledger/fabric/blob/master/scripts/bootstrap.sh | bash -s 1.1.0-alpha

二、手動分步下載

1.特定的二進位制平臺檔案(Platform-specific Binaries)
先下載平臺檔案,開啟bootstap.sh指令碼檔案檢視原始碼,可以找到下載地址,選擇合適的版本,當前最新是darwin-amd64-1.1.0-alpha/,然後選擇hyperledger-fabric-darwin-amd64-1.1.0-alpha.tar.gz
解壓後可獲得bin

目錄,其中包含檔案cryptogen, configtxgen, configtxlatorpeer。將bin目錄至於fabric-sample目錄下並加入系統環境變數,開啟配置檔案vim ~/.bash_profile後新增

export PATH=$HOME/hyperledger/fabric-samples/bin:$PATH

2.映象檔案下載(images)
所需的映象檔案有peer, orderer, ca, ccenv, javaenv, kafka, zookeeper, couchdbtools。通過docker pull命令從docker hub中逐一拉取映象,例如:

docker pull hyperledger/fabric-peer:x86_64-1.1.0-alpha

注意後面要帶上標籤,否則會下載失敗,全部拉取完成後,為了保證網路的成功執行,需要給每個映象打上latest標籤。格式和示例如下:

docker tag IMAGEID(映象id) REPOSITORY:TAG(倉庫:標籤)
docker tag f00c5d490d19 docker.io/hyperledger/fabric-peer:latest

這裡寫圖片描述

執行

1.生成配置資訊
cd ~/hyperledger/fabric-samples
./byfn.sh -m generate

該命令利用平臺檔案中的crypotogenconfigtxgen工具主要完成以下工作:生成網路成員所需的證書和金鑰,生成創世排序區塊(Orderer Genesis block),以及生成一系列配置channel所需的配置交易(configuration transactions),並且生成Org1和Org2的Anchor節點更新交易。成功執行後,生成crypto-config目錄和channel-artifacts目錄。

這裡寫圖片描述

2.啟動網路
./byfn.sh -m up

該行命令利用docker-compose up命令執行所有映象,主要完成的工作有:構建4個peer節點和1個orderer節點,建立channel並把4個peer節點加入其中,在各peer節點上安裝chaincode並執行相關操作。

這裡寫圖片描述

3.結束執行

./byfn.sh -m down

該命令會終止所有正在執行的容器,刪除生成的配置檔案,並刪除chaincode映象。

分析

1.證書生成器
  • 使用二進位制平臺檔案中的cryptogen工具來為網路中的實體生成證書(certificates),這些證書是身份的象徵,它們允許我們的實體在交流和交易的時候進行簽名(sign)和身份驗證(verify authentication)。

  • cryptogen工具讀取包含網路拓撲資訊的crypto-config.yaml配置檔案來生成相關證書,併為組織和這些組織的成員生成一組證書和金鑰。每個組織都分配了一個唯一的根證書(ca-cert),它將特定成員(peers and orderer)繫結到該組織。在這個典型的網路中,成員將使用證書授權(Certificate Authority)生成屬於自己的證書,Hyperledger Fabric中的交易和通訊由實體的私鑰(keystore)簽名,然後通過公鑰(signcerts)進行驗證。

2.配置交易生成器
  • configtxgen tool用來生成4個配置檔案:
    orderer genesis block:排序服務(ordering service)的創世區塊。
    channel configuration transaction:通道配置交易,會在channel建立時廣播給orderer。
    two anchor peer transactions:指定通道上兩個組織的錨節點(Anchor Peer)。

  • configtxgen tool讀取配置檔案configtx.yaml,該檔案包含該簡單網路的定義。
    1.檔案頂部的Profiles部分有兩個頭部,一個是TwoOrgsOrdererGenesis用於生成orderer genesis block,一個是TwoOrgsChannel,用於生成channel配置交易,這兩個頭部會在生成配置資訊作為引數傳遞進去。
    2.檔案的Organizations部分顯示該網路有3個成員,OrdererOrg,Org1,Org2。檔案指定了一個聯盟(SampleConsortium),由兩個Peer Orgs組成。每個Org中指定了MSP的目錄位置,其中兩個Peer Org裡還指定了AnchorPeers,該值定義了能夠用於跨越組織通訊(cross org gossip communication)的節點的位置。該部分將會在後續的配置中被引用。
    3.檔案的Orderer部份定義了一些將會用作排序相關操作引數的值,它們被編碼(encode)入配置交易或者創世區塊中。

  • 配置檔案中儲存了網路每個成員(組織和節點)的MSP目錄,因此可以將每個組織的根證書(cacerts)儲存在orderer genesis block中,當網路實體與ordering service通訊時,就能對實體的數字簽名進行驗證。過程是:通過創世排序區塊中的CA證書得到CA公鑰,然後用CA公鑰對交易或通訊中的證書進行驗證,身份驗證成功後得到實體節點的公鑰,然後用該公鑰來驗證資訊的完整性。

3.手動執行工具
  • 生成證書
    當前路徑位於first-network目錄下,bin檔案在上一級目錄fabric-samples中,執行以下命令後證書和祕鑰(也就是MSP material)會被輸出到crypto-config目錄中。

    ../bin/cryptogen generate --config=./crypto-config.yaml
    
  • 生成創世區塊
    首先需要告訴configtxgen去哪找到需要的配置檔案configtx.yaml,所以要在執行命令前先設定一個環境變數

    export FABRIC_CFG_PATH=$PWD
    ../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
    
  • 建立channel配置交易(channel.tx)
    執行命令前需要設定$CHANNEL_NAME環境變數。

    export CHANNEL_NAME=mychannel
    ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

    接下來,在我們正在構建的channel上定義兩個anchor peer(for Org1 and Org2)。

    ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
    ../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP

    生成的order genesis block 和 channel transaction artifacts都將輸出到channel-artifacts目錄下。最終目錄包含4個檔案:genesis.block,channel.tx,Org1MSPanchors.tx和Org2MSPanchors.tx

4.啟動網路
  • 注意: 在執行之前,需要修改docker-compose-cli.yaml檔案,註釋掉以下一行:

    command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME} ${DELAY}; sleep $TIMEOUT'

    該行程式碼會使cli容器執行的時候自動執行指令碼script.sh,會進行建立channel,加入節點等等一系列操作,此時如果再進行手動執行,並把CHANNEL_NAME設定為mychannel,就會出現channel名稱重複問題,從而報錯 Error: got unexpected status: BAD_REQUEST

    執行docker-compose命令啟動網路

    docker-compose -f docker-compose-cli.yaml up -d

    如果cli容器處於睡眠狀態,可通過docker run cli重新執行。

  • 建立channel並加入節點
    CLI容器針對peer0.org1.example.com操作所需要的環境變數已經設定好了,但如果需要對其他peer或者orderer節點進行操作,則需要提供這些變數值。
    首先進入CLI容器中:

    docker exec -it cli bash

    接下來先定義CHANNEL_NAME變數,然後建立channel,將channel.tx作為建立channel請求的一部分發送給orderer,其中-c引數是channel name,-f引數是channel配置交易(channel.tx),--cafile引數指定了orderer的根證書路徑,用於驗證TLS握手。

    export CHANNEL_NAME=mychannel
    peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    

    上述命令將生成一個<channel-ID.block>,在這裡是mychannel.block,現在將節點peer0.org1.example.com加入channel。

    peer channel join -b mychannel.block

    當需要加入其它節點的時候,需要將環境變數傳入,這裡繼續加入peer0.org2.example.com

    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected].example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:7051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer channel join -b mychannel.block
    
  • 更新anchor peers
    下面的命令將更新channel的定義從而定義anchor peers,本質上只是在channel的genesis block之上添加了一些配置資訊。
    定義Org1的anchor peer: peer0.org1.example.com

    peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
    

    定義Org2的anchor peer:peer0.org2.example.com,同樣的,需要加上環境變數

    CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected].example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:7051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
  • 安裝並例項化(instantiate)鏈碼(chaincode)
    這裡使用的是已經存在的chaincode,應用通過chaincode與區塊鏈進行互動,我們需要在每個peer節點上安裝chaincode,原始碼會被存放在節點的檔案系統中,然後在channel上例項化chaincode。
    注意: 文件中chaincode在cli容器檔案系統內的地址是
    github.com/chaincode/chaincode_example02/go/
    ,而我的實際路徑為github.com/hyperledger/fabric/examples/chainco
    de/go/chaincode_example02
    。(更新於4.12,release-1.1版本的路徑與文件中一致)
    安裝Golang語言編寫的chaincode:

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

    例項化chaincode,這會在channel上初始化chaincode,併為目標節點執行一個chaincode容器。注意-P引數設定了endorsement的策略,這裡是OR ('Org0MSP.peer','Org1MSP.peer'),表示需要屬於Org1**或者**Org2的1個peer進行1次背書(endorsement)。例項化命令如下:

    peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
  • 查詢(Query)
    首先查詢a的值,以確保chaincode成功例項化並且狀態資料庫(state DB)被成功填充。

    peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'

    查詢結果為 Query Result: 100

  • 呼叫(Invoke)
    從a賬戶轉移10個數額到b賬戶,這個命令將會把交易傳送至orderer節點並建立新的block,同時更新stateDB。

    peer chaincode invoke -o orderer.example.com:7050  --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

    再次呼叫Query命令可得到結果Query Result: 90

5.執行過程分析

以下是通過./byfn.sh -m up啟動網路時,執行script.sh指令碼所進行步驟:

  • script.sh指令碼在CLI容器內執行,該指令碼執行了createChannel命令,提供了channel的名字,並且使用channel.tx作為配置檔案,來建立一個channel。
  • createChannel的輸出是一個genesis block,儲存在peer的檔案系統中。block中儲存了channel的配置資訊(由channel.tx指定)。
  • joinChannel命令將4個peer加入channel中,用上面建立的genesis block作為輸入,建立了一條以該創世區塊為開始的chain
  • 更新兩個org的anchor peers,將Org1MSPanchors.txOrg2MSPanchors.tx傳送給ordering service以實現更新。
  • chaincode (chaincode_example02)被安裝在peer0.org1peer0.org2中。使chaincode在peer0.org2中例項化,將chaincode新增到channel中,執行容器dev-peer0.org2.example.com-mycc-1.0
  • 查詢(query)peer0.org1節點中a的值,結果為100, 由於chaincode在該節點已經完成install,所以該查詢操作會執行一個chaincode容器。接著在該節點中(invoke)從a的賬戶向b轉移10金額。
  • peer1.org2中下載chaincode。向該節點發送查詢a的操作,同樣又會執行第3個新的chaincode容器。得到查詢的值為90。注意這裡的每個fabric節點中,是沒有資料庫副本的(database replicas),即對資料庫的寫入是可以保證資料一致性。

相關推薦

Hyperledger Fabric開發建立網路

執行fabric-samples專案中的一個例子:first-network,建立第一個網路(Building Your First Network)。 該網路共有4個peer節點,劃分為2個組織(organizations),以及1個單獨的orde

星雲鏈智能合約開發Mac下安裝星雲鏈

Mac下安裝星雲鏈 星雲鏈智能合約開發 Golang環境搭建 版本用最新版:1.10.2 安裝 brew install go 配置環境變量 vi ~/.bash_profile 打開.bash_profile文件,按"i"鍵可進行編輯,添加: export GOROOT=/u

HyperLeger Fabric開發——HyperLeger Fabric入門

out 版本 comm 開發 https .gz image roc 繼續 HyperLeger Fabric開發(二)——HyperLeger Fabric入門 本文使用RHEL 7.3 workstation版本操作系統。 一、HyperLeger Fabric環境部署

scrapy爬蟲框架建立一個scrapy爬蟲

在建立新的scrapy爬蟲之前,我們需要先了解一下建立一個scrapy爬蟲的基本步驟 一、確定要爬取的資料 以爬取豆瓣電影資料為例: 每部電影所要爬取的資訊有: 片名:《頭號玩家》 導演: 史蒂文·斯皮爾伯格 編劇: 扎克·佩恩 / 恩斯特·克萊

hyperledger fabric 學習之-hyperledger fabric 的與眾不同

一、作為linux基金會下的一個開源專案,有linux基金會作背書,顯然發展不會差,第一波加入的公司和組織就非常的高大上,更加說明這個專案的牛逼性(一個人說你厲害,不見得你厲害,一百個人說你厲害,你自然就很厲害了) 二、模組化以及可配置的架構      fa

即時通訊音視訊開發視訊編解碼之數字視訊介紹

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 本文是系列文章中的第2篇,本系列文章的大綱如下:   《即時

Python爬蟲開發整站爬蟲與Web挖掘

0×00 介紹 在網際網路這個複雜的環境中,搜尋引擎本身的爬蟲,出於個人目的的爬蟲,商業爬蟲肆意橫行,肆意掠奪網上的或者公共或者私人的資源。顯然資料的收集並不是為所欲為,有一些協議或者原則還是需要每一個人注意。本文主要介紹關於爬蟲的一些理論和約定協議,然後相對完整完成一個爬蟲的基本功能。 本

React Native在window下的環境搭建建立新專案

React Native建立一個新專案: react-native init TestAndroidApp提示:你可以使用--version引數(注意是兩個槓)建立指定版本的專案。例如react-native init TestAndroidApp --version 0.44.3。注意版本號必須精確

【鏈塊技術53期】超級賬本Fabric教程 Docker的部署和安裝

原文連結:超級賬本Fabric教程 Docker的部署和安裝(下) 本節分享超級賬本執行環境docker容器的搭建。   四、Docker compose 4.1 能夠在主機上創建出相互隔離的網路,通過命令列管理多個容器。 在mac和windows中都集成了compos

【鏈塊技術52期】超級賬本Fabric教程Docker的部署和安裝

原文連結:超級賬本Fabric教程(二):Docker的部署和安裝(上) 本節分享超級賬本執行環境docker容器的搭建。   一、目錄 HyperLedger超級賬本執行環境-Docker容器介紹   二、推薦linux系統  

2 Lucene筆記建立LuceneUtils工具

publicclass LuceneUtils { public LuceneUtils() {} private static Directory directory; private static Version versio

Fabric實踐使用者收入支出記錄Chaincode

摘要 在上一篇文章中實現了一個簡單的使用者登陸驗證的Chaincode,接下實現用於記錄使用者收支情況的Chaincode Chaincode /** * file:journal_chaincode.go **/ package main i

Composer筆記建立自己的PHP類庫

一、在建立類庫之前,你必須有一個github的賬號,作為程式碼託管,github是非常好的一個選擇 >github主頁:https://github.com 二、在windows下載並安裝gi

webpack4系列教程建立專案,打包第一個JS檔案

傳送門: webpack4系列教程(一):初識webpack   1. 建立專案 1.1 初始化一個專案 首先安裝nodejs,開啟 nodeJs官網 直接下載安裝即可,安裝完畢後開啟命令列工具,進入你的專案資料夾,執行 npm init 進

使用NetBeans進行J2ME開發把程式轉移到手機上

原文地址:http://juansusan.iteye.com/admin/blogs/251869/edit【IT168 技術文件】上一篇,我們見識了編寫一個手機程式其實很簡單。但是很多人大概不是很明白怎樣把程式轉移到手機上,不信你就試試,不管你是用資料線,還是用紅外藍芽,

Apple Watch開發--Xcode建立專案及其結構

      在上一篇文章中介紹了Apple Watch的特點和app執行模式,那麼這篇我們來看下如何利用Xcode建立一個Apple Watch的project。 一、 執行環境       首先我們來用這個Xcode建立Watch app的時候肯定要注意開發環境,Wat

activiti自定義流程之Spring整合activiti-modeler5.16例項建立流程模型

1.maven導包,這裡就沒有什麼多的好說了,直接程式碼: <dependencies> <dependency> <groupId>junit</groupId> <artifact

iOS藍芽開發iOS 藍芽4.0中心模式 程式碼實現

上一篇簡單介紹了藍芽的部分基礎知識,詳細的東西大家可以去github上搜babyBluetooth,裡面有一些學習資料 iOS連線外設的流程 建立中心管理者 掃描外設 discoverPeripheral 連線外設 connectPeripheral

Magnolia-cms建立hello Mognolia

 本文將介紹如何建立一個基礎的專案。按照國際慣例,先從hello Mognolia開始。下面是效果圖:  在上一講中,已經安裝並配置好了Mognolia-bundle,目錄結構為tomcat+light-modules。 建立專案 進入light-modules,在該位置

Unity3D開發NGUI之UIButton"禁用"狀態時置灰

NGUI中的Button幾乎是最常用到的控制元件之一,並且可以組合各種元件(比如UIButtonColor,UIButtonOffset,UITweenxx),方便設定Button的各種狀態下的屬性,幾乎可以滿足我們的所有需求。 但是對於當Button的isEnabled屬