超級賬本HyperLedger的Fabric“全手動”、“多節點”部署教程,帶視訊演示
說明
雖然通過Building Your First Network中的docker-compose檔案可以直接啟動一個all-in-one的fabric。 但這種方式隱藏了太多的細節,只能讓人有個模糊的認識,對生產環境中部署方式、多伺服器部署,依然不清不楚, 對各元件的配置檔案也完全不瞭解。
通過反覆閱讀Fabric的文件,以及Building Your First Network中的指令碼,經歷了諸多磨難之後,總算弄清楚了Fabric的元件間關係與配置項。
規劃
建立一個名為fabric-deploy的目錄,用來存放部署過程使用到的檔案。
mkdir ~/fabric-deploy
這裡將用三臺機器部署一個fabric網路,該網路中有兩個組織:
org1.example.com
org2.example.com
一個order:
orderer.example.com
org1.example.com有兩個peer:
peer0.org1.example.com
peer1.org1.example.com
org2.example.com有一個peer:
peer0.org2.example.com
三臺機器的IP,以及部署的元件如下:
192.168.88.10 部署: orderer、[email protected]
192.168.88.11 部署: [email protected]
192.168.88.12 部署: [email protected]
相應域名的IP分別為:
192.168.88.10 orderer.example.com
192.168.88.10 peer0.org1.example.com
192.168.88.11 peer1.org1.example.com
192.168.88.12 peer0.org2.example.com
將這四條記錄新增到每臺機器的/etc/hosts檔案中。
每臺機器上還需要安裝docker:
yum install -y docker systemctl start docker
另外fabric的peer會呼叫docker,需要在所有peer上安裝docker,並提前下載映象:
docker pull hyperledger/fabric-javaenv:x86_64-1.1.0
docker pull hyperledger/fabric-ccenv:x86_64-1.1.0
docker pull hyperledger/fabric-baseos:x86_64-0.4.6
下載的映象需要與下面步驟中建立的core.yaml中的映象配對:
...
chaincode:
peerAddress:
id:
path:
name:
builder: $(DOCKER_NS)/fabric-ccenv:$(ARCH)-$(PROJECT_VERSION)
golang:
runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
car:
runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
java:
Dockerfile: |
from $(DOCKER_NS)/fabric-javaenv:$(ARCH)-$(PROJECT_VERSION)
...
建立合約的時候會用到這些映象,映象下載可能比較慢,根據自己的情況配置加速器。另外每個peer上都需要下載。
我在”區塊鏈實踐分享”中提供的fabric-deploy中下載包中提供了這三個映象,可以直接使用:
cd fabric-deploy/docker-images
./load.sh
編譯或下載fabric檔案
執行下面的命令可以下載編譯好的fabric以及依賴的映象:
curl -sSL https://goo.gl/6wtTN5 | bash
這裡使用的linux-amd64,fabric-1.1.0:
wget https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.1.0/hyperledger-fabric-linux-amd64-1.1.0.tar.gz
wget https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/linux-amd64-1.1.0/hyperledger-fabric-linux-amd64-1.1.0.tar.gz.md5
下載完成後校驗一下:
$ md5sum hyperledger-fabric-linux-amd64-1.1.0.tar.gz
6be979ccd903752aefba9da4fc9e1d44 hyperledger-fabric-linux-amd64-1.1.0.tar.gz
$ cat hyperledger-fabric-linux-amd64-1.1.0.tar.gz.md5
6be979ccd903752aefba9da4fc9e1d44
解壓後得到兩個bin和config兩個目錄:
tar -xvf hyperledger-fabric-linux-amd64-1.1.0.tar.gz
bin目錄中是fabric的元件,config是配置檔案模版。
$ ls bin/
configtxgen configtxlator cryptogen get-byfn.sh get-docker-images.sh orderer peer
$ ls config/
configtx.yaml core.yaml orderer.yaml
保留備用。
準備證書
證書的準備方式有兩種,一種用cryptogen
命令生成,一種是通過fabric-ca服務
生成。
cryptogen的方式
建立一個配置檔案crypto-config.yaml
,這裡配置了兩個組織,org1的Count是2,表示兩個peer:
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
Template:
Count: 1
Users:
Count: 1
然後執行crypto,生成證書:
./bin/cryptogen generate --config=crypto-config.yaml --output ./certs
certs目錄下生成了兩個目錄:
$ ls ./certs/
ordererOrganizations peerOrganizations
certs目錄的內容比較多,並且目錄很深,需要提前說明一下。搞清楚了這裡面檔案的含義,就懂了一半。
以certs/ordererOrganizations/example.com/orderers/orderer.example.com/
目錄中內容為例。
這裡目錄中的內容是用於orderer.example.com的,裡面有兩個子目錄tls
和msp
:
$ tree certs/ordererOrganizations/example.com/orderers/orderer.example.com/
certs/ordererOrganizations/example.com/orderers/orderer.example.com/
|-- msp
| |-- admincerts
| | -- [email protected]
| |-- cacerts
| | -- ca.example.com-cert.pem
| |-- keystore
| | -- 16da15d400d4ca4b53d369b6d6e50a084d4354998c3b4d7a0934635d3907f90f_sk
| |-- signcerts
| | -- orderer.example.com-cert.pem
| -- tlscacerts
| -- tlsca.example.com-cert.pem
-- tls
|-- ca.crt
|-- server.crt
-- server.key
tls目錄中的內容很好理解,它是order對外服務時使用的私鑰(server.key)和證書(server.crt),ca.crt是簽註這個證書的CA,需要提供給發起請求的一端。
msp中有五個目錄,對區塊鏈進行操作時需要使用這些檔案。
msp/admincerts
中存放的是使用者證書,使用該證書的使用者對orderer.example.com具有管理許可權。
msp/cacerts
是簽署msp/signcerts
中使用者證書的ca,可以用來校驗使用者的證書:
$ cd ./certs/ordererOrganizations/example.com/orderers/orderer.example.com/msp/
$ openssl verify -CAfile ./cacerts/ca.example.com-cert.pem admincerts/Admin\@example.com-cert.pem
admincerts/[email protected]: OK
msp/keystore
是orderer.example.com操作區塊,進行簽署時使用的的私鑰。
msp/signcerts
是orderer.example.com提供其它元件用來核實它的簽署的公鑰。
msp/tlscacerts
檔案與tls/ca.crt
相同。
這裡需要特別提到的是msp/admincerts
,在使用fabric時,你可能會發現有些操作需要admin許可權,例如在某個peer上安裝合約。
那麼管理員是如何認定的?就是看當前使用者的證書是不是在msp/admincerts
目錄中。
這個目錄中的內容目前是(版本1.1.x)啟動時載入的,因此如果在裡面新增或刪除檔案後,需要重啟使用到它的元件。
在ordererOrganizations/example.com/
還有其它幾個目錄:
ca msp orderers tlsca users
orderers中存放就簽名分析的每個orderer元件的證書檔案。
users中存放的使用者的證書檔案,與orderer.example.com
中內容基本相同,不過tls目錄中檔名變成了client.X
:
$ tree ordererOrganizations/example.com/users
ordererOrganizations/example.com/users
-- [email protected]
|-- msp
| |-- admincerts
| | -- [email protected]
| |-- cacerts
| | -- ca.example.com-cert.pem
| |-- keystore
| | -- 1ac3b40c9ddda7e7a0f724b18faa0ce6fdf3f9e9ff5eac59e1e3f9739499ac2d_sk
| |-- signcerts
| | -- [email protected]
| -- tlscacerts
| -- tlsca.example.com-cert.pem
-- tls
|-- ca.crt
|-- client.crt
-- client.key
certs/peerOrganizations
中的內容與certs/ordererOrganizations
中也基本相同,只不過它裡面存放的是peer要使用的證書檔案。
certs目錄中的檔案留著備用。
使用fabric-ca生成證書
只用fabric-ca生成證書的過程相對繁瑣很多,需要為每個元件、每個使用者生成,這裡不做示例。
orderer.example.com
建一個目錄存放orderer.example.com需要檔案:
mkdir orderer.example.com
先將bin/orderer以及證書複製到orderer.example.com目錄中。
cp bin/orderer orderer.example.com/
cp -rf certs/ordererOrganizations/example.com/orderers/orderer.example.com/* orderer.example.com/
然後準備orderer的配置檔案orderer.yaml
:
General:
LedgerType: file
ListenAddress: 0.0.0.0
ListenPort: 7050
TLS:
Enabled: true
PrivateKey: ./tls/server.key
Certificate: ./tls/server.crt
RootCAs:
- ./tls/ca.crt
# ClientAuthEnabled: false
# ClientRootCAs:
LogLevel: debug
LogFormat: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'
# GenesisMethod: provisional
GenesisMethod: file
GenesisProfile: SampleInsecureSolo
GenesisFile: ./genesisblock
LocalMSPDir: ./msp
LocalMSPID: OrdererMSP
Profile:
Enabled: false
Address: 0.0.0.0:6060
BCCSP:
Default: SW
SW:
Hash: SHA2
Security: 256
FileKeyStore:
KeyStore:
FileLedger:
Location: /opt/app/fabric/orderer/data
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:
#File: path/to/PrivateKey
Certificate:
#File: path/to/Certificate
RootCAs:
#File: path/to/RootCAs
Version:
注意,orderer將被部署在目標機器的/opt/apt/fabric/orderer
目錄中,如果要部署在其它目錄中,需要修改配置檔案中路徑。
這裡需要用到一個data目錄,存放orderer的資料:
mkdir orderer.example.com/data
peer0.org1.example.com
建一個目錄存放peer0.org1.example.com需要檔案:
mkdir peer0.org1.example.com
先將bin/peer以及證書複製到peer0.org1.example.com目錄中。
cp bin/peer peer0.org1.example.com/
cp -rf certs/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/* peer0.org1.example.com/
準備peer0.org1.example.com的配置檔案core.yaml:
logging:
peer: debug
cauthdsl: warning
gossip: warning
ledger: info
msp: warning
policies: warning
grpc: error
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
address: 0.0.0.0:7051
addressAutoDetect: false
gomaxprocs: -1
gossip:
bootstrap: 127.0.0.1:7051
bootstrap: peer0.org1.example.com: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: 1s
responseWaitTime: 2s
aliveTimeInterval: 5s
aliveExpirationTimeout: 25s
reconnectInterval: 25s
externalEndpoint: peer0.org1.example.com:7051
election:
startupGracePeriod: 15s
membershipSampleInterval: 1s
leaderAliveThreshold: 10s
leaderElectionDuration: 5s
events:
address: 0.0.0.0:7053
buffersize: 100
timeout: 10ms
tls:
enabled: true
cert:
file: ./tls/server.crt
key:
file: ./tls/server.key
rootcert:
file: ./tls/ca.crt
serverhostoverride:
fileSystemPath: /opt/app/fabric/peer/data
BCCSP:
Default: SW
SW:
Hash: SHA2
Security: 256
FileKeyStore:
KeyStore:
mspConfigPath: msp
localMspId: Org1MSP
profile:
enabled: true
listenAddress: 0.0.0.0:6060
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:
peerAddress:
id:
path:
name:
builder: $(DOCKER_NS)/fabric-ccenv:$(ARCH)-$(PROJECT_VERSION)
golang:
runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
car:
runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
java:
Dockerfile: |
from $(DOCKER_NS)/fabric-javaenv:$(ARCH)-$(PROJECT_VERSION)
startuptimeout: 300s
executetimeout: 30s
mode: net
keepalive: 0
system:
cscc: enable
lscc: enable
escc: enable
vscc: enable
qscc: enable
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
history:
enableHistoryDatabase: true
注意,peer將被部署在目標機器的/opt/apt/fabric/peer
目錄中,如果要部署在其它目錄中,需要修改配置檔案中路徑。
這裡需要用到一個data目錄,存放peer的資料:
mkdir peer0.org1.example.com/data
peer1.org1.example.com
過程與peer0.org1.example.com類似,注意將配置檔案中的名稱修改為peer1,並且不要拷錯證書。
這裡直接複製peer0.org1.exampl.com目錄,然後替換其中的檔案。
cp -rf peer0.org1.example.com/ peer1.org1.example.com/
rm -rf peer1.org1.example.com/msp/
rm -rf peer1.org1.example.com/tls/
cp -rf certs/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/* peer1.org1.example.com/
最後修改peer1.org1.example.com/core.yml,將其中的peer0.org1.exampl.com
修改為peer1.org1.example.com
,這裡直接用sed命令替換:
sed -i "s/peer0.org1.example.com/peer1\.org1\.example.com/g" peer1.org1.example.com/core.yaml
peer0.org2.example.com
過程與peer0.org1.example.com類似,注意將配置檔案中的名稱修改為org2,並且不要拷錯證書。
這裡直接複製peer0.org1.exampl.com目錄,然後替換其中的檔案。
cp -rf peer0.org1.example.com/ peer0.org2.example.com/
rm -rf peer0.org2.example.com/msp/
rm -rf peer0.org2.example.com/tls/
cp -rf certs/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/* peer0.org2.example.com/
最後修改peer0.org2.example.com/core.yml,將其中的peer0.org1.exampl.com
修改為peer0.org2.example.com
,這裡直接用sed命令替換:
sed -i "s/peer0.org1.example.com/peer0\.org2\.example.com/g" peer0.org2.example.com/core.yaml
將配置檔案中Org1MSP替換成Org2MSP:
sed -i "s/Org1MSP/Org2MSP/g" peer0.org2.example.com/core.yaml
開始部署
部署之前,先確保已經在每臺機器的/etc/hosts檔案中新增下列的記錄:
192.168.88.10 orderer.example.com
192.168.88.10 peer0.org1.example.com
192.168.88.11 peer1.org1.example.com
192.168.88.12 peer0.org2.example.com
注意根據你自己的環境情況修改。
在192.168.88.10上建立目錄:
mkdir -p /opt/app/fabric/{orderer,peer}
將orderer.example.com和peer0.org1.exmaple.com中的內容複製到192.168.88.10:
scp -r orderer.example.com/* [email protected]:/opt/app/fabric/orderer/
scp -r peer0.org1.example.com/* [email protected]:/opt/app/fabric/peer/
在192.168.88.11上建立目錄:
mkdir -p /opt/app/fabric/peer
將peer1.org1.exmaple.com中的內容複製到192.168.88.11:
scp -r peer1.org1.example.com/* [email protected]:/opt/app/fabric/peer/
在192.168.88.12上建立目錄:
mkdir -p /opt/app/fabric/peer
將peer0.org2.exmaple.com中的內容複製到192.168.88.12:
scp -r peer0.org2.example.com/* [email protected]:/opt/app/fabric/peer/
啟動前準備
order、peer都部署到位,但是對我這裡示意的場景,需要的檔案並不齊備。
檢視orderer.yaml檔案,你會看到有這樣幾行:
GenesisMethod: file
GenesisFile: ./genesisblock
GenesisProfile: SampleInsecureSolo
前兩行配置了創世塊的獲取方式。第一個區塊的獲取方式有多種,這裡採用最簡單的一種做法,用configtxgen生成。
沒有在前面的步驟中一次生成所有需要的檔案是因為,如果你修改了配置、使用了其它的方式,可能不需要這裡的操作。
回到存放了所有檔案的fabric-deploy目錄中,建立一個名為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: ./certs/ordererOrganizations/example.com/msp
- &Org1
Name: Org1MSP
ID: Org1MSP
MSPDir: ./certs/peerOrganizations/org1.example.com/msp
AnchorPeers:
- Host: peer0.org1.example.com
Port: 7051
- &Org2
Name: Org2MSP
ID: Org2MSP
MSPDir: ./certs/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:
這個配置檔案的內容比較多,這裡就不做解釋了,可以到視訊解說中聽講解。
直接用./bin/configtxgen
生成創世塊檔案。
./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./genesisblock
將./genesisblock檔案複製到192.168.88.10的/opt/app/fabric/orderer/目錄中:
scp genesisblock [email protected]:/opt/app/fabric/orderer/
啟動
分別到每臺機器到orderer、peer目錄中啟動:
./orderer &
./peer node start &
為了方便檢視輸出的日誌,可以寫一個指令碼:
$ cat start.sh
./orderer 2>&1 |tee log
peer的指令碼如下:
$ cat start.sh
./peer node start 2>&1 |tee log
然後將指令碼放到後臺執行:
$ ./start.sh &
如果程式啟動失敗,那麼核實之前的步驟。或者到右側的“區塊鏈實踐分享”知識星球中諮詢。
使用者
要使用得先有使用者。在前面用cryptogen
準備證書的時候,它預設建立了使用者。
還記得certs目錄下的幾個users
目錄嗎?那裡面就是使用者證書。
users目錄一共有三個,分別是聯盟的使用者,和每個組織的使用者:
./certs/ordererOrganizations/example.com/users
./certs/peerOrganizations/org1.example.com/users
./certs/peerOrganizations/org2.example.com/users
其中每個組織有兩個使用者,Admin和User1:
$ ls ./certs/peerOrganizations/org1.example.com/users
[email protected] [email protected]
Admin和User1唯一的區別是,Admin的使用者證書被新增到了對一個peer的msp/admincerts
目錄中。(還記得這個目錄的作用嗎?)
[email protected]
使用hyperledger fabric可以通過SDK,也可以使用peer命令。
這裡直接演示peer命令的用法。
在fabric-deploy中建立目錄[email protected]
,在其中存放該使用者的所有資料。
mkdir [email protected]
將使用者證書複製到其中:
cp -rf certs/peerOrganizations/org1.example.com/users/Admin\@org1.example.com/* Admin\@org1.example.com/
還需要將core.yaml複製到使用者目錄下:
cp peer0.org1.example.com/core.yaml Admin\@org1.example.com/
為了方便使用,在[email protected]中建立一個peer.sh指令碼:
#!/bin/bash
PATH=`pwd`/../bin:$PATH
export FABRIC_CFG_PATH=`pwd`
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_CERT_FILE=./tls/client.crt
export CORE_PEER_TLS_KEY_FILE=./tls/client.key
export CORE_PEER_MSPCONFIGPATH=./msp
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_TLS_ROOTCERT_FILE=./tls/ca.crt
export CORE_PEER_ID=cli
export CORE_LOGGING_LEVEL=INFO
peer $*
然後直接通過這個指令碼訪問peer0.org1.example.com:
$ ./peer.sh node status
status:STARTED
2018-04-29 14:32:03.517 CST [main] main -> INFO 001 Exiting.....
可以看到peer0.org1.example.com:7051
的狀態是啟動的。
為了後面的演示,下面使用複製替換的方式,準備另外兩個使用者的目錄。
[email protected]
User1與Admin1使用相同的peer,因此只需要替換使用者證書即可:
cp -rf Admin\@org1.example.com/ User1\@org1.example.com/
rm -rf User1\@org1.example.com/msp
rm -rf User1\@org1.example.com/tls
cp -rf certs/peerOrganizations/org1.example.com/users/User1\@org1.example.com/* User1\@org1.example.com/
執行peer.sh檢驗:
$ ./peer.sh node status
status:STARTED
2018-04-29 14:37:48.251 CST [main] main -> INFO 001 Exiting.....
[email protected]
對於[email protected],core.yaml也需要替換:
cp -rf Admin\@org1.example.com/ Admin\@org2.example.com/
rm -rf Admin\@org2.example.com/msp/
rm -rf Admin\@org2.example.com/tls/
cp -rf certs/peerOrganizations/org2.example.com/users/Admin\@org2.example.com/* Admin\@org2.example.com/
cp peer0.org2.example.com/core.yaml Admin\@org2.example.com/
還需要將peer.sh
中peer地址修改為org2的peer地址:
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051
export CORE_PEER_LOCALMSPID=Org1MSP
修改為:
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051
export CORE_PEER_LOCALMSPID=Org2MSP
驗證:
$ ./peer.sh node status
status:STARTED
2018-04-29 14:44:22.395 CST [main] main -> INFO 001 Exiting.....
建立channel與peer的設定
準備channel檔案
這裡用命令列演示channel的建立與peer的設定。(也可以通過SDK,SDK將單獨討論)
需要再次回到fabric-deploy目錄中,用configtxgen生成channel檔案:
./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx mychannel.tx -channelID mychannel
channel名字為mychannel,生成的mychannel.tx備用。
還需要為每個組織的peer生成一個anchor檔案,每個組織只需要一個:
./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
生成的Org1MSPanchors.tx和Org2MSPanchors.tx備用。
下一步操作中需要訪問orderer.example.com,需要將驗證orderer.example.com的證書複製到使用者目錄中:
cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem Admin\@org1.example.com/
cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem User1\@org1.example.com/
cp certs/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem Admin\@org2.example.com/
建立channel
在[email protected]目錄中執行下面的命令,:
./peer.sh channel create -o orderer.example.com:7050 -c mychannel -f ../mychannel.tx --tls true --cafile tlsca.example.com-cert.pem
執行完成後,會生成一個mychannel.block
檔案:
$ ls
core.yaml msp mychannel.block peer.sh tls tlsca.example.com-cert.pem
將mychannel.block複製一份到Admin\@org2.example.com/
中備用:
cp Admin\@org1.example.com/mychannel.block Admin\@org2.example.com/
將peer加入channel
分別在Admin\@org1.example.com/
和Admin\@org2.example.com/
執行下面的命令:
./peer.sh channel join -b mychannel.block
因為org1有兩個peer,因此需要將peer.sh中peer修改為peer1.org1.example.com
後,再新增一次:
./peer.sh channel join -b mychannel.block
可以用channel list檢視peer所在channel
$ ./peer.sh channel list
2018-04-29 16:37:47.016 CST [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Channels peers has joined:
mychannel
2018-04-29 16:37:47.018 CST [main] main -> INFO 002 Exiting.....
最後需要每個組織指定一個anchor peer,anchor peer是組織用來與外部通訊的peer:
cd Admin\@org1.example.com/
./peer.sh channel update -o orderer.example.com:7050 -c mychannel -f ../Org1MSPanchors.tx --tls true --cafile ./tlsca.example.com-cert.pem
cd Admin\@org2.example.com/
./peer.sh channel update -o orderer.example.com:7050 -c mychannel -f ../Org2MSPanchors.tx --tls true --cafile ./tlsca.example.com-cert.pem
安裝合約(chaincode)
在hyperledger fabric中,合約被稱為chaincode。
需要安裝一個go語言的開發環境,安裝方法這裡就不介紹了。
這裡將go的開發環境安裝在fabric-deploy所在的機器上。
直接用go get
獲取一份合約程式碼:
go get github.com/lijiaocn/fabric-chaincode-example/demo
到[email protected]/
目錄下,以[email protected]的身份打包合約:
cd Admin\@org1.example.com/
執行下面命令進行合約打包與簽署:
./peer.sh chaincode package demo-pack.out -n demo -v 0.0.1 -s -S -p github.com/lijiaocn/fabric-chaincode-example/demo
./peer.sh chaincode signpackage demo-pack.out signed-demo-pack.out
然後安裝合約:
./peer.sh chaincode install ./signed-demo-pack.out
安裝之後,可以用chaincode list檢視peer上已經安裝的合約。
$ ./peer.sh chaincode list --installed
Get installed chaincodes on peer:
Name: demo, Version: 0.0.1, Path: github.com/lijiaocn/fabric-chaincode-example/demo, Id: 3d733bd28accf77b06b2bec065d8ce7315bd7c5441c51beea4650982f79eab46
2018-04-29 18:57:54.327 CST [main] main -> INFO 001 Exiting....
chaincode只能用Admin安裝,並且需要在每個peer上都安裝一次。
因此需要將peer0.org1.example.com切換為peer1.org1.example.com後,再次安裝一次:
./peer.sh chaincode install ./signed-demo-pack.out (不需要重新打包簽署)
將signed-demo-pack.out複製到[email protected]
中安裝一次
cp Admin\@org1.example.com/signed-demo-pack.out Admin\@org2.example.com/
cd Admin\@org2.example.com/
./peer.sh chaincode install ./signed-demo-pack.out
合約初始化
合約安裝之後,需要進行一次初始化,只能由建立合約的使用者進行初始化:
cd Admin\@org1.example.com/
./peer.sh chaincode instantiate -o orderer.example.com:7050 --tls true --cafile ./tlsca.example.com-cert.pem -C mychannel -n demo -v 0.0.1 -c '{"Args":["init"]}' -P "OR('Org1MSP.member','Org2MSP.member')"
第一進行合約初始化的時候的會比較慢,因為需要需要建立、啟動容器。
合約呼叫
可以在任意一個peer上呼叫合約,例如以[email protected]的進行寫操作:
cd Admin\@org2.example.com/
./peer.sh chaincode invoke -o orderer.example.com:7050 --tls true --cafile ./tlsca.example.com-cert.pem -C mychannel -n demo -c '{"Args":["write","key1","key1 value is abc"]}'
如果是第一次在一個peer訪問一個合約,這個peer需要先啟動容器,響應會比較慢。進行寫操作(invoke命令)時,需要指定orderer(-o orderer.example.com:7050)。
進行查詢操作時,不需要指定orderer,例如:
cd User1\@org1.example.com/
./peer.sh chaincode query -C mychannel -n demo -c '{"Args":["query","key1"]}'
更新合約
將更改後的合約重新打包,使用一個新的版本號:
cd Admin\@org1.example.com/
執行下面命令進行合約打包與簽署:
./peer.sh chaincode package demo-pack-2.out -n demo -v 0.0.2 -s -S -p github.com/lijiaocn/fabric-chaincode-example/demo
./peer.sh chaincode signpackage demo-pack-2.out signed-demo-pack-2.out
然後安裝合約:
./peer.sh chaincode install ./signed-demo-pack-2.out
更新的合約不需要初始化,需要進行更新操作:
./peer.sh chaincode upgrade -o orderer.example.com:7050 --tls true --cafile ./tlsca.example.com-cert.pem -C mychannel -n demo -v 0.0.2 -c '{"Args":["init"]}' -P "OR('Org1MSP.member','Org2MSP.member')"
新的合約也需要在每個peer上單獨安裝。
因此需要將peer0.org1.example.com切換為peer1.org1.example.com後,再次安裝一次:
./peer.sh chaincode install ./signed-demo-pack-2.out (不需要重新打包簽署)
將signed-demo-pack.out複製到[email protected]
中安裝一次
cp Admin\@org1.example.com/signed-demo-pack-2.out Admin\@org2.example.com/
cd Admin\@org2.example.com/
./peer.sh chaincode install ./signed-demo-pack-2.out
可以到星球裡找我要優惠券或者提問:
參考
相關推薦
超級賬本HyperLedger的Fabric“全手動”、“多節點”部署教程,帶視訊演示
說明 雖然通過Building Your First Network中的docker-compose檔案可以直接啟動一個all-in-one的fabric。 但這種方式隱藏了太多的細節,只能讓人有個模糊的認識,對生產環境中部署方式、多伺服器部署,依然不清不楚, 對各
超級賬本(hyperledger)生產多節點部署
環境準備 * 安裝docker * 安裝docker-compose * 安裝mysql * 安裝node * 安裝dnsmasq 架構設計 四臺伺服器 docker0 ca1 couchdb0 zk0 kafka0 peer0-
消息中間件安裝單、多節點
消息中間件安裝單、多節點消息中間件安裝單、多節點1、 安裝JDK 並配置環境變量JAVA_HOME=/usr/local/java/jdk1.7(之前做過了,這邊就不做重復操作)2、 下載Linux 版的 ActiveMQ(我這邊使用apache-activemq-5.11.1-bin.tar.gz) $ w
搭建JEESZ分布式架構--消息中間件安裝單、多節點
環境變量 接收消息 jet conf 控制臺 註意 input lips dmi 1、 安裝JDK 並配置環境變量 JAVA_HOME=/usr/local/java/jdk1.7(之前做過了,這邊就不做重復操作) 2、 下載Linux 版的 ActiveMQ(我這邊使用a
OpenStack雙網絡卡、多節點搭建
1、新建三臺虛擬機器(controller、computer、object) 一、基礎環境配置 也可以建立一臺虛擬機器安裝好系統,其它兩臺進行拷貝,需做以下處理 1、修改網路 vim /etc/sysconfig/network-scrips/ifcfg-eth0 2、刪除 rm -rf
基於以太坊的私網建立、合約部署、多節點挖礦-黎躍春-專題視訊課程
基於以太坊的私網建立、合約部署、多節點挖礦—516人已學習 課程介紹 1、私鏈建立、編寫合約、部署合約、挖礦 2、同一臺電腦/區域網多節點建立 3、創世區塊配置檔案建立私有鏈課程收益 1、私鏈建立、編寫合約、部署合約、挖礦 2、同一臺電腦/區域網多節
ios tableViewCell 陣列方式 全選、多選的刪除
typedefNS_ENUM(NSUInteger, EditTypes) { // 刪除狀態 deleteForEditTypes = 0, // 編輯狀態 editForEditT
centos7多節點部署redis4.0.11叢集
1、伺服器叢集伺服器 redis節點node-i(192.168.0.168) 7001,7002node-ii(192.168.0.169) 7003,7004node-iii(192.168.0.170) 7005,7006 三個節點都關閉防火牆:
Android高效載入大圖、多圖解決方案,有效避免程式OOM
本篇文章主要內容來自於Android Doc,我翻譯之後又做了些加工,英文好的朋友也可以直接去讀原文。高效載入大圖片我們在編寫Android程式的時候經常要用到許多圖片,不同圖片總是會有不同的形狀、不同的大小,但在大多數情況下,這些圖片都會大於我們程式所需要的大小。比如說系統
redis setnx解決定時任務多節點部署併發問題(分散式鎖)
在一些大的網際網路平臺,通常都會使用定時任務處理一些週期性的業務,而為了保障系統的高可用性,定時任務也會多節點部署,而解決多節點併發問題(分散式鎖),大家通常會想到使用快取,如redis,但是如果使用set / get是無法解決問題的,同樣會出現併發問題,redis有專門的解決分散式併發問題的方
快速入門Openstack,無腦多節點部署Mitaka(1)--前期環境搭建準備
序言 openstack是什麼?官方的解釋:OpenStack is a cloud operating system that controls large pools of compute, storage, and networking reso
Android高效載入大圖、多圖解決方案,有效避免程式OOM .
高效載入大圖片 我們在編寫Android程式的時候經常要用到許多圖片,不同圖片總是會有不同的形狀、不同的大小,但在大多數情況下,這些圖片都會大於我們程式所需要的大小。比如說系統圖片庫裡展示的圖片大都是用手機攝像頭拍出來的,這些圖片的解析度會比我們手機螢幕的解析度高得多。大家應該知道,我們編寫的應用程式都
Android高效加載大圖、多圖解決方案,有效避免程序OOM
view idv alc ash ces cal android手機 ons 多圖 前言:Android手機分配給給個應用的內存空間都是有限的,當圖片像素>屏幕像素時,會造成內存浪費,嚴重時更會造成oom,當圖片像素<屏幕像素時,又會導致展示出來的圖片失真,因此
Extjs表單元素實現橫向、多列布局,最簡單的程式碼示例
Ext.onReady(function(){ Ext.create('Ext.form.Panel',{ title : '橫向佈局測試', height : 130, width
快速入門Openstack,無腦多節點部署Mitaka(5)--Nova部署
什麼是Nova? 簡介 Nova是openstack中用來提供高可擴充套件、按需、自服務的計算資源服務的一個專案。Nova是openstack最老牌的專案,最初剛釋出的時候集成了很多的功能,既包括計算,也包括網路和儲存。後來隨著openstack
OpenStack基於修改ip和配置檔案的多節點部署
本文主要是提供一種新的思路。OpenStack的liberty版本比Juno更加容易部署,也使用了Linux bridge的方式,使得網路的問題進一步的減少。 那麼本文提到的一種部署方式則是將OpenStack用命令列先在虛擬機器上部署。然後可以匯出為ova或者ovf格式的虛擬檔案包。那麼再另外的環境
快速入門Openstack,無腦多節點部署Mitaka(7)--cinder部署
什麼是Cinder? 1.簡介 Cinder從Openstack的Folsom版本(2012年9月釋出)開始出現,用以替代Nova-Volume服務,Cinder為Openstack提供了管理卷(volunme)的基礎設施。 Cinder是受請求得到、
iOS開發之第三方支付微信支付教程,史上最新最全第三方微信支付方式實現、微信整合教程,微信實現流程
1. 微信支付微信支付前奏大致流程為 : 1. 公司需要到微信進行申請app支付功能 , 獲得appid和微信支付商戶號(mch_id)和API祕鑰(key) 、 Appsecret(secret),開發中用到的,很重要 appid:appid是微信公眾賬號
JAVA 最全最細的fastjson使用介紹,帶你透徹領悟JSON
一起來看看關於fastjson的各種騷操作吧! 看完這個基本對於json資料的解析、轉換各種都木有問題了! 1.前言 1.1.FastJson的介紹: JSON協議使用方便,越來越流行,JSON的處理器有很多,這裡我介紹一下FastJson,FastJson是阿里的開源框架,被不少企
JSON(帶json陣列)格式轉XML(多層巢狀,帶value)格式
1.JSON格式 隨便寫了一個,帶有json陣列,如下: { "TxnBatchNo": "20170607152322", "TxnSeq": "1", "CardNo": "2017000100000003", "AA