Build hyperledger fabric network

Env preparation(Mac OSX)

-Docker installed

docker --version

docker-compose --version

-Go installed

brew install go

add $GOPATH in ~/.bash_profile:

export GOPATH=/Users/xxx/go

export PATH=$PATH:$GOPATH/bin

-Build go source code directory structure:

cd $GOPATH

mkdir -p src/github.com/hyperledger

cd $GOPATH/src/github.com/hyperledger

git clone https://github.com/hyperledger/fabric.git

-Node.js+NPM installed

node --version

brew search ndoe

brew install node@6

brew unlink node

brew link --overwrite node@6 --force

node --version

npm install npm@3.10.10 -g

-Hyperledger Fabric Samples installed

Suggest create a project in a child directory under /Users directory:

git clone https://github.com/hyperledger/fabric-samples.git

cd fabric-samples

download Platform-specific Binaries

curl -sSL https://goo.gl/Gci9ZX | bash

Add environment var:

export PATH=<path to download location>/bin:$PATH

對應(yīng)幾個配置文件要加上版本,先訪問https://hub.docker.com/r/hyperledger/fabric-orderer/tags/ 找一個tag號,我選擇的是最新的x86_64-1.0.2:

fabric-samples/first-network/docker-compose-cli.yaml

找到并添加 image: hyperledger/fabric-tools:x86_64-1.0.2

fabric-samples/first-network/base/docker-compose-base.yaml

找到并添加 image: hyperledger/fabric-orderer:x86_64-1.0.2

fabric-samples/first-network/base/peer-base.yaml

找到并添加? image: hyperledger/fabric-peer:x86_64-1.0.2

創(chuàng)建網(wǎng)絡(luò)

打開fabric-sample下的示例first-network

cd first-network

其中byfn.sh為啟動這個網(wǎng)絡(luò)的啟動腳本,啟動腳本中除建立一個包含4個節(jié)點和1個Order service的網(wǎng)絡(luò)外,還會啟動一個容器用來執(zhí)行腳本在channel中加入節(jié)點,部署和初始化chaincode,以及在部署的chaincode上執(zhí)行交易。

啟動腳本

第一步,生成必要文件,執(zhí)行命令:

./byfn.sh -m generate

默認(rèn)channel名稱為mychannel,腳本程序會給網(wǎng)絡(luò)實例生成數(shù)字證書和密鑰;生成genesis block用來啟動ordering service;一些用來配置channel的配置交易。

第二步,啟動網(wǎng)絡(luò),執(zhí)行命令:

./byfn.sh -m up

當(dāng)你看到下面的文字的時候,說明啟動成功:

Starting with channel 'mychannel' and CLI timeout of '10000'

Continue (y/n)?y

proceeding ...

Creating network "net_byfn" with the default driver

Creating peer0.org1.example.com

Creating peer1.org1.example.com

Creating peer0.org2.example.com

Creating orderer.example.com

Creating peer1.org2.example.com

Creating cli


____? ? _____? ? ? _? ? ? ____? ? _____

/ ___|? |_? _|? ? / \? ? |? _ \? |_? _|

\___ \? ? | |? ? / _ \? | |_) |? | |

___) |? | |? ? / ___ \? |? _ <? ? | |

|____/? ? |_|? /_/? \_\ |_| \_\? |_|

Channel name : mychannel

Creating channel...

2017-05-16 17:08:01.366 UTC [msp] GetLocalMSP -> DEBU 004 Returning existing local MSP

2017-05-16 17:08:01.366 UTC [msp] GetDefaultSigningIdentity -> DEBU 005 Obtaining default signing identity

2017-05-16 17:08:01.366 UTC [msp/identity] Sign -> DEBU 006 Sign: plaintext: 0AB1070A6708031A0C08F1E3ECC80510...6D7963631A0A0A0571756572790A0161

2017-05-16 17:08:01.367 UTC [msp/identity] Sign -> DEBU 007 Sign: digest: E61DB37F4E8B0D32C9FE10E3936BA9B8CD278FAA1F3320B08712164248285C54

Query Result: 90

2017-05-16 17:08:15.158 UTC [main] main -> INFO 008 Exiting.....

===================== Query on PEER3 on channel 'mychannel' is successful =====================


執(zhí)行結(jié)束后,終端顯示如下:

===================== All GOOD, BYFN execution completed =====================


_____? _? _? ____

| ____| | \ | | |? _ \

