(翻譯)fabric1.2.1新特性-可拔插交易背書和驗證

可拔插交易背書和驗證

動機

當(dāng)交易在提交被驗證時,peer節(jié)點在交易本身的狀態(tài)改變之前執(zhí)行各種檢查:

  • 驗證簽名交易的標(biāo)識
  • 驗證交易中背書人的簽名
  • 確保交易滿足相應(yīng)鏈碼的命名空間的背書策略

有些用例要求與fabric驗證規(guī)則不同的自定義交易驗證規(guī)則往果,例如:

  • State-based endorsemet(基于狀態(tài)的背書):當(dāng)背書策略取決于密鑰忘古,并不僅僅取決于命名空間振湾。
  • UTXO(Unspent Transaction Output未花費交易輸出):當(dāng)驗證考慮到,不論交易是否不會對輸入雙花。
  • Anonymous transactions(匿名交易):當(dāng)背書不包含peer節(jié)點的身份锨匆,但是無法鏈接到peer節(jié)點身份的簽名和公鑰被共享。

可拔插背書與驗證邏輯

fabric運行將定制的背書和驗證邏輯實現(xiàn)和部署在peer節(jié)點中脐嫂,以可插拔的方式與鏈碼處理相關(guān)聯(lián)统刮。這個邏輯不僅可以編譯到peer節(jié)點中,內(nèi)置于可選邏輯中账千,也可以作為Golang插件與peer節(jié)點一起編譯和部署侥蒙。
回想一下,在鏈碼實例化時匀奏,每個鏈碼都與其自己的背書和驗證邏輯相關(guān)聯(lián)鞭衩。如果用戶未選擇一個,則隱式選擇默認的內(nèi)置邏輯娃善。peer節(jié)點管理員通過在peer節(jié)點啟動時加載并且應(yīng)用定制的背書/驗證邏輯來改變通過擴展peer節(jié)點本地配置而選擇的背書/驗證邏輯论衍。

配置

每一個peer節(jié)點都有一個本地配置文件(core.yaml),它聲明了背書/驗證邏輯名稱和要運行的實現(xiàn)之間的映射關(guān)系聚磺。
默認的背書邏輯叫做ESCC坯台,默認的驗證邏輯叫做VSCC,他們的定義可以在本地配置文件的"handlers"部分找到:

handlers:
    endorsers:
      escc:
        name: DefaultEndorsement
    validators:
      vscc:
        name: DefaultValidation

當(dāng)背書或者驗證實現(xiàn)被編譯到peer節(jié)點中時瘫寝,"name"屬性標(biāo)識要運行的初始化函數(shù)蜒蕾,以便獲得創(chuàng)建背書/驗證邏輯實例的工程稠炬。
該函數(shù)是在"core/handlers/library/library.go"路徑下的HandlerLibrary構(gòu)造的實例方法,為了添加自定義背書/驗證邏輯咪啡,需要使用任何額外的方法擴展此構(gòu)造首启。
由于這很復(fù)雜并且較難于部署,因此可以以Golang插件的形式通過在名為"library"屬性名稱下添加另一個屬性來部署自定義的背書/驗證模塊撤摸。
舉個例子毅桃,如果我們以插件的形式實現(xiàn)了自定義的背書和驗證邏輯模塊作為基于狀態(tài)的背書,我們可以在core.yaml配置文件中以如下形式定義:

handlers:
    endorsers:
      escc:
        name: DefaultEndorsement
      statebased:
        name: state_based
        library: /etc/hyperledger/fabric/plugins/state_based_endorsement.so
    validators:
      vscc:
        name: DefaultValidation
      statebased:
        name: state_based
        library: /etc/hyperledger/fabric/plugins/state_based_validation.so

我們必須將.so插件文件放在peer節(jié)點本地文件系統(tǒng)中准夷。

此后钥飞,自定義背書或者驗證邏輯實現(xiàn)將被稱為"插件",即使它們被編譯到peer節(jié)點中衫嵌。

背書插件實現(xiàn)

為了實現(xiàn)背書插件代承,必須實現(xiàn)在"core/handlers/endorsement/api/endorsement.go"文件中相應(yīng)的插件接口:

// 背書插件提案回復(fù)
type Plugin interface {
    //為給定的有效載荷(ProposalResponsePayload字節(jié))背書簽名,并且可以選擇改變它
    // 返回:
    // 背書:有效載荷上簽名渐扮,以及用于驗證簽名的標(biāo)識论悴。
    // 作為輸入提供的有效載荷(可在此功能中修改)
    // 或者失敗時出錯
    Endorse(payload []byte, sp *peer.SignedProposal) (*peer.Endorsement, []byte, error)

    // 初始化將依賴注入插件的實例
    Init(dependencies ...Dependency) error
}

通過讓peer節(jié)點調(diào)用PluginFactory接口中的New方法為每個通道創(chuàng)建給定插件類型(通過方法名稱識別為HandlerLibrary的實例方法或者.so插件文件路徑)的背書插件實例,該方法期望由插件開發(fā)人員實現(xiàn):

