1. Fabric 賬號
1.1 Fabric賬號
-
Fabric賬號
-
賬號是什麼?
Fabric中的賬號實際上是根據PKI規範生成的一組證書和祕鑰文件
-
fabric中賬號的作用
- 保證記錄在區塊鏈中的數據具有不可逆、不可篡改
- Fabric中每條交易都會加上發起者的標籤(簽名證書),同時用發起人的私鑰進行加密
- 如果交易需要其他組織的節點提供背書功能,那麼背書節點也會在交易中加入自己的簽名
# Fabric中的完整賬號結構 . ├── [email protected] │ ├── msp │ │ ├── admincerts │ │ │ └── [email protected] │ │ ├── cacerts │ │ │ └── ca.orggo.zjnu.com-cert.pem │ │ ├── keystore │ │ │ └── a2f15f92d1b1733a9a901aa4e6fa6d5910248a967b13a00521ba26068a2bc592_sk │ │ ├── signcerts │ │ │ └── [email protected] │ │ └── tlscacerts │ │ └── tlsca.orggo.zjnu.com-cert.pem │ └── tls │ ├── ca.crt │ ├── client.crt │ └── client.key ├── [email protected] │ ├── msp │ │ ├── admincerts │ │ │ └── [email protected] │ │ ├── cacerts │ │ │ └── ca.orggo.zjnu.com-cert.pem │ │ ├── keystore │ │ │ └── 889f0029925920dcff610239140bda797e102cda8072a89e2f46c4798bdb5c1d_sk │ │ ├── signcerts │ │ │ └── [email protected] │ │ └── tlscacerts │ │ └── tlsca.orggo.zjnu.com-cert.pem │ └── tls │ ├── ca.crt │ ├── client.crt │ └── client.key
- msp文件夾中內容中主要存放簽名用的證書文件和加密用的私鑰文件。
- admincerts:管理員證書。
- cacerts:根CA服務器的證書。
- keystore:節點或者賬號的私鑰。
- signcerts:符合x.509的節點或者用戶證書文件。
- tlscacerts:TLS根CA的證書。
- tls 文件夾中存放加密通信相關的證書文件。
-
1.2 什麼地方需要 Fabric 賬號
-
啓動orderer
啓動orderer的時候我們需要通過環境變量或者配置文件給當前啓動的Orderer設定相應的賬號。
# 環境變量賬號: -> 該路徑爲宿主機上的路徑, 非docker啓動的orderer節點內部掛載路徑 ORDERER_GENERAL_LOCALMSPDIR=./crypto-config/ordererOrganizations/zjnu.com/orderers/orderer.zjnu.com/msp # 賬號目錄信息 $ tree msp/ msp/ ├── admincerts │ └── [email protected] ├── cacerts │ └── ca.zjnu.com-cert.pem ├── keystore │ └── 4968fd5b3fa14639ba61ec97f745b2e0ce5592e54838493d965a08ac7ad1c8e7_sk ├── signcerts │ └── orderer.zjnu.com-cert.pem └── tlscacerts └── tlsca.zjnu.com-cert.pem
-
啓動peer
啓動peer的時候我們需要通過環境變量或者配置文件給當前啓動的peer設定相應的賬號。
# 環境變量賬號: -> 該路徑爲宿主機上的路徑, 非docker啓動的orderer節點內部掛載路徑 CORE_PEER_MSPCONFIGPATH=crypto-config/peerOrganizations/orggo.zjnu.com/peers/peer0.zjnu.itcast.com/msp # 賬號目錄信息 $ tree msp/ msp/ ├── admincerts │ └── [email protected] ├── cacerts │ └── ca.orggo.zjnu.com-cert.pem ├── config.yaml ├── keystore │ └── a3a19feb11cac708a038d115d26cf96247bcc5821bca3f2b8e9d07847604268b_sk ├── signcerts │ └── peer0.orggo.zjnu.com-cert.pem └── tlscacerts └── tlsca.orggo.zjnu.com-cert.pem
-
創建channel
channel是fabric中的重要組成部分, 創建channel也是需要賬號的.
# 環境變量賬號: -> 該路徑爲宿主機上的路徑, 非docker啓動的orderer節點內部掛載路徑 # 在客戶端中做的, 客戶端要有一個用戶的賬號信息 CORE_PEER_MSPCONFIGPATH=crypto-config/peerOrganizations/orggo.zjnu.com/users/[email protected]/msp # 賬號目錄信息 $ tree msp/ msp/ ├── admincerts │ └── [email protected] ├── cacerts │ └── ca.orggo.zjnu.com-cert.pem ├── keystore │ └── a2f15f92d1b1733a9a901aa4e6fa6d5910248a967b13a00521ba26068a2bc592_sk ├── signcerts │ └── [email protected] └── tlscacerts └── tlsca.orggo.zjnu.com-cert.pem
通過上邊的內容我們可以發現這些賬號的內容是一樣的, 都包含是5個不同的文件, 但是仔細觀察會發現在文件路徑上還是有一些區別的。我們來對比一下:
# Orderer 啓動路徑
crypto-config/ordererOrganizations/itcast.com/orderers/orderer.itcast.com/msp
# Peer啓動的賬號路徑
crypto-config/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/msp
# 創建channel的賬號路徑
crypto-config/peerOrganizations/orggo.itcast.com/users/[email protected]/msp
我們可以發現Peer和Orderer都有屬於自己的賬號,創建Channel使用的是用戶賬號。其中Peer和創建Channel的用戶賬號屬於某個組織,而Orderer的啓動賬號只屬於他自己。這裏特別注意,用戶賬號在很多操作中都會用到,而且很多操作的錯誤都是用戶賬號的路徑設置不當而引起的。
1.3 Fabric-ca
fabric-ca 項目是專門爲了解決Fabric賬號問題而發起的一個開源項目, 它非常完美的解決了fabric賬號生成的問題。fabric-ca項目由 fabric-server 和fabric-client這兩個模塊組成。其中fabric-server在 fabric中佔有非常重要的作用。我們使用
cryptogen
命令可以同配置文件生成一些賬號信息, 但是如果有動態添加賬號的需求, 就無法滿足, 所以這個時候我們就應該在項目中引入fabric-ca。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-62761Yqj-1586783193113)(assets/1542288702905.png)]
上圖中Fabric CA提供了兩種訪問方式調用Server服務
- 通過Fabric-Client調用
- 通過SDK調用 (node.js,java, go)
通常情況下, 一個組織會對應一個fabric-server服務器, 下面介紹如何將fabric-server加入到網絡中
在一個fabric中有多個組織, fabric-Ca如何部署?
- 要在每個組織中部署一個fabric-ca服務器, 給當前組織註冊新用戶
1.3.1 將fabric-ca加入到網絡
在docker-compose啓動使用的配置文件docker-compos.yam
中添加如下配置項:
services:
###################### 添加的內容 - START #########################
cago.zjnu.com: # -> fabric-ca的服務器名, 隨便起名
image: hyperledger/fabric-ca:latest # fabric-ca的鏡像文件
environment:
# fabric-ca容器中的home目錄
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=cago.zjnu.com # fabric-ca服務器的名字, 自己起
# fabric-ca服務器證書文件目錄中的證書文件
# 明確當前fabric-ca屬於哪個組織
- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.orggo.zjnu.com-cert.pem
# fabric-ca服務器的私鑰文件
- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/0445f3d2287580194cb96060b644e560627b180315444fe2c17cbbbfda281c8a_sk
ports:
- 7054:7054 # fabric-ca服務器綁定的端口
# 啓動fabric-ca-server服務
# admin:123456
# -- admin: fabric-ca-server的登錄用戶名
# -- 123456: fabric-ca-server的登錄密碼
command: sh -c 'fabric-ca-server start -b admin:123456'
volumes:
- ./crypto-config/peerOrganizations/orggo.zjnu.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: cago.zjnu.com # 容器名, 自己指定
networks:
- byfn # 工作的網絡
cacpp.zjnu.com: # -> fabric-ca的服務器名, 隨便起名
image: hyperledger/fabric-ca:latest # fabric-ca的鏡像文件
environment:
# fabric-ca容器中的home目錄
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=cacpp.zjnu.com # fabric-ca服務器的名字, 自己起
# fabric-ca服務器證書文件目錄中的證書文件
# 明確當前fabric-ca屬於哪個組織
- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.orgcpp.zjnu.com-cert.pem
# fabric-ca服務器的私鑰文件
- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/eec404e69e144a435abc14caaff1a7adac42f5b63f0a745e22e53fca15ee4adb_sk
ports:
- 8054:7054 # fabric-ca服務器綁定的端口
# 啓動fabric-ca-server服務
# admin:123456
# -- admin: fabric-ca-server的登錄用戶名
# -- 123456: fabric-ca-server的登錄密碼
command: sh -c 'fabric-ca-server start -b admin:123456'
volumes:
- ./crypto-config/peerOrganizations/orgcpp.zjnu.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: cacpp.zjnu.com # 容器名, 自己指定
networks:
- byfn # 工作的網絡
###################### 添加的內容 - END #########################
1.3.2 編寫node.js客戶端
-
初始化node.js項目(在服務器中創建任意一個目錄然後進入裏面執行下面的代碼)
# 創建一個編寫node.js客戶端的目錄, 並進入 # 1. 執行npm init 生成package.json文件, 用於保存更新項目依賴的第三方模塊 # 要求輸入的信息, 如果你懶, 直接回車就可以了 # package.json配置說明: https://blog.csdn.net/Aurora100/article/details/78590346 $ npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install <pkg>` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. package name: (nodejs) version: (1.0.0) description: entry point: (index.js) test command: git repository: keywords: author: license: (ISC) About to write to /home/itcast/nodejs/package.json: { "name": "nodejs", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } Is this ok? (yes)
# 接下來執行如下命令, 安裝第三方依賴庫: npm install --save fabric-ca-client npm install --save fabric-client npm install --save grpc # 安裝過程中, 提示如下log信息, 無需理會 npm WARN [email protected] No description npm WARN [email protected] No repository field.
-
客戶端參考API
https://hyperledger.github.io/fabric-sdk-node/