|? _|? |? \| | | | | |

| |___? | |\? | | |_| |

|_____| |_| \_| |____/


關(guān)閉網(wǎng)絡(luò):

./byfn.sh -m down

上面通過腳本./byfn.sh生成了一個fabric網(wǎng)絡(luò),接下來我們將詳細(xì)說明腳本中所執(zhí)行的命令信息。

創(chuàng)建一個Hyperledger Fabric網(wǎng)絡(luò)

Crypto Generator

我們將使用cryptogen工具為我們的網(wǎng)絡(luò)節(jié)點生成證書信息,證書信息可以代表每一個實例節(jié)點,用于節(jié)點間的通信和交易。

cryptogen使用的配置文件為crypto-config.yaml。配置文件中描述了網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)同時會為Orgnizations和Orgnizations下的節(jié)點生成一系列的證書。每個Orgnization會有一個根證書ca-cert用來綁定特定節(jié)點(peer或者order)到該Orgnization。通過對每個Orgnization頒發(fā)一個唯一的數(shù)字證書,我們可以模仿典型的區(qū)塊鏈網(wǎng)絡(luò),每個加入鏈的成員使用自己的數(shù)字證書進(jìn)行獲取授權(quán)。交易和通信使用節(jié)點的私鈅,驗證使用節(jié)點的公鑰(數(shù)字證書)。配置文件里的count參數(shù)用來指定每個Orgnization的節(jié)點數(shù)量,本例子中一個Orgnization下面包含兩個節(jié)點,所以count的值在本例中設(shè)定為2。

在運行這個命令之前,我們快速的看一下crypto-config.yaml里的配置信息。特別要關(guān)注OrderOrgs header下的Name,Domain和Specs幾個參數(shù)。

OrdererOrgs:

? - Name: Orderer

? ? Domain: example.com

? ? Specs:

? ? ? - Hostname: orderer

PeerOrgs:

? - Name: Org1

? ? Domain: org1.example.comabove

? ? Template:

? ? ? Count: 2

? ? Users:

? ? ? Count: 1

? - Name: Org2

? ? Domain: org2.example.com

? ? Template:

? ? ? Count: 2

? ? Users:

? ? ? Count: 1

網(wǎng)絡(luò)節(jié)點的命名規(guī)則為{Hostname}.{Domain}。以上述配置文件中order節(jié)點為例,order節(jié)點的命名為orderer.example.com,對應(yīng)的MSP Id為Orderer。

運行cryptogen命令后,生成的數(shù)字證書和密鑰信息保存在crypto-config文件夾中。

Configuration Transaction Generation

配置交易生成工具:configtxgen 用來生成4個配置信息

orderer genesis block

fabric channel configuration transaction

2個anchor peer transaction (每個Peer Org生成一個)

orderer block是ordering service的起始block,channel配置交易文件在channel創(chuàng)建時廣播到orderer。anchor peer交易用來指定channel上每個Org的Anchor Peer。

configxgen的配置文件為configtx.yaml,其中包含對我們所創(chuàng)建的示例網(wǎng)絡(luò)的定義。配置文件包含3個角色,一個Orderer Org(OrderOrg)和兩個Peer Orgs(Org1和Org2)。配置文件也指定了一個組合SampleConsortium,包含2個Peer Org。打開配置文件,配置文件頂部Profiles部分有兩個唯一的headers。其中TwoOrgsOrderedGenesis用來配置orderer genesis block,TwoOrgChannel用來配置我們的channel。

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-config/ordererOrganizations/example.com/msp

? ? - &Org1

? ? ? ? Name: Org1MSP

? ? ? ? ID: Org1MSP

? ? ? ? MSPDir: crypto-config/peerOrganizations/org1.example.com/msp

? ? ? ? AnchorPeers:

? ? ? ? ? ? - Host: peer0.org1.example.com

? ? ? ? ? ? ? Port: 7051

? ? - &Org2

? ? ? ? Name: Org2MSP

? ? ? ? ID: Org2MSP

? ? ? ? MSPDir: crypto-config/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:

上述配置文件中還包含兩個沒有特別意義的指定信息。第一個,我們?yōu)槊恳粋€Peer Org指定了Anchor Peer(peer0.org1.example.com和peer0.org2.example.com)。第二點,我們指定了每個角色的MSP路徑,從而允許我們把每個Org的根證書存儲在orderer genesis block中。這是一個重要的概念。現(xiàn)在每個節(jié)點和ordering service通信都需要驗證通過他們的數(shù)字證書。

