(四)HyperledgerFarbic1.4- Fabric 中的MSP&Ledger

一、什麼是數字簽名和數字證書

數字簽名是基於非對稱加密的一種加密方式。

假設用戶A 擁有私鑰和公鑰
A將公鑰 給B C D
B向A發送信息是 使用公鑰加密,A接收到後使用自己保留的私鑰解密。起到了信息加密傳輸的作用。
如果A要給B發送一個消息,爲了保證數據不被篡改,就將信息 進行hash運算,獲取到一個摘要(Disgest),再把這個摘要用自己的私鑰進行加密生成一個簽名(Signature)。

所以數據簽名:其實就是 用私鑰給消息的摘要進行加密後的結果,祕鑰私鑰的持有方不會將私鑰給其他人,所以數字簽名可以代表一個人的身份。

當B接收到信息後,B可以使用公鑰將數字簽名解密獲取到信息的摘要,然後可以使用同樣的hash算法對獲取到的信息進行運行獲取到一個摘要,如果兩次摘要一致則說明信息沒有被篡改過。

這個過程中 如果C想要欺騙B,C用自己的公鑰替換了原來B擁有的A的公鑰,其實B擁有的是C的公鑰,這時C就可以用自己的私鑰 冒充A來給B發送信息。

那如何才能保證B手裏的公鑰是正確的?

第三方CA(certificate authority)證書中心,就是用了認證公鑰的。A可以將自己的公鑰託管的CA,CA會只用自己的私鑰給A的公鑰加密,形成一個 數字證書。

A再次發消息時 就帶着自己的簽名和證書信息一起發送。B收到消息後,先使用CA的公鑰解密證書信息獲取到A的公鑰,就可以驗證公鑰是否正確。

所以數字證書:就是由三方CA來頒發的,包含用戶認證過的公鑰信息的密文。

二、什麼是MSP

MSP是Membership Service Providers的簡稱,就是成員關係管理服務提供者

  • MSP是一套組件,來指定用戶執行某些操作的權限認證體系
  • MSP需要設置每個org,peer和orderer,這樣可以實現驗證和簽名操作
  • MSP可以通過openssl,cryptogen,fabric-ca來生成
  • 每個網絡中的Org都有一個對應的OrgMsp並且在網絡中唯一,用於識別身份

三、MSP在Fabric中的目錄結構

在fabric中,可以使用cryptogen generate 命令 來根據configtx.yaml配置文件來生成證書
生成後會在當前所在目錄生成crypto-config文件目錄,目錄下有

  • ordererOrganizations(排序節點MSP配置信息)
    • ca (CA證書和祕鑰, .pem 是證書, .sk 是祕鑰)
    • msp (MSP配置)
      • admincerts (MSP的管理員證書)
      • cacerts(MSP的跟CA證書)
      • config.yaml(映射部門和證書OU字段的yaml文件,其<Certificate,Org-UnitIdentifier>表示一個映射表,其中Certificate包含部門信息的證書文件路徑,他是相對於MSP根目錄的路徑)
      • crls (證書吊銷列表)
      • kestore(簽名祕鑰)
      • sigcerts(節點簽名證書)
      • tlscacerts(TLS的根CA證書)
      • tlsintermediatecerts(TLS的中間CA證書)
    • orders (排序服務節點配置)
    • tlsca (TLS的中間CA證書和祕鑰)
    • users (默認生成的用戶配合,一般包括一個Admin和一個 普通用戶)
  • peerOrganizations(peer節點MSP配置信息)
    • org1.example.com
      • ca(CA證書和祕鑰, .pem 是證書, .sk 是祕鑰)
      • msp(MSP配置)
        • admincerts (MSP的管理員證書)
        • cacerts(MSP的跟CA證書)
        • config.yaml(映射部門和證書OU字段的yaml文件,其<Certificate,Org-UnitIdentifier>表示一個映射表,其中Certificate包含部門信息的證書文件路徑,他是相對於MSP根目錄的路徑)
        • crls (證書吊銷列表)
        • kestore(簽名祕鑰)
        • sigcerts(節點簽名證書)
        • tlscacerts(TLS的根CA證書)
        • tlsintermediatecerts(TLS的中間CA證書)
      • peers (peer節點配置)
      • tlsca
      • users

四、什麼是Ledger(賬本)

fabric中 使用賬本來存儲數據,賬本數據是追加的,不會有刪除操作,只能通過追加新的記錄來描述值的變化,並且歷史數據也是不能夠修改的。
Legder分爲兩個部分

  • 區塊鏈鏈條
  • world state 分佈式數據庫(couchdb、leveldb)

其中鏈條存儲整個state數據庫的操作記錄,可以導出當前state的值,這種存儲一般是使用文件像是實現,都是通過追加的方式記錄

分佈式數據庫則是使用k-v的格式進行存儲,可以很快的查找到當前的state,同時值的CURD操作都會記錄到賬本中

五、使用couchDB來作爲分佈式數據庫

5.1 概述

在fabric網絡中 每個節點都應該帶有一個分佈式數據,用來存放網絡中的全量信息。在之前的first-network啓動時沒有指定使用哪種數據庫來存儲默認是使用levelDB來存儲的。

