HyperledgerFarbic1.4- Fabric 中的MSP
一、什麼是數字簽名和數字證書
數字簽名是基於非對稱加密的一種加密方式。
假設用戶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
- org1.example.com
四、什麼是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