Fabric1.3新功能詳細介紹

王一洋發表於2019-01-23

功能1. 使用Identity Mixer實現MSP

       一種通過使用零知識證明來保持身份匿名和不可連結的方法。工具idexmigen可以在測試環境中生成Identity Mixer憑證。

 

功能1 零知識證明(科普中國)

         零知識證明(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世紀80年代初提出的。它指的是證明者能夠在不向驗證者提供任何有用的資訊的情況下,使驗證者相信某個論斷是正確的。零知識證明實質上是一種涉及兩方或更多方的協議,即兩方或更多方完成一項任務所需採取的一系列步驟。證明者向驗證者證明並使其相信自己知道或擁有某一訊息,但證明過程不能向驗證者洩漏任何關於被證明訊息的資訊。大量事實證明,零知識證明在密碼學中非常有用。如果能夠將零知識證明用於驗證,將可以有效解決許多問題。

功能2 什麼是Idemix?

       Idemix是一個加密協議套件,它提供強大的身份驗證以及隱私保護功能,如匿名,無需揭示交易者身份即可進行交易,以及不可連結性,即單個身份傳送多個交易的能力,而不會洩露交易是通過相同的身份傳送的。

Idemix流中涉及三個參與者:使用者,發行者和 驗證者。

發行者證明一組使用者的屬性以數字證照的形式釋出,以下稱為“憑證”。

使用者稍後生成擁有憑證的“ 零知識證明 ”,並且還選擇性地僅公開使用者選擇顯示的屬性。證明,因為它是零知識,不會向驗證者,發行者或任何其他人顯示其他資訊。

功能3 如何將Idemix與Hyperledger Fabric一起使用

要在Hyperledger Fabric中使用Idemix,需要以下三個基本步驟:

發行者:Fabric CA 或者 idemixgen
驗證者:Idemix MSP 
使用者  :java SDK類org.hyperledger.fabric_ca.sdk.HFCAClient

(例如:IdemixEnrollment idemixEnrollment = hfcaClient.idemixEnroll(x509enrollment, "idemixMSPID1"))

功能2. 設定金鑰級背書策略

允許每個金鑰級的背書策略覆蓋預設的鏈碼級背書策略。

在Fabric1.3版本之前常見的背書策略是:例項化或者升級chaincode程式碼時設定的,例如:

peer chaincode instantiate -C <channelid> -n mycc -P "AND('Org1.peer', 'Org2.peer')"
peer chaincode instantiate -o  orderer.qklszzn.com:7050 -C roberttestchannel -n r_test_cc6 -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR      ('Org1MSP.member','Org2MSP.member')"

如果未指定,預設背書策略:

 “OR('Org1.member','Org2.member')”。意思是組織1或組織2的任何成員

'Org0.admin':Org0的任何管理員

'Org1.member':Org1的任何成員

'Org1.client':Org1的任何客戶端

'Org1.peer':Org1的任何peer節點

在Fabric1.3版本中 shim API 提供了設定和獲取背書策略的方法

SetStateValidationParameter(key string, ep []byte) error
GetStateValidationParameter(key string) ([]byte, error)

對於私有資料有如下方法:

SetPrivateDataValidationParameter(collection, key string, ep []byte) error
GetPrivateDataValidationParameter(collection, key string) ([]byte, error)

為了幫助設定背書策略並將其編組為驗證引數位元組陣列,shim提供了便利功能,允許智慧合約開發人員根據組織的MSP識別符號處理背書策略:

type KeyEndorsementPolicy interface {
    // Policy returns the endorsement policy as bytes
    Policy() ([]byte, error)

 
    // AddOrgs adds the specified orgs to the list of orgs that are required
    // to endorse
    AddOrgs(roleType RoleType, organizations ...string) error

 
    // DelOrgs delete the specified channel orgs from the existing key-level endorsement
    // policy for this KVS key. If any org is not present, an error will be returned.
    DelOrgs([]string) error

 
    // DelAllOrgs removes any key-level endorsement policy from this KVS key.
    DelAllOrgs() error

 
    // ListOrgs returns an array of channel orgs that are required to endorse changes
    ListOrgs() ([]string, error)
}

用法:

要為金鑰設定背書策略,其中需要兩個特定組織來背書金鑰更改,將兩個組織MSPIDs傳遞給AddOrgs(),然後呼叫Policy()以構造背書策略位元組陣列,傳遞給SetStateValidationParameter()。

功能3. 使用分頁查詢CouchDB狀態資料庫

客戶端現在可以從智慧合約查詢中瀏覽結果集,從而可以支援具有高效能的大型結果集。分頁是通過指定pagesize(單頁資料條數)和bookmark(查詢起始點),程式碼如下:

func (t *SimpleChaincode) queryMarblesWithPagination(stub shim.ChaincodeStubInterface, args []string) pb.Response {

      //   0
      // "queryString"
      if len(args) < 3 {
              return shim.Error("Incorrect number of arguments. Expecting 3")
      }
      queryString := args[0]
      //return type of ParseInt is int64
      pageSize, err := strconv.ParseInt(args[1], 10, 32)
      if err != nil {
              return shim.Error(err.Error())
      }
      bookmark := args[2]

      queryResults, err := getQueryResultForQueryStringWithPagination(stub, queryString, int32(pageSize), bookmark)
      if err != nil {
              return shim.Error(err.Error())
      }
      return shim.Success(queryResults)
}

 

功能4. Chaincode為開發人員

作為對用Go和node編寫的智慧合約的當前Fabric支援的補充。現在支援Java,1.3版本將明確可用java進行智慧合約的編寫。

 

功能5. 基於peer節點通道的事件服務

基於peer通道的事件服務本身並不是新概念(它首次出現在v1.1中),但是v1.3版本標誌著舊事件中心的結束。在升級到v1.3之前,使用舊事件中心的應用程式必須切換到新的基於peer通道的事件服務。

在Fabric1.1和1.2的版本中 core.yaml中有EventHub相關配置,在1.3的版本,卻沒有了EventHub相關配置。

但是並不影響使用,您依然可以通過;

 private static EventHub eventHub;

private static PeerEvents.Event goodEventBlock;

eventHub = new EventHub("test", "grpc://lh:99", null, null);

goodEventBlock = PeerEvents.Event.newBuilder().setBlock(blockBuilder).build();

BlockEvent be = new BlockEvent(eventHub, goodEventBlock);

或

channel.registerBlockListener(blockEvent -> {

    log.debug("========================Event事件監聽========================");

       try {

           org.getBlockListener().received(execBlockInfo(blockEvent));

                } catch (Exception e) {

                    e.printStackTrace();

                    org.getBlockListener().received(getFailFromString(e.getMessage()));

   }

log.debug("========================Event事件監聽結束========================");

});

原文連結:https://blog.csdn.net/wh15055768834/article/details/83153096

相關文章