5.2 如何使用couchDB來作爲分佈式數據庫

通過couchDB來作爲分佈式數據需要在docker-compose.yaml文件中添加couchDB容器,並且peer節點要指定依賴那個couchDB
查看官方提供的compose文件: ~/first-network/docker-compose-couch.yaml
其中有關於couchdb的配置方式

version: '2'

networks:
  byfn:

services:
  couchdb0: # couchDB 容器
    container_name: couchdb0 # 容器名稱
    image: hyperledger/fabric-couchdb # 使用的image
    # Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
    # for CouchDB.  This will prevent CouchDB from operating in an "Admin Party" mode.
    environment:
      - COUCHDB_USER= # 指定couchdb的用戶名
      - COUCHDB_PASSWORD= # 指定couchdb的密碼
    # Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
    # for example map it to utilize Fauxton User Interface in dev environments.
    ports:
      - "5984:5984" # 暴露的端口號
    networks:
      - byfn # 網絡環境

  peer0.org1.example.com:
    environment:
      - CORE_LEDGER_STATE_STATEDATABASE=CouchDB # 指定數據庫類型
      - CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984 # 數據庫地址
      # The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
      # provide the credentials for ledger to connect to CouchDB.  The username and password must
      # match the username and password set for the associated CouchDB.
      - CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME= # 數據庫用戶名
      - CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD= # 數據庫密碼
    depends_on: # 依賴於哪個鏡像
      - couchdb0 # 這裏依賴於couchdb0

上述配置中 可以明確的是 peer0

5.3 byfn.sh 中提供的使用couchDB來啓動網絡的方式

# 停止之前的網絡
./byfn.sh down 
# 重新啓動網絡並指定couchDB
./byfn.sh up -s couchdb

啓動成功後 可以看到 有四個couchdb的容器 對應四個 peer

CONTAINER ID        IMAGE                                                                                                  COMMAND                  CREATED              STATUS              PORTS                                        NAMES
df5d10579510        dev-peer1.org2.example.com-mycc-1.0-26c2ef32838554aac4f7ad6f100aca865e87959c9a126e86d764c8d01f8346ab   "chaincode -peer.add…"   About a minute ago   Up About a minute                                                dev-peer1.org2.example.com-mycc-1.0
e528a4419626        dev-peer0.org1.example.com-mycc-1.0-384f11f484b9302df90b453200cfb25174305fce8f53f4e94d45ee3b6cab0ce9   "chaincode -peer.add…"   2 minutes ago        Up 2 minutes                                                     dev-peer0.org1.example.com-mycc-1.0
a09750bd1292        dev-peer0.org2.example.com-mycc-1.0-15b571b3ce849066b7ec74497da3b27e54e0df1345daff3951b94245ce09c42b   "chaincode -peer.add…"   3 minutes ago        Up 3 minutes                                                     dev-peer0.org2.example.com-mycc-1.0
8abd4ec34dfa        hyperledger/fabric-tools:latest                                                                        "/bin/bash"              4 minutes ago        Up 4 minutes                                                     cli
58972f818c97        hyperledger/fabric-peer:latest                                                                         "peer node start"        4 minutes ago        Up 4 minutes        0.0.0.0:7051->7051/tcp                       peer0.org1.example.com
bcf9e35d6e30        hyperledger/fabric-peer:latest                                                                         "peer node start"        4 minutes ago        Up 4 minutes        0.0.0.0:10051->10051/tcp                     peer1.org2.example.com
6c6f6656a79d        hyperledger/fabric-peer:latest                                                                         "peer node start"        4 minutes ago        Up 4 minutes        0.0.0.0:9051->9051/tcp                       peer0.org2.example.com
43e652059e2a        hyperledger/fabric-peer:latest                                                                         "peer node start"        4 minutes ago        Up 4 minutes        0.0.0.0:8051->8051/tcp                       peer1.org1.example.com
8d1eb49705b6        hyperledger/fabric-couchdb                                                                             "tini -- /docker-ent…"   4 minutes ago        Up 4 minutes        4369/tcp, 9100/tcp, 0.0.0.0:7984->5984/tcp   couchdb2
20fbf6546dcb        hyperledger/fabric-couchdb                                                                             "tini -- /docker-ent…"   4 minutes ago        Up 4 minutes        4369/tcp, 9100/tcp, 0.0.0.0:8984->5984/tcp   couchdb3
ed29d132af99        hyperledger/fabric-couchdb                                                                             "tini -- /docker-ent…"   4 minutes ago        Up 4 minutes        4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp   couchdb0
fc6bded888c5        hyperledger/fabric-couchdb                                                                             "tini -- /docker-ent…"   4 minutes ago        Up 4 minutes        4369/tcp, 9100/tcp, 0.0.0.0:6984->5984/tcp   couchdb1
f0aed6a60cc9        hyperledger/fabric-orderer:latest                                                                      "orderer"                4 minutes ago        Up 4 minutes        0.0.0.0:7050->7050/tcp                       orderer.example.com

couchDB提供了web頁面來管理數據
可以訪問

http://localhost:5984/_utils/來查看couchdb中的內容

couchdb的存儲格式爲json

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章