// PluginFactory 創(chuàng)建一個新的插件實例
type PluginFactory interface {
    New() Plugin
}

初始化方法被希望接收在"core/handlers/endorsement/api/"路徑下聲明的墓律,識別為嵌入Dependency接口的所有依賴項作為輸入膀估。

在創(chuàng)建插件實例之后,peer節(jié)點將依賴關(guān)系作為傳遞參數(shù)調(diào)用初始化方法(Init)耻讽。

目前察纯,fabric為背書插件提供了一下依賴項:

  • SigningIdentityFetcher:返回一個局域給定簽名提案的SigningIdentity實例:
// SigningIdentity對消息進行簽名并將其公共標(biāo)識序列化為字節(jié)數(shù)據(jù)
type SigningIdentity interface {
    // Serialize 返回此標(biāo)識的字節(jié)表示形式,用于驗證此SigningIdentity簽名的消息
    Serialize() ([]byte, error)

    // Sign 為給定有效載荷簽名并返回簽名
    Sign([]byte) ([]byte, error)
}
  • StateFetcher:獲取與狀態(tài)數(shù)據(jù)庫(world state)交互的狀態(tài)對象(State)针肥。
// State 定義與狀態(tài)數(shù)據(jù)的交互方式
type State interface {
    // GetPrivateDataMultipleKeys 在一次調(diào)用中獲取多個私有數(shù)據(jù)項的值
    GetPrivateDataMultipleKeys(namespace, collection string, keys []string) ([][]byte, error)

    // GetStateMultipleKeys 在一次調(diào)用中獲取多個鍵的值
    GetStateMultipleKeys(namespace string, keys []string) ([][]byte, error)

    // GetTransientByTXID 獲取與給定txID關(guān)聯(lián)的私有數(shù)據(jù)值
    GetTransientByTXID(txID string) ([]*rwset.TxPvtReadWriteSet, error)

    // Done 釋放狀態(tài)數(shù)據(jù)占用的資源
    Done()
 }

驗證插件的實現(xiàn)

為了實現(xiàn)驗證插件饼记,必須實現(xiàn)在路徑"core/handlers/validation/api/validation.go"下的插件接口:

// 驗證交易插件
type Plugin interface {
    // 如果在給定塊中給定位置的交易內(nèi)給定位置的動作是有效的Validate函數(shù)返回nil,否則返回一個error錯誤
    Validate(block *common.Block, namespace string, txPosition int, actionPosition int, contextData ...ContextDatum) error

    // 初始化將依賴注入插件的實例
    Init(dependencies ...Dependency) error
}

每個ContextDatum都是由peer節(jié)點傳遞給驗證插件的額外的運行時派生的元數(shù)據(jù)慰枕。目前具则,唯一傳遞的ContextDatum是代表鏈碼的背書策略:

 // SerializedPolicy 定義一個序列化策略
type SerializedPolicy interface {
      validation.ContextDatum

      // Bytes 返回SerializedPolicy字節(jié)形式數(shù)據(jù)
      Bytes() []byte
 }

通過讓peer節(jié)點調(diào)用PluginFactory接口中的New方法為每個通道創(chuàng)建給定插件類型(通過方法名稱識別為HandlerLibrary的實例方法或者.so插件文件路徑)的驗證插件實例,該方法期望由插件開發(fā)人員實現(xiàn):

// PluginFactory 創(chuàng)建一個新的插件實例
type PluginFactory interface {
    New() Plugin
}

初始化方法被希望接收在"core/handlers/validation/api/"路徑下聲明的具帮,識別為嵌入Dependency接口的所有依賴項作為輸入博肋。

在創(chuàng)建插件實例之后,peer節(jié)點將依賴關(guān)系作為傳遞參數(shù)調(diào)用初始化方法(Init)蜂厅。

目前匪凡,fabric為背書插件提供了一下依賴項:

  • IdentityDeserializer:將標(biāo)識身份的byte數(shù)據(jù)轉(zhuǎn)換為可被用于驗證由其簽名的身份對象,并根據(jù)其對應(yīng)的MSP進行驗證掘猿,并查看他們是否滿足給定的MSP Principal(見MSP服務(wù)相關(guān)源碼)病游。完整的規(guī)范被定義在"core/handlers/validation/api/identities/identities.go"。

  • PolicyEvaluator:評估是否滿足給定的策略:

// PolicyEvaluator 評估策略
type PolicyEvaluator interface {
    validation.Dependency

    // Evaluate 接收一組簽名數(shù)據(jù)并評估這組簽名是否滿足給定的字節(jié)數(shù)據(jù)的策略
    Evaluate(policyBytes []byte, signatureSet []*common.SignedData) error
}
  • StateFetcher:獲取與狀態(tài)數(shù)據(jù)庫(world state)交互的狀態(tài)對象(State)稠通。