運行cryptogen和configtxgen命令

可以手動運行上述兩個命令生成數(shù)字證書/密鑰或者生成配置交易。也可以通過修改腳本byfn.sh腳本實現(xiàn)上述目標(biāo)。

手動生成證書和配置交易

可以參考byfn.sh腳本中的generateCerts函數(shù)理解生成網(wǎng)絡(luò)配置中數(shù)字證書的命令。為了便利,這里我們也提供了一種參考方法。

首先運行cryptogen工具。cryptogen命令在first network子目錄的bin目錄下,下面運行命令使用了該命令所在位置的相對路徑。

../bin/cryptogen generate --config=./crypto-config.yaml

接下來,我們需要告訴configtxgen工具引用哪里的配置文件configtx.yaml。這里我們通過設(shè)置環(huán)境變量來設(shè)定配置文件的路徑。

export FABRIC_CFG_PATH=$PWD

../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

接下來,我們創(chuàng)建channel交易。確保替換$CHANNEL_NAME的值或者設(shè)置CHANNEL_NAME作為一個環(huán)境變量。創(chuàng)建命令如下:

export CHANNEL_NAME=mychannel

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

接下來,在我們創(chuàng)建的channel上定義Org1的Anchor Peer節(jié)點。執(zhí)行命令為:

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

在channel上定義Org2的Anchor Peer節(jié)點:

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

啟動網(wǎng)絡(luò)

我們引用一個docker-compose腳本啟動網(wǎng)絡(luò),docker-compose文件引用了我們之前下載的鏡像文件同時根據(jù)之前生成的genesis.block引導(dǎo)orderer。注釋掉其中的command代碼:

working_dir:

/opt/gopath/src/github.com/hyperledger/fabric/peer

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

$TIMEOUT'

volumes

如果不注釋,網(wǎng)絡(luò)啟動時腳本會執(zhí)行所有的CLI命令。這里我們手動的執(zhí)行每一條命令,以便于我們了解命令的語法和功能。

給TIMEOUT參數(shù)傳遞一個相對較大的值(單位為秒);否則CLI容器默認(rèn)會在60s后退出。

啟動網(wǎng)絡(luò):

CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=60 docker-compose -f docker-compose-cli.yaml up -d

如果你想實時查看執(zhí)行上述命令的日志信息,那么去掉上面的-d選項(后臺運行)。如果打開了上述日志流,那么你需要另外再打開一個終端用來執(zhí)行CLI命令。

環(huán)境變量

為了在peer0.org1.example.com上執(zhí)行下面的CLI命令,需要先配置下面4個環(huán)境變量。peer0.org1.example.com的這些變量我們已經(jīng)在CLI容器中配置了,因此我們可以不用傳遞這些環(huán)境變量的值了。但是,如果你想發(fā)送命令到其他peer或者orderer,你需要提供這些變量相應(yīng)的值。檢查docker-compose-base.yaml查看那指定的路徑。

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

CORE_PEER_ADDRESS=peer0.org1.example.com:7051

CORE_PEER_LOCALMSPID="Org1MSP"

CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt

創(chuàng)建和加入channel

執(zhí)行docker exec命令進(jìn)入CLI容器

docker exec -it cli bash

成功執(zhí)行后,出現(xiàn)如下提示:

root@0d78bb69300d:/opt/gopath/src/github.com/hyperledger/fabric/peer#

之前,我們使用configtxgen工具生成了配置交易channel.tx。我們將會傳遞這個交易到orderer作為創(chuàng)建channel請求的一部分。

注意:--cafile選項是orderer的根證書存放在本地的路徑,該信息可以用來驗證TLS握手過程。

我們使用-c選項指定channel的名字,使用-f選項指定配置交易。在本例中為channel.tx,你也可以mount配置交易為一個不同的名字。(配置交易通過本地路徑mount到容器中)

export CHANNEL_NAME=mychannel

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

這條命令返回一個genesis block <channel-ID.block>。該block可以用來加入channel時使用,block中包含了channel.tx中指定的配置信息。

如果遇到以下錯誤:

Error: Got unexpected status: BAD_REQUEST Usage:? peer channel create [flags]

說明channel已經(jīng)被使用了,換個channel重頭來一遍就好。

