fabric-淺嘗 &多形式環境搭建

環境搭建demo如下:

  • 單機
    • order爲solo:
      • [] 單組織,多peer節點
      • [] 多組織,多peer節點
    • order爲raft:
      • [] 單組織,多peer節點
      • [] 多組織,多peer節點
      • [] 添加組織,並且實例化鏈碼

問題

  • 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)]:

      1. (Endorser節點) 當Endorser節點收到交易請求之後
      2. (Endorser節點) Endorser節點會先模擬交易請求(但並不會更新worldstate)
      3. (Endorser節點) 將結果加密返回給Client端
      4. (Client) Client端收到resp之後,會將resp submitOrder節點
      5. (Order節點) Order節點收到resp之後,打包然後發送給 commit節點(記賬節點)
      6. (Commit節點) **commit節點(記賬節點)**收到Order節點commit信息之後,會進行一系列的校驗操縱
      7. (Commit節點) commit節點,將 transacttion commit到worldstate,更新區塊鏈數據
      8. (Commit節點) commit節點最終通知client端,交易失敗還是成功
    • commit節點如何判斷一個交易是成功還是失敗:
      • 通過Endorsing Policy(背書策略)
  • Endorsing Policy背書策略:

    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5W1WZUPP-1572951195866)(/Users/joker/Desktop/個人/區塊鏈/架構設計參考/交易校驗流程.png)]

      • 每個cc deploy的時候,都會安裝背書策略
      • Endorser節點: 當模擬執行交易完畢之後,通過ESCC對執行結果進行加密
      • Commit節點: 通過VSCC 背書策略對交易判斷是否合理
    • 背書策略的指定:(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

  • !]外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳]()

    1. proposal到來
    2. endorser節點模擬執行
    3. private data存儲到臨時的數據庫中
    4. 通過gossip協議,將數據傳輸到有權限的peer節點,當 達到一定數量之後,返回給client端, 這時候不會返回private data,只會是hash值,所以order節點看不到private data信息
    5. 當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
    
    
    }
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章