// State 定義與狀態(tài)數(shù)據(jù)的交互方式
type State interface {
    // GetStateMultipleKeys 在一次調(diào)用中獲取多個鍵的值
    GetStateMultipleKeys(namespace string, keys []string) ([][]byte, error)

    // GetStateRangeScanIterator 返回一個包含給定鍵范圍的所有鍵值集合的迭代器衬衬。startKey被包含在結(jié)果中轻绞,并且排除了endKey∮赌停空的startKey引用第一個可用鍵,空的endKey引用最后一個可用鍵唧龄。為了掃描所有鍵兼砖,startKey和endKey都可以作為空字符串提供。但是既棺,出于性能原因讽挟,應(yīng)謹慎使用完整掃描。返回的ResultsIterator包含類型為*KV的結(jié)果丸冕,該結(jié)果定義在"protos/ledger/queryresult"
    GetStateRangeScanIterator(namespace string, startKey string, endKey string) (ResultsIterator, error)

    // Done 釋放狀態(tài)數(shù)據(jù)占用的資源
    Done()
}

重要注意事項

  • 所有節(jié)點驗證插件的一致性:在將來的版本中耽梅,fabric通道基礎(chǔ)設(shè)施將保證在任何給定的區(qū)塊鏈高度,通道中的所有peer節(jié)點對給定的鏈碼使用相同的驗證邏輯胖烛,以消除可能由于在peer節(jié)點之間意外運行不同實現(xiàn)導(dǎo)致狀態(tài)差異的錯誤配置的可能性眼姐。但是,目前系統(tǒng)才做元和管理員有責(zé)任確保不會發(fā)生這種情況佩番。
  • 驗證插件的錯誤處理:每當(dāng)驗證插件無法確定由于某些瞬態(tài)執(zhí)行問題(例如众旗,無法訪問數(shù)據(jù)庫)而無法確定給定交易是否被驗證有效時,它應(yīng)該返回在"core/handlers/validation/api/validation.go"中定義的ExecutionFailureError類型的錯誤趟畏。但是贡歧,如果返回ExecutionFailureError錯誤,則鏈處理將暫停赋秀,而不是將交易標(biāo)記為無效利朵。只是為了防止不同peer節(jié)點之間的狀態(tài)分歧。
  • 將fabric代碼導(dǎo)入插件:非常不鼓勵導(dǎo)入除了協(xié)議之外的fabric代碼作為插件的一部分猎莲,這可能在fabric發(fā)行版之間發(fā)生代碼更改時導(dǎo)致問題绍弟,或者在運行不同版本peer節(jié)點時導(dǎo)致不可操作性問題。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末著洼,一起剝皮案震驚了整個濱河市晌柬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌郭脂,老刑警劉巖年碘,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異展鸡,居然都是意外死亡屿衅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門莹弊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涤久,“玉大人涡尘,你說我怎么就攤上這事∠煊兀” “怎么了考抄?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔗彤。 經(jīng)常有香客問我川梅,道長,這世上最難降的妖魔是什么然遏? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任贫途,我火速辦了婚禮,結(jié)果婚禮上待侵,老公的妹妹穿的比我還像新娘丢早。我一直安慰自己,他們只是感情好秧倾,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布怨酝。 她就那樣靜靜地躺著,像睡著了一般那先。 火紅的嫁衣襯著肌膚如雪凫碌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天胃榕,我揣著相機與錄音盛险,去河邊找鬼。 笑死勋又,一個胖子當(dāng)著我的面吹牛苦掘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楔壤,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鹤啡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹲嚣?” 一聲冷哼從身側(cè)響起递瑰,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隙畜,沒想到半個月后抖部,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡议惰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年慎颗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡俯萎,死狀恐怖傲宜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夫啊,我是刑警寧澤函卒,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站撇眯,受9級特大地震影響报嵌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叛本,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望彤钟。 院中可真熱鬧来候,春花似錦、人聲如沸逸雹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梆砸。三九已至转质,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帖世,已是汗流浹背休蟹。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留日矫,地道東北人赂弓。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像哪轿,于是被迫代替她去往敵國和親盈魁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概要 區(qū)塊鏈網(wǎng)絡(luò)使用 gRPC 協(xié)議 Protocol Buffers(格式的 API) 使用的協(xié)議 gRPC P...
    簡聞閱讀 3,998評論 1 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理窃诉,服務(wù)發(fā)現(xiàn)杨耙,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 這是對簡書文檔的一些勘誤和豐富 參考https://hyperledger-fabric.readthedocs....
    peterSZW閱讀 290評論 0 1
  • 1飘痛、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,981評論 3 119
  • 本文主要講xpath(還是以百度首頁為例) 官方介紹:XPath即為XML路徑語言珊膜,它是一種用來確定XML1(標(biāo)準(zhǔn)...
    敏兒最棒閱讀 271評論 0 0