你需要留在CLI容器中執(zhí)行剩余的手動命令。如果發(fā)送命令的目標(biāo)不是peer0.org1.example.com,那么要重新設(shè)置相應(yīng)的環(huán)境變量。現(xiàn)在我們加入peer0.org1.example.com到channel中,其中<channle-ID.block>替換為你自己的channel,當(dāng)前用的是mychannel.block:

peer channel join -b <channel-ID.block>

你可以修改上邊4個環(huán)境變量的值為其他peer節(jié)點信息配置加入其他節(jié)點到channel中。

安裝和實例化chaincode

我們利用一個簡單的已寫好的chaincode。應(yīng)用通過chaincode和區(qū)塊鏈的賬本進(jìn)行交互,因此我們需要首先在每個peer節(jié)點上安裝chaincode用來執(zhí)行交易和背書交易,然后在channel上實例化chaincode。

首先安裝例子go代碼到4個peer節(jié)點中的一個。這個命令會把go源碼放在peer節(jié)點的文件系統(tǒng)中。

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

接下來,在channel上實例化chaincode。這將會在channel上初始化chaincode,為chaincode設(shè)置背書策略,為目標(biāo)peer啟動一個chaincode容器。注意-P參數(shù),這個參數(shù)指定了在該chaincode上一個交易被認(rèn)可需要的背書級別。

接下來的命令中,我們設(shè)置-P參數(shù)為OR ('Org0MSP.member','Org1MSP.member’)”

。這表示我們需要Org1或者Org2中一個peer節(jié)點的背書。如果改變語法為AND,那么就需要兩個背書

peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --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.member','Org2MSP.member')"

上述命令中的mycc為上文中peer上安裝的chaincode的名稱。

Query

下面查詢a的值,確認(rèn)chaincode被正確的實例化,stateDB正常的運行。查詢的語法如下:

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

Invoke

現(xiàn)在從a轉(zhuǎn)移10到b。這個交易會產(chǎn)生一個新的區(qū)塊并更新stateDB。調(diào)用的語法是:

peer chaincode invoke -o orderer.example.com:7050? --tls $CORE_PEER_TLS_ENABLED --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"]}'

現(xiàn)在再次查詢,查看上述轉(zhuǎn)移10的命令是否已經(jīng)成功執(zhí)行,執(zhí)行的命令是:

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

正常執(zhí)行,會輸出如下提示:

Query Result: 90

這背后發(fā)生了什么

下面描述docker-compose-cli.yaml文件中沒有注釋script.sh時的執(zhí)行情況。去掉包含script.sh腳本執(zhí)行的注釋,然后使用docker-compose命令再次啟動網(wǎng)絡(luò)。

script.sh腳本在CLI容器里已經(jīng)備份過,腳本執(zhí)行createChannel命令根據(jù)設(shè)定的channel名字,使用channel.tx文件作為channel配置交易。

createChannel執(zhí)行的輸出是一個genesis block-<your channel name>.block。輸出存儲在peer節(jié)點的文件系統(tǒng)上包含了channel.tx所指定的channel配置信息。

joinChannel命令被執(zhí)行(4個peer節(jié)點),joinChannel命令使用上文生成的genesis

block作為參數(shù),該命令引導(dǎo)peer節(jié)點加入到<your channel name>并且建立一個以<your

channel name>.block為起始的鏈。

目前我們建立了一個包含4個節(jié)點的channel, channel包含兩個orgnizations。類似TwoOrgsChannel文件的配置。

peer0.org1.example.com和peer1.org1.example.com屬于Org1;peer0.org2.example.com和peer1.org2.example.com屬于Org2

這些關(guān)系在crypto-config.yaml里定義,MSP的路徑在docker compose中指定

Org1MSP的Anchor Peer(peer0.org1.example.com)和Org2MSP的Anchor peer(peer0.org2.example.com)被更新。我們通過傳遞Org1MSPanchor.tx和Org2MSPanchor.tx以及channel的名字到ordering service來實現(xiàn)這一步。

將編寫好的chaincode_example02安裝在peer0.org1.example.com和peer0.org2.example.com上(這里并沒有安裝在所有peer上,而是僅安裝在anchor

peer節(jié)點上,anchor peer節(jié)點之前每個Org設(shè)置了一個)

chaincode在peer0.org2.example.com上實例化。實例化過程添加chaincode到channel中,為目標(biāo)peer啟動容器,同時初始化與chaincode相關(guān)的key-value鍵值對。本例中初始化的值為[“a”: ”100”, “b”: ”200”]。實例化后會啟動一個容器dev-peer0.org2.example.com-mycc-1.0。(實例化過程發(fā)送至peer0.org2.example.com上執(zhí)行)

實例化過程也傳遞了一個背書策略的參數(shù)。背書策略類似形式:-P "OR ('Org1MSP.member','Org2MSP.member')",代表任何交易必須被Org1或Org2的一個peer背書。

在peer0.org1.example.com上執(zhí)行查詢a的值。chaincode之前已經(jīng)安裝在peer0.org1.example.com上了,因此查詢操作會為Org1的peer0節(jié)點啟動一個容器dev-peer0.org1.example.com-mycc-1.0。查詢結(jié)果也會返回回來,這個過程中沒有任何寫操作發(fā)生,所以a的值還是100。

發(fā)送一個轉(zhuǎn)移賬戶金額的調(diào)用到peer0.org1.example.com,從a賬戶轉(zhuǎn)移10單位至b賬戶

chaincode然后安裝在peer1.org2.example.com上

發(fā)送查詢a賬戶操作至peer1.org2.example.com。這將啟動第三個chaincode容器dev-peer1.org2.example.com-mycc-1.0。返回金額90,說明之前帳號金額的轉(zhuǎn)移操作成功執(zhí)行。

這說明了什么

為了在賬本上成功的執(zhí)行讀寫操作,chaincode必須安裝在peer上。另外,chaincode容器直到實例化或者傳統(tǒng)交易-讀寫執(zhí)行的時候(例:查詢a賬戶的值),chaincode容器才會啟動。channel中的每個節(jié)點都維護(hù)了賬本的完全復(fù)制,存儲了不可改變的、序列化的記錄區(qū)塊以及state database用于保存當(dāng)前的fabric狀態(tài)。即便是那些沒有安裝chaincode的節(jié)點(例如peer1.org1.example.com)也會同步賬本。最終chaincode在安裝到peer1.org1.example.com后就可以被調(diào)用了,因為chaincode已經(jīng)完成了實例化。

怎樣查看交易信息

查看CLI docker容器的日志信息

docker logs -f cli

可以看到交易的詳細(xì)過程

怎樣查看chaincode的日志

在每個chaincode container上可以查看當(dāng)前container里所執(zhí)行過的交易。具體查看命令如下:

$ docker logs dev-peer0.org2.example.com-mycc-1.0

04:30:45.947 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]

