環境搭建demo如下:
- 單機
- order爲solo:
- [] 單組織,多peer節點
- [] 多組織,多peer節點
- order爲raft:
- [] 單組織,多peer節點
- [] 多組織,多peer節點
- [] 添加組織,並且實例化鏈碼
- order爲solo:
問題
- order和 ledger的關係
Channel
-
channel: 不同的公司有不同的業務,因此需要創建多種channel
-
channel是多個成員之間,以機密交易爲目的而建立的
私網 -
每個channel都要維護自己的賬本,賬本和賬本之間都是隔離的(通過peer維護)
-
一個channel 可以部署多個cc,不同的cc可以進行互相調用
-
不同的channel之間也可以互相調用,不同的channel之間可以讀數據,但是暫時不可以寫數據
Fabric Peer
-
區塊鏈網絡 由一系列peer節點組成
-
peer是整個區塊鏈網絡的基礎
- 是
賬本和智能合約的基礎(載體)
- 是
-
一個peer可以連接多個channel,(
channel:不同公司有不同業務,因而需要創建多種聯盟鏈(channel)
) -
peer上可以安裝多種智能合約,同時當事件完成時會發送事件給client端
-
peer的分類:
- Endorser節點(背書節點):
- Commit節點(記賬節點):
-
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VmNBJBxC-1572951195863)(/Users/joker/Desktop/個人/區塊鏈/架構設計參考/交易流程.png)]:
-
- (Endorser節點) 當Endorser節點收到交易請求之後
- (Endorser節點) Endorser節點會先模擬交易請求(
但並不會更新worldstate
) - (Endorser節點) 將結果加密返回給Client端
- (Client) Client端收到resp之後,會將resp submit給Order節點
- (Order節點) Order節點收到resp之後,打包然後發送給 commit節點(記賬節點)
- (Commit節點) **commit節點(記賬節點)**收到Order節點commit信息之後,會進行一系列的校驗操縱
- (Commit節點) commit節點,將 transacttion commit到worldstate,更新區塊鏈數據
- (Commit節點) commit節點最終通知client端,交易失敗還是成功
- commit節點如何判斷一個交易是成功還是失敗:
- 通過Endorsing Policy(背書策略)
-
-
Endorsing Policy背書策略:
-
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5W1WZUPP-1572951195866)(/Users/joker/Desktop/個人/區塊鏈/架構設計參考/交易校驗流程.png)]
- 每個cc deploy的時候,都會
安裝背書策略
- Endorser節點: 當模擬執行交易完畢之後,通過ESCC對執行結果進行加密
- Commit節點: 通過VSCC 背書策略對交易判斷是否合理
- 每個cc deploy的時候,都會
-
背書策略的指定:(cc實例化的時候指定)
-
peer chaincode instantiate -C mychannel (指定channel的名字) -n mycc (指定cc的名字) -v 1.0 (指定版本信息) -p chaincode_example002 -c '{"Args":["init":1]}' (指定初始化數據的內容) -P "AND('Org1MSP.member')" (指定背書策略)
-
-
Fabric Ledger:
- 有序的,不可修改的,歷史交易記錄
- 有2部分組成:
- [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YYnCxbbf-1572951195867)(/Users/joker/Desktop/個人/區塊鏈/架構設計參考/賬本組成-區塊.png)]
- 區塊:
- 保存了區塊配置信息
- WorldState: 維護賬本的當前狀態,方便Application快速查詢
區塊的組成:
-
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-syox1UVs-1572951195868)(/Users/joker/Desktop/個人/區塊鏈/架構設計參考/區塊結構.png)]
-
區塊頭部:
- 區塊Number:
- 當前區塊Hash: 對當前區塊中的所有tx進行加密然後處理得到的數據
- 上一個區塊的Hash
-
區塊數據:包含交易信息
- [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xvdM0vgz-1572951195869)(/Users/joker/Desktop/個人/區塊鏈/架構設計參考/交易-數據結構.png)]
- Header裏面包含了:
- cc的名字
- version:版本
- …
- 簽名: client用戶的簽名
- proposal: client端給endorser節點發送的proposal,主要爲input的參數
- Response: 執行結果前的數據和執行結果後的數據
- Endorsements: 每個背書節點返回的結果集,(
如若背書策略中指定3個org,則這裏存了3個endorsements
)
-
區塊元數據:
- 區塊寫入的時間
- 區塊寫入的人
- 區塊寫入的簽名等
WorldState
-
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-A29rjtGd-1572951195871)(/Users/joker/Desktop/個人/區塊鏈/架構設計參考/WorldState數據結構.png)]
-
當Query的時候,直接從WorldState中去獲取數據,
當被修改一次之後,version就會被增加
智能合約
-
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-usvU8mpa-1572951195873)(/Users/joker/Desktop/個人/區塊鏈/架構設計參考/智能合約.png)]
-
定義各個不同的organization之間的業務規則
-
智能合約就是來創建transaction
ChainCode
- 當智能合約編寫完畢,則需要打包成ChainCode
- 一個ChainCode包含多種智能合約
智能合約與賬本的交互
-
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jlveOwjH-1572951195874)(/Users/joker/Desktop/個人/區塊鏈/架構設計參考/智能合約與賬本的交互.png)]
-
智能合約也能發送events
ChainCode的生命週期:
-
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6D2ZP0Z8-1572951195874)(/Users/joker/Desktop/個人/區塊鏈/架構設計參考/cc的生命週期.png)]
-
打包:
-
peer chaincode package -n mycc -p github.com/myhyperledger/chaincode (指定path) -v 1.0 mypack.out (打包的結果爲mypack.out) 打包完畢之後就可以對其進行簽名 peer chaincode signpackage ccpack.out signpack.out
-
-
安裝: cc是安裝在peer節點上的,一個peer節點可以安裝多個cc
-
注意,cc必須安裝在所有的endorser節點上
-
peer chaincode install signpack.out
-
-
實例化:
-
注意:
- 要setup 背書策略
-
peer chaincode instantiate -n mycc -v 1.0 -c '"Args":1' -P "AND('Orga.menber','Orgb.menber')"
-
-
運行:
-
peer chaincode query -C mychannel (指定channel名稱) -n mycc (cc的名字) -c 參數
-
-
更新:
-
注意:
- 可以在任意時間都進行更新
- 更新之前,必須將最新的版本install到所有的背書節點上
- 多條channel與實例化的時候相同,只能一條一條來
-
peer chaincode upgrade -C mychannel -n mycc -v 2.0 -c 參數
-
系統鏈碼(System Chaincode)
- LSCC(Life Cycle system chaincode):
- 專門處理cc的 lifecycle(打包,安裝,升級等)
- CSCC(Configuration System ChainCode)
- 處理channel的配置信息
- QSCC(Query System Chaincode)
- 提供了賬本相關的api
Gossip 協議
-
存在的起源: 爲了優化網絡性能,提高安全性,分爲endorser節點,order節點和commit節點,每個tx在每種節點上用處不同,該網絡解耦方式需要一種安全的協議
-
定義:
-
在gossipe 中,根據不同的功能,peer可以分爲
- leader peer
- anchor peer
Leader peer
-
當有新的交易產生,連接order節點,拉取新的區塊
-
將tx 發送給commit peer
-
選舉方式:
-
靜態指定
-
配置文件: peer: gossip: useLeaderElection: false orgLeader: true 將當前節點設置爲leader節點
-
-
動態選取
-
通過發送心跳包
-
配置文件 peer: useLeaderElection: true orgLeader: false election: leaderAliveThreshold: 10s
-
-
Anchor peer
- 通過gossip 協議,使得不同的組織互相可知
私有數據 Private Data
-
!]外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳]()
-
- proposal到來
- endorser節點模擬執行
- private data存儲到臨時的數據庫中
- 通過gossip協議,將數據傳輸到有權限的peer節點,當 達到一定數量之後,返回給client端, 這時候不會返回private data,只會是hash值,所以order節點看不到private data信息
- 當order 節點將信息發送給commit節點之後,commit節點除了validate還會校驗private data的hash和臨時數據庫裏的private data比較,最終將private data 從臨時數據庫中存儲到真實的數據庫中
{ "name":"ss", "policy":"AND('Orga.menber')", "requirePeerCount":2, // 當private data已經傳播給其他的peer節點了,只有當至少傳播給2個節點之後,endorser // 纔可以返回給client,既上面的達到一定數量 "maxPeerCount":3, "blockToLive":1000000, "memberOnlyRead":true }