ex02 Init

Aval = 100, Bval = 200

$ docker logs dev-peer0.org1.example.com-mycc-1.0

04:31:10.569 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]

ex02 Invoke

Query Response:{"Name":"a","Amount":"100"}

ex02 Invoke

Aval = 90, Bval = 210

$ docker logs dev-peer1.org2.example.com-mycc-1.0

04:31:30.420 [BCCSP_FACTORY] DEBU : Initialize BCCSP [SW]

ex02 Invoke

Query Response:{"Name":"a","Amount":"90"}

理解docker-compose拓?fù)浣Y(jié)構(gòu)

BYFN例子提供了兩種docker-compose文件配置,每一種都是由docker-compose-base.yaml(文件存放在base文件夾中)文件拓展而來。第一個配置文件是docker-compose-cli.yaml,該配置文件配置了一個CLI容器,一個orderer,4個peer節(jié)點。使用該配置文件啟動可以實現(xiàn)本文中的所有操作指令。第二種配置文件docker-compose-e2e.yaml是配置啟動一個使用Node.js SDK的點對點測試。這個配置文件的主要區(qū)別是包含了fabric-ca-servers容器。因此,我們可以使用REST接口實現(xiàn)向CA組織注冊和登記用戶。

如果你想使用docker-compose-e2e.yaml并且不先運行byfn.sh腳本,那么我們需要做4個微改動。我們需要設(shè)定Organization CA的私鈅。你可以設(shè)定這些值為你的crypto-config文件夾。例如設(shè)置Org1的私鈅路徑為:crypto-config/peerOrganizations/org1.example.com/ca/。私鈅文件是一個長hash值加上_sk組成。設(shè)定Org2的私鈅為crypto-config/peerOrganizations/org2.example.com/ca/。另外兩處改動是修改docker-compose-e2e.yaml中ca0和ca1配置中的FABRIC_CA_SERVER_TLS_KEYFILE變量對應(yīng)的值。需要指定tls證書所在的路徑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容