Hyperledger-Fabric-SDK-設(shè)計(jì)

概要

區(qū)塊鏈網(wǎng)絡(luò)使用

  • gRPC 協(xié)議
  • Protocol Buffers(格式的 API)

使用的協(xié)議

  • gRPC

Protocol Buffers 格式的 API 包括

  • 交易處理
  • 安全的成員關(guān)系服務(wù)
  • 區(qū)塊鏈遍歷
  • 事件處理

SDK 提供的 API 最小集合實(shí)現(xiàn)

目標(biāo)

  • 要解決客戶在區(qū)塊鏈網(wǎng)絡(luò)中直接面對(duì)的一些原始需求
  • 做一些頂層的合理抽象以方便開(kāi)發(fā)人員開(kāi)發(fā)
  • 在本地應(yīng)用代碼中使用這些 API 后方便開(kāi)發(fā)工作的進(jìn)行拱烁。

使用 SDK 并不會(huì)妨礙應(yīng)用直接調(diào)用 gRPC 的操作。

注意: 當(dāng)前的 REST API 并不被推薦使用,SDK 不應(yīng)該基于使用 REST API 而創(chuàng)建蝇完。跳過(guò) REST 直接使用 gRPC 的原因是:能夠控制 全雙向的數(shù)據(jù)流(大部分的 API 調(diào)用都是異步的),更好的性能拾弃。此外怨规,自從節(jié)點(diǎn)內(nèi)部模塊通信使用了 gRPC 之后,便不必再開(kāi)放更多的 HTTP/HTTPS 端口了

例外的情況 新的成員服務(wù)方式(CA)是按 REST API 的規(guī)則實(shí)現(xiàn)的

作為參考咆疗,F(xiàn)abric v1.0的架構(gòu)和交互模型可以在下面 這個(gè)鏈接 所指向的工作單元的附件文檔里面查看


目標(biāo)

應(yīng)用開(kāi)發(fā)

為開(kāi)發(fā)人員提供編寫應(yīng)用程序的多種操作區(qū)塊鏈網(wǎng)絡(luò)的方式。

  • 部署/執(zhí)行 chaincode
  • 監(jiān)聽(tīng)網(wǎng)絡(luò)中產(chǎn)生的事件
  • 接收塊信息
  • 把交易存儲(chǔ)到賬本中母债,等等

chaincode 開(kāi)發(fā)

可以為開(kāi)發(fā)人員提供編寫 chaincode 單元測(cè)試代碼
開(kāi)發(fā)人員應(yīng)該能夠在不把 chaincode 部署到網(wǎng)絡(luò)上的情況下快速測(cè)試 chaincode

原則

良好的 API 文檔午磁,數(shù)據(jù)模型尝抖,示例代碼

提供清晰的文檔說(shuō)明

便于使用

便于使用

  • chaincode 開(kāi)發(fā)人員和應(yīng)用程序開(kāi)發(fā)人員關(guān)注于書(shū)寫業(yè)務(wù)邏輯代碼。
  • SDK 編譯時(shí)間上不應(yīng)該對(duì) fabric project 有任何依賴迅皇。(除非原始文件定義了多種合約昧辽??需要看英文原文
  • SDK packages/jars/libraries 應(yīng)該在常用的資源庫(kù)網(wǎng)站上可獲取 引用的包需要常用且方便查找

性能

  • 高吞吐量
  • 水平擴(kuò)展能力
  • 更低的延遲

SDK 應(yīng)該是一個(gè)組件狀態(tài)無(wú)關(guān)化的理想實(shí)現(xiàn)登颓,或者允許應(yīng)用實(shí)例數(shù)據(jù)庫(kù)共享狀態(tài)

版本控制

統(tǒng)一的版本控制下搅荞,建議將 SDK 通過(guò)多種語(yǔ)言實(shí)現(xiàn),并且多種實(shí)現(xiàn)的 SDK 之間在功能上能夠保持互通

可服務(wù)性

本 SDK 應(yīng)該方便于在可服務(wù)性支持中添加插件框咙,即日志系統(tǒng)咕痛。具體細(xì)節(jié)不是很理解。

它應(yīng)該允許SDK使用方的應(yīng)用添加一個(gè)日志處理的實(shí)例喇嘱。應(yīng)用傾向于在SDK內(nèi)部和外部使用一個(gè)通用的日志系統(tǒng)茉贡,這是非常有用的。一個(gè)IT組織為了監(jiān)視和分析通常會(huì)安裝日志腳本者铜,比如對(duì)一個(gè)標(biāo)準(zhǔn)日志格式的需求腔丧。本SDK應(yīng)該有一個(gè)編譯進(jìn)版本的日志系統(tǒng)以便于開(kāi)發(fā)人員通過(guò)默認(rèn)方式獲取日志。但是它必須允許設(shè)置一個(gè)擁有一系列標(biāo)準(zhǔn)集合的外部日志系統(tǒng)來(lái)記錄API日志作烟。

場(chǎng)景

有許多種可能場(chǎng)景愉粤,但是讓我們關(guān)注一少部分來(lái)說(shuō)明 SDK 的整體功能

成員的注冊(cè)和登記

需要有身份認(rèn)證的證書(shū),證書(shū)的提供者拿撩,證書(shū)可被驗(yàn)證
  • 為了跟 fabric 交互衣厘,需要具備一個(gè)專有的身份認(rèn)證,它被編碼進(jìn) ECert (登記證書(shū)) 的成員證書(shū)里
  • 證書(shū)可能是外部認(rèn)證機(jī)構(gòu)提供绷雏,或者由 fabric 成員服務(wù)提供
  • ECert可以被fabric組件在建立鏈的信任鏈時(shí)驗(yàn)證即可

如果用一個(gè)標(biāo)準(zhǔn)的CA來(lái)管理分配ECert头滔,交易會(huì)被ECert簽名。這將使得每一個(gè)交易對(duì)于每一個(gè)客戶端都是可驗(yàn)證的涎显。

TCert 怎么產(chǎn)生的坤检?
MSP 在 fabric 中的設(shè)計(jì)是,利用一個(gè)加密算法從 ECert 的密鑰對(duì)導(dǎo)出一個(gè)密鑰對(duì)期吓,因此為每一個(gè)交易產(chǎn)生一個(gè)假名證書(shū)

一個(gè) TCert 不能代表一個(gè)認(rèn)證的身份早歇,但是能通過(guò)成員服務(wù)追蹤到原始的 ECert讨勤。這個(gè)技術(shù)在許多業(yè)務(wù)場(chǎng)景下隱藏交易認(rèn)證是非常有用的潭千。

Fabric 提供了 MSP 接口的一種實(shí)現(xiàn),命名為 “COP” 立意來(lái)源于它的作用就像警察屉来,而不是來(lái)源于首字母路翻。在github 的組織超級(jí)賬本里面的代碼庫(kù) fabric-cop 就是它。(注:現(xiàn)在這個(gè)倉(cāng)庫(kù)在 github 上的 hyperledger-archives 目錄下茄靠,目前此倉(cāng)庫(kù)的狀態(tài)為只讀狀態(tài)茂契,已經(jīng)棄用)

給一個(gè)基于 fabric 的網(wǎng)絡(luò)配置一個(gè)外部的 CA,用戶注冊(cè)也會(huì)在外部維護(hù)慨绳。這個(gè)外部的用戶注冊(cè)系統(tǒng)負(fù)責(zé)認(rèn)證用戶掉冶。一個(gè)已經(jīng)被認(rèn)證的用戶為了獲取 ECert 可以使用 CA 請(qǐng)求登記。

就 SDK 而言脐雪,應(yīng)該有兩種 API

  • 支持任何 CA(包括內(nèi)建的和外部的)通用 API

    • enroll(): 使用 SDK 的應(yīng)用程序執(zhí)行最基本的操作 比如關(guān)聯(lián)用戶身份厌小,為認(rèn)證用戶獲取 ECert 的程序
    • getTCert(): 獲取交易證書(shū)允許用戶提交交易
  • 專門為 fabric 的內(nèi)建成員服務(wù)提供的 API

客戶端有關(guān)可選的成員服務(wù)實(shí)現(xiàn)(即COP)的設(shè)計(jì)需要單獨(dú)的文檔來(lái)說(shuō)明

鏈的創(chuàng)建

Hyperledger Fabric 所設(shè)計(jì)的支持隱私性和機(jī)密性的通道和賬本,統(tǒng)一被稱為一條『鏈』喂江。

通道和賬本設(shè)計(jì)更多內(nèi)容請(qǐng)查看

  • 通信(傳輸中的數(shù)據(jù))被限制在參與方之間的通道內(nèi)
  • 同時(shí)塊內(nèi)數(shù)據(jù)(已被持久化的數(shù)據(jù))保存在一個(gè)私有的僅僅在這些參與方之間分布式存儲(chǔ)的賬本中召锈。
  • 不屬于鏈的網(wǎng)絡(luò)節(jié)點(diǎn)不了解通道和私有賬本內(nèi)部任何數(shù)據(jù)旁振,也不能利用這些數(shù)據(jù)获询。

一旦一個(gè)鏈被創(chuàng)建,應(yīng)用可以發(fā)送交易給鏈上以私有方式存在的節(jié)點(diǎn)拐袜,并且已提交被驗(yàn)證的交易到私有賬本吉嚣。這句話不通

創(chuàng)建鏈的責(zé)任落在應(yīng)用程序身上。通過(guò) SDK 應(yīng)用程序初始化鏈的組織團(tuán)體(網(wǎng)絡(luò)成員的代表)構(gòu)成并且給排序服務(wù)尝哆。為什么是給排序服務(wù)

  • 在 SDK 里,通道和它本身關(guān)聯(lián)的賬本的綁定由鏈類體現(xiàn)恒序。
  • 應(yīng)用和指定的排序節(jié)點(diǎn)第一次準(zhǔn)備一個(gè)新的通道并且獲取一個(gè)包含關(guān)于新鏈的密鑰信息的創(chuàng)世區(qū)塊,
    • 參與者信息(URL 和證書(shū))喊巍、
    • 排序節(jié)點(diǎn)信息(URL 和證書(shū))崭参。

Q: 應(yīng)用通過(guò)什么來(lái)協(xié)調(diào)新通道與參與節(jié)點(diǎn)的邀請(qǐng)?

A: 應(yīng)用通過(guò) 目標(biāo)是配置系統(tǒng) chaincode 的配置化交易 來(lái)協(xié)調(diào)新通道對(duì)參與節(jié)點(diǎn)的邀請(qǐng)逢并。(這句話還是不夠直白,看英文自己理解吧~)

sdk-image01

交易支持

一個(gè)交易包含兩個(gè)明確的步驟:

  • 背書(shū):是請(qǐng)求節(jié)點(diǎn)對(duì)交易的結(jié)果進(jìn)行運(yùn)行并背書(shū)(簽名)
  • 提交:是在交易和交易的背書(shū)內(nèi)容的有效期內(nèi)請(qǐng)求共識(shí) 這個(gè)是什么意思

下圖說(shuō)明交易時(shí)客戶端SDK和節(jié)點(diǎn)之間的交互。更多信息請(qǐng)查看 架構(gòu)文檔

流程簡(jiǎn)介:

首先 SDK 和應(yīng)用協(xié)同工作俯树,使用 應(yīng)用 的(或者被認(rèn)證用戶的)私鑰給信息簽名(所有的外部信息都需要簽名認(rèn)證)。然后它根據(jù) 背書(shū)策略(通過(guò)驗(yàn)證系統(tǒng)鏈碼或者VSCC實(shí)現(xiàn)的)給一個(gè)或多個(gè)節(jié)點(diǎn) 發(fā)送信息。它獲得 異步的反饋 并且決定是否執(zhí)行創(chuàng)建和提交交易到共識(shí)服務(wù)瓦糟。執(zhí)行交易提交的決定是基于背書(shū)策略謂詞(就像 2 out of 3)基于帶外知識(shí)。一旦提交劲蜻,交易的處理流程便是異步的先嬉,所以SDK監(jiān)聽(tīng)提交事件來(lái)通知應(yīng)用交易處理流程的完成或者拒絕的結(jié)果。

image02

上圖是對(duì)交易流程非常上層的描述鳄袍。SDK 中有詳細(xì)的執(zhí)行網(wǎng)絡(luò)和環(huán)境配置,包括 獲取簽名密鑰來(lái)安全的管理成員哀九,處理交易和事件流呼胚,(依賴應(yīng)用的)多種共識(shí)通道。

客戶端服務(wù)器 API 參考

下面的產(chǎn)指向 gRPC 與 fabric (節(jié)點(diǎn)年扩,排序者和成員服務(wù))溝通的信息和服務(wù)定義

  • Proposal (部署或者交易調(diào)用的提案)
  • ProposalResponse (全局的提案回應(yīng))
  • Chaincode (chaincode, 調(diào)用,部署况脆,等細(xì)節(jié))
  • ChaincodeProposal (chaincode-specific proposal header and payload)
  • Transaction (transaction invocation)
  • ChaincodeTransaction (chaincode-specific transaction action payload)

新的COP API是基于json的,需要添加到新的成員服務(wù)設(shè)計(jì)中性湿。** COP 已棄用**

消息定義應(yīng)該是設(shè)計(jì) SDK APIs 的一個(gè)靈感來(lái)源叹括。因?yàn)?SDK 可以使用 智能缺省狀態(tài)信息 來(lái)最小化請(qǐng)求的參數(shù)汁雷。

詳細(xì)說(shuō)明

這里討論設(shè)計(jì)的原則和架構(gòu)思路

總的來(lái)說(shuō)暑刃,我們有不同等級(jí)的(數(shù)值越小表示等級(jí)越高)一些模塊:

package: Hyperledger Fabric Client

模塊 等級(jí) 功能
Client 0 主要的入口模塊溜嗜。它必須允許用戶創(chuàng)建需要的任何對(duì)象來(lái)執(zhí)行所有支持的操作辟躏,例如直接連接網(wǎng)絡(luò),chaincode 部署野哭,交易執(zhí)行,多種查詢篱蝇。另外,基于編碼規(guī)范和普遍的社區(qū)練習(xí)涧衙,每一種語(yǔ)言的實(shí)現(xiàn)也能決定是否添加方便的方法,如 sendTransaction(chain, tx)
Chain 1 一個(gè)鏈代表一些節(jié)點(diǎn)特別形成的一個(gè)網(wǎng)絡(luò),啟動(dòng)一個(gè)共識(shí)的通道,在通道中交易 可以被獨(dú)立的處理寻拂。一個(gè)網(wǎng)絡(luò)可能有一個(gè)或多個(gè)鏈。鏈上的節(jié)點(diǎn)維護(hù)一個(gè)單獨(dú)的賬本包含交易在鏈上派發(fā)泛粹,包括成員關(guān)系的任何配置。所有的交易都是在鏈上發(fā)送,一個(gè)應(yīng)用可能操作多個(gè)鏈蒙挑。
Peer 2 代表網(wǎng)絡(luò)上的計(jì)算節(jié)點(diǎn)。節(jié)點(diǎn)的角色有背書(shū)節(jié)點(diǎn)和提交節(jié)點(diǎn)馋袜,它們都在維護(hù)著賬本。應(yīng)用可能連接到一定數(shù)量的可用的節(jié)點(diǎn)泽台。
Orderer 2 類似節(jié)點(diǎn),不同的是它代表排序服務(wù)的終端因篇,可能是一個(gè)單獨(dú)的節(jié)點(diǎn)(開(kāi)發(fā)時(shí)本地安裝)或者一個(gè)網(wǎng)絡(luò)排序者的代理節(jié)點(diǎn)【馇眩基于區(qū)塊鏈網(wǎng)絡(luò)的 fabric 會(huì)有一個(gè)由多個(gè)排序者節(jié)點(diǎn)組成的單獨(dú)的排序服務(wù)。應(yīng)用可以選擇信任特定的的排序者格嘁,或者一部分排序者,或者設(shè)置代理去給排序節(jié)點(diǎn)廣播交易廊移。
User 2 代表在網(wǎng)絡(luò)上交易的用戶糕簿。用戶實(shí)例可以基于登記證書(shū)被初始化。證書(shū)只可以從成員服務(wù)或者外部 CA 獲取狡孔。理論上懂诗,這種用戶也能代表網(wǎng)絡(luò)上的節(jié)點(diǎn)成員荚醒。然而贮竟,這與應(yīng)用程序無(wú)關(guān)(這更像是網(wǎng)絡(luò)管理方面的問(wèn)題)偿短,所以在這個(gè)設(shè)計(jì)中沒(méi)有開(kāi)放笔链。
Proposal 3 登記的用戶可以向節(jié)點(diǎn)列表提出交易提案來(lái)背書(shū)交易误堡。一旦接收到背書(shū)響應(yīng)姥饰,應(yīng)用程序可以決定是否已經(jīng)獲取背書(shū)簽名,是否需要執(zhí)行提交交易到共識(shí)服務(wù)鸳址。這是關(guān)于提案原始的 GRPC 消息的包裝類呢灶,它提供了便利的創(chuàng)建方法。
ProposalResponse 3 提案調(diào)用背書(shū)節(jié)點(diǎn)的響應(yīng)水评,打包背書(shū)結(jié)果(是或否)博敬,簽名,等等。這是關(guān)于提案響應(yīng)原始的 GRPC 消息包裝類辛藻,它提供了便利的方法來(lái)利用它自己的內(nèi)容(背書(shū)岩榆,簽名,等等)
Transaction 3 登記用戶收集了背書(shū)之后可以提交交易翘盖。交易請(qǐng)求包含背書(shū)簽名和 MVCC + post-image, 并且使用排序服務(wù) API。交易有兩種類型:部署和執(zhí)行吟吝。這是交易有關(guān)原始 GRPC 消息的包裝類,它提供了便利的創(chuàng)建方法速客。
CryptoSuite 3 加密模塊打包了數(shù)字簽名算法阔蛉,非對(duì)稱加密的密鑰對(duì),對(duì)稱加密的密鑰消息癞埠,安全的 hash 和 MAC状原。

Package: Member Service

模塊 等級(jí) 功能
MemberService 0 這是 fabric 可選模塊的客戶端聋呢,成員服務(wù)。本模塊的主要功能是從成員服務(wù)獲取用戶登記證書(shū)颠区。另外削锰,這個(gè)模塊本身或它的擴(kuò)展類也應(yīng)該能在 fabric 默認(rèn)的成員服務(wù)的實(shí)現(xiàn)中提供可用的額外的功能,如用戶注冊(cè)功能等毕莱。

以上各模塊的關(guān)系器贩,我們給出了以下 UML 圖:

sdk-image03

客戶端

和終端用戶主要的交互處理器∨蠼兀客戶端實(shí)例提供一個(gè)和 網(wǎng)絡(luò)上的節(jié)點(diǎn)蛹稍,排序者,可選成員服務(wù)交互的處理器部服。應(yīng)用程序使用 SDK 需要和多個(gè)網(wǎng)絡(luò)交互唆姐,分別通過(guò)單獨(dú)的客戶端實(shí)例進(jìn)行。

每個(gè)客戶端被創(chuàng)建時(shí)廓八,應(yīng)該是使用來(lái)自于共識(shí)服務(wù)的配置數(shù)據(jù)初始化創(chuàng)建奉芦,這些數(shù)據(jù)包含一個(gè)被信任的根的列表,排序節(jié)點(diǎn)證書(shū)和IP地址瘫想,還有一個(gè)節(jié)點(diǎn)證書(shū)列表和可使用的IP地址仗阅。這必須是作為應(yīng)用程序環(huán)境的一部分進(jìn)行的。應(yīng)用程序負(fù)責(zé)維護(hù)客戶端的配置国夜,因?yàn)?SDK 不持久地保存這個(gè)對(duì)象

  • 共識(shí)服務(wù)的配置數(shù)據(jù)包括:
    • 一個(gè)被信任的根的列表
    • 排序節(jié)點(diǎn)證書(shū)
    • IP地址
    • 一個(gè)節(jié)點(diǎn)證書(shū)列表
    • 可使用的IP地址

每個(gè)客戶端實(shí)例可以維護(hù)幾條鏈代表通道和相關(guān)的賬本减噪。

  • new_chain (創(chuàng)建一個(gè)新鏈)

根據(jù)參數(shù)給出的名字創(chuàng)建一個(gè)鏈的實(shí)例。這實(shí)際上代表“通道”(正如上面解釋的)车吹,這個(gè)調(diào)用返回一個(gè)空對(duì)象筹裕。初始化這個(gè)通道,這個(gè)返回的對(duì)象上必須配置一個(gè)參與方的背書(shū)者列表和排序者節(jié)點(diǎn)窄驹。

Params (參數(shù))

+ name(str): 鏈的名稱朝卒,推薦使用命名空間防止碰撞

Return(返回值)

+ (Chain instance):未初始化的鏈的實(shí)例
  • get_chain (獲取鏈)

獲取鏈的實(shí)例。本接口允許保存已存在的鏈實(shí)例供之后的檢索乐埠,并且在應(yīng)用程序?qū)嵗g共享抗斤。記錄鏈的信息是應(yīng)用程序或者 SDK 負(fù)責(zé)的事情。如果應(yīng)用程序不能查看存儲(chǔ)中鏈的信息丈咐,它可以調(diào)用另外一種 API 查詢一個(gè)或多個(gè)節(jié)點(diǎn)來(lái)獲得這些信息瑞眼。

Params

+ name (str): The name of the chain (鏈的名稱)

Returns

+ (Chain instance or None): the chain instance for the name. (以入?yún)⒚逆湹膶?shí)例)

Error:

+ The state store has not been set (還沒(méi)有設(shè)置存儲(chǔ)狀態(tài))
+ A chain does not exist under that name (不存在該名稱命名的鏈)
  • query_chain_info(查詢鏈的信息)

這是一個(gè)網(wǎng)絡(luò)調(diào)用,用來(lái)查詢指定的節(jié)點(diǎn)上鏈的信息棵逊。目標(biāo)節(jié)點(diǎn)必須是屬于目標(biāo)鏈伤疙,才能夠返回請(qǐng)求的信息。

Params

+ name (str): The name of the chain (鏈名)
+ peers (array of Peer instances): target Peers to query(查詢的目標(biāo)節(jié)點(diǎn))

Returns

+ (Chain instance or None): the chain instance for the name.(以入?yún)⒚逆湹膶?shí)例。)

Error:

+ The target Peer(s) does not know anything about the chain(目標(biāo)節(jié)點(diǎn)不了解鏈的信息)

有沒(méi)有可能就沒(méi)有這條鏈

  • set_state_store(設(shè)置狀態(tài)的存儲(chǔ))

SDK 應(yīng)該有一個(gè)內(nèi)建的鍵值存儲(chǔ)的實(shí)現(xiàn)(建議是基于文件的實(shí)現(xiàn)徒像,以便于在開(kāi)發(fā)中設(shè)置)黍特。但是生產(chǎn)系統(tǒng)需要通過(guò)數(shù)據(jù)庫(kù)為更多的穩(wěn)定存儲(chǔ)和聚簇存儲(chǔ)備份,所以多種應(yīng)用程序?qū)嵗梢酝ㄟ^(guò)數(shù)據(jù)庫(kù)共享應(yīng)用狀態(tài)(備注:應(yīng)用不需要豐富的狀態(tài))锯蛀。這個(gè) API 使得存儲(chǔ)模塊具有可插拔特性灭衷,所以應(yīng)用程序可以選擇不同的存儲(chǔ)實(shí)現(xiàn)。

Params

+ store (KeyValueStore): instance of an alternative KeyValueStore implementation provided by the consuming app.(使用方應(yīng)用程序提供的鍵值存儲(chǔ)實(shí)現(xiàn)的實(shí)例)

Returns

+ None
  • get_state_store(獲取狀態(tài)存儲(chǔ))

為 client 提供的獲取狀態(tài)存儲(chǔ)對(duì)象的便利方法

Params

+ None

Returns
+ (KeyValueStore instance): The KeyValueStore implementation object set within this Client, or null if it does not exist(返回設(shè)置到client中的按鍵值對(duì)方式實(shí)現(xiàn)的存儲(chǔ)對(duì)象谬墙,如果不存在返回空)

  • set_crypto_suite (設(shè)置加密模塊)

設(shè)置一個(gè)加密模塊的實(shí)例今布,該實(shí)例是按 CryptoSuite 接口實(shí)現(xiàn)的。一個(gè)加密模塊打包了數(shù)字簽名的算法和使用非對(duì)稱密鑰對(duì)的加密功能拭抬,使用對(duì)稱密鑰加密的消息,安全的 hashing 處理和 MAC

Params

+ Suite (object): an instance of a crypto suite implementation(按接口實(shí)現(xiàn)的加密模塊的實(shí)例)
  • get_crypto_suite (獲取加密模塊)

Client獲取加密模塊對(duì)象的便利方法侵蒙。

Params

+ None

Returns

+ (CryptoSuite instance): The CryptoSuite implementation object set within this Client, or null if it does not exist(加密模塊的對(duì)象)
  • set_user_context(設(shè)置用戶上下文)

根據(jù) client 實(shí)例的安全的上下文設(shè)置用戶類的實(shí)例造虎。用戶的資格證書(shū)會(huì)被用來(lái)執(zhí)行交易并且查詢區(qū)塊鏈網(wǎng)絡(luò)。如果狀態(tài)存儲(chǔ)已經(jīng)設(shè)置到了 client 實(shí)例上纷闺,根據(jù)設(shè)定的用戶上下文算凿,SDK 可以把對(duì)象保存在一個(gè)持久化的緩存中。如果沒(méi)有設(shè)置狀態(tài)存儲(chǔ)犁功,當(dāng)應(yīng)用程序崩潰或者被覆蓋時(shí)氓轰,緩存不能被創(chuàng)建,并且應(yīng)用程序需要再次設(shè)置用戶上下文浸卦。

Params

+ user (User): an instance of the User class encapsulating the authenticated user’s signing materials (private key and enrollment certificate) (參數(shù)是用戶署鸡,用戶類的實(shí)例,它把被認(rèn)證用戶擁有的簽名材料(私鑰和背書(shū)證書(shū))打包在內(nèi))
  • get_user_context(獲取用戶上下文)

正如上面所解釋的限嫌,client 實(shí)例可以擁有一個(gè)可選的狀態(tài)存儲(chǔ)靴庆。SDK 保存已注冊(cè)用戶到可以被應(yīng)用程序的已認(rèn)證用戶(認(rèn)證的工作在 SDK 之外由應(yīng)用程序完成)利用的存儲(chǔ)中。本方法試圖通過(guò)本地存儲(chǔ)中的名稱(通過(guò)鍵值存儲(chǔ)接口獲扰健)加載用戶炉抒。已加載的用戶對(duì)象必須代表一個(gè)已注冊(cè)用戶,并且該用戶擁有一個(gè)已信任的 CA(如 COP 服務(wù))簽名的可用的背書(shū)證書(shū)稚叹。

Params

+ name (str): The name of the user (用戶名稱)

Returns

+ (User instance): The user object corresponding to the name, or null if the user does not exist or if the state store has not been set(返回匹配名稱的用戶對(duì)象焰薄,如果用戶不存在或者狀態(tài)存儲(chǔ)未設(shè)置返回空)

“鏈”對(duì)象從通道獲取設(shè)置項(xiàng),由排序者節(jié)點(diǎn)創(chuàng)建扒袖,與排序者給通道上參與的節(jié)點(diǎn)派發(fā)交易的行為相隔離塞茅。根據(jù)節(jié)點(diǎn)列表和排序者列表配置鏈之后,它必須被初始化僚稿。初始化過(guò)程給排序者節(jié)點(diǎn)發(fā)送一個(gè)配置交易來(lái)創(chuàng)建特定的通道凡桥,并且詢問(wèn)節(jié)點(diǎn)加入通道。

  • add_peer(添加節(jié)點(diǎn))

給鏈對(duì)象添加節(jié)點(diǎn)蚀同,這是純本地操作缅刽。

Params

peer (Peer): an instance of the Peer class that has been initialized with URL, TLC certificate, and enrollment certificate(入?yún)ⅲ罕?URL啊掏,TLC 證書(shū),和 背書(shū)證書(shū) 初始化之后的 Peer 類的對(duì)象衰猛。)

  • remove_peer (移除節(jié)點(diǎn))

從鏈對(duì)象移除節(jié)點(diǎn)迟蜜,這是一個(gè)純本地操作

Params

+ peer (Peer): an instance of the Peer class(節(jié)點(diǎn)實(shí)例)
  • get_peers (獲取節(jié)點(diǎn))

從鏈的本地信息獲取節(jié)點(diǎn)。

Params

+ None

Returns

+ (Peer list): The peer list on the chain(返回鏈上的節(jié)點(diǎn)列表啡省。)
  • add_orderer(添加排序節(jié)點(diǎn))

給鏈對(duì)象添加排序者節(jié)點(diǎn)娜睛,這是純本地操作。 鏈實(shí)例可以選擇使用單個(gè)的排序者節(jié)點(diǎn)卦睹,這個(gè)排序者負(fù)責(zé)向排序者網(wǎng)絡(luò)中其他排序者廣播請(qǐng)求畦戒。或者如果應(yīng)用不信任排序者節(jié)點(diǎn)结序,它可以選擇使用更多的排序者障斋,僅需要向鏈對(duì)象添加它們即可。有關(guān)某個(gè)排序者的所有API會(huì)同時(shí)廣播給所有的排序者徐鹤。

Params

+ orderer (Orderer): an instance of the Orderer class (Orderer實(shí)例)
  • remove_orderer(移除排序節(jié)點(diǎn))

從鏈對(duì)象移除排序者節(jié)點(diǎn)垃环,這是純本地操作。

Params

+ orderer (Orderer): an instance of the Orderer class

get_orderers(獲取排序節(jié)點(diǎn))

獲取鏈的排序節(jié)點(diǎn)返敬,這是純本地操作遂庄。

Params

+ None

Returns

+ (Orderer list): The orderer list on the chain
  • initialize_chain(初始化鏈)

調(diào)用排序者來(lái)開(kāi)始創(chuàng)建新的鏈,創(chuàng)建動(dòng)作本身是開(kāi)放的新的消息流和連接參與節(jié)點(diǎn)的組合劲赠。這是一個(gè)耗時(shí)的處理涛目。只有一個(gè)應(yīng)用程序?qū)嵗枰{(diào)用這個(gè)方法。一旦鏈被成功創(chuàng)建经磅,其他的應(yīng)用程序?qū)嵗齼H僅需要調(diào)用 get_chain() 來(lái)獲取有關(guān)鏈的信息泌绣。

Params

+ None

Returns (鏈的初始化動(dòng)作是否執(zhí)行成功)

+ (bool): whether the chain initialization process was successful
  • update_chain(更新鏈)

調(diào)用排序者節(jié)點(diǎn)來(lái)更新已經(jīng)存在的鏈。這允許給已存在的鏈添加或刪除節(jié)點(diǎn)预厌,也是基于證書(shū)重建對(duì)節(jié)點(diǎn)證書(shū)信息進(jìn)行更新阿迈。

Params

+ None

Returns (更新鏈的操作是否成功)

+ (bool): whether the chain update process was successful
  • is_readonly(是否只讀)

獲取鏈的狀態(tài)來(lái)查看底層通道是否已經(jīng)被終止,創(chuàng)建一個(gè)只讀鏈轧叽,可以查詢信息(交易和狀態(tài))但是不可以提交新的交易苗沧。

Params

+ None

Returns (是否只讀)

+ (bool): is ready-only (true) or not
  • query_info(查詢信息)

查詢鏈的狀態(tài)(高度,已知的節(jié)點(diǎn))中多種有用信息炭晒。

Params

+ none

Returns

+ (ChainInfo) with height, currently the only useful info (高度待逞,當(dāng)前有用的信息)
  • query_block(查詢塊)

根據(jù)塊號(hào)查詢塊。

Params

+ blockNumber (number)

Returns

+ Object containing the block
  • query_transaction(查詢交易)

根據(jù)交易號(hào)查詢交易网严。

Params

+ transactionID

Returns

+ TransactionInfo containing the transaction (交易包含的交易信息)
  • create_deploy_proposal(創(chuàng)建部署提案)

創(chuàng)建交易提案识樱。通過(guò)數(shù)據(jù)(chaincodeID,chaincode 調(diào)用,等)裝配提案怜庸,并且使用匹配 ECert 簽名的私鑰簽名提案当犯。

Params

+ chaincode_path (string): path to the chaincode to deploy

+ chaincode_name (string): a custom name to identify the chaincode on the chain

+ fcn (string): name of the chaincode function to call after deploy to

+ initiate the state(chaincode 的方法名,部署后初始化狀態(tài)時(shí)要調(diào)用它)

+ args (string[]): arguments for calling the init function designated by “fcn”(上面 fcn 的參數(shù))

+ sign (Bool): Whether to sign the transaction, default to True

Returns

+ (Proposal): The created Proposal instance or None.
  • create_transaction_proposal(創(chuàng)建交易提案)

為交易創(chuàng)建一個(gè)提案割疾。通過(guò)數(shù)據(jù)(chaincode 名稱嚎卫,需要調(diào)用的方法,參數(shù)等)裝配提案宏榕,并且使用匹配ECert簽名的私鑰給提案簽名拓诸。

Params

+ chaincode_name (string): The name given to the target chaincode to invoke(要執(zhí)行的目標(biāo)chaincode的名稱)

+ args (string[]): arguments for calling the “invoke” method on the chaincode(正在調(diào)用執(zhí)行的chaincode上的方法的參數(shù))

+ Sign (Bool): Whether to sign the transaction, default to True

Returns

+ (Transaction_Proposal instance): The created Transaction_Proposal instance or None.
  • send_transaction_proposal(發(fā)送交易提案)

把創(chuàng)建好的提案發(fā)送給節(jié)點(diǎn)去背書(shū)。

Params

+ transaction_proposal (Transaction_Proposal): The transaction proposal data(交易提案的數(shù)據(jù))

+ chain: The target chain whose peers the proposal will be sent to(提案將要發(fā)送給的節(jié)點(diǎn)所在的目標(biāo)鏈)

+ retry (Number): Times to retry when failure, by default to 0 (no retry)(重試次數(shù)麻昼,默認(rèn)0)

Returns

+ (Transaction_Proposal_Response response): The response to send proposal request.(發(fā)送提案請(qǐng)求后的響應(yīng))
  • create_transaction (創(chuàng)建交易)

遵從背書(shū)策略根據(jù)提案的響應(yīng)信息創(chuàng)建交易奠支。

Params

+ proposal_responses ([Transaction_Proposal_Response]): The array of proposal responses received in the proposal call.(在提案的調(diào)用中返回的響應(yīng)信息的數(shù)組)

Returns

+ (Transaction instance): The created transaction object instance.(創(chuàng)建的交易對(duì)象實(shí)例)
  • send_transaction(發(fā)送交易)

給鏈的排序服務(wù)(由一個(gè)或多個(gè)排序者節(jié)點(diǎn)組成)發(fā)送交易,然后做共識(shí)和提交到賬本的工作抚芦。

本調(diào)用是異步的胚宦,并且交易提交成功信息是通過(guò)塊或者 chaincode 事件通知的。(本方法必須給應(yīng)用程序提供一個(gè)響應(yīng)機(jī)制關(guān)聯(lián)事件監(jiān)聽(tīng)器處理“交易已提交”燕垃,“交易完成”,“錯(cuò)誤”等事件井联。)

下面有兩種有關(guān) fabric 后端的溝通方式卜壕,觸發(fā)不同的事件回調(diào)給應(yīng)用程序處理器

排序者服務(wù)的 gRPC 客戶端在“廣播”調(diào)用的請(qǐng)求或響應(yīng)方法中使用常規(guī)的無(wú)狀態(tài)的 HTTP 連接。這個(gè)方法的實(shí)現(xiàn)需要在響應(yīng)中接收到成功確認(rèn)時(shí)發(fā)送“交易已提交”事件烙常,或者在接收到錯(cuò)誤時(shí)發(fā)送“錯(cuò)誤”事件
為了支持 fabric “BLOCK” ”, “CHAINCODE” 和 “TRANSACTION” 事件轴捎,這個(gè)方法的實(shí)現(xiàn)需要和作為內(nèi)部事件樞紐機(jī)制一部分的鏈?zhǔn)录垂?jié)點(diǎn)維護(hù)一個(gè)持久的連接。這些事件應(yīng)該引發(fā)方法給應(yīng)用程序發(fā)送 “完成” 或 “錯(cuò)誤” 事件。

Params

+ transaction (Transaction): The transaction object constructed above(上面創(chuàng)建的交易對(duì)象挣棕。)

Returns(一個(gè)事件處理厅目,可以關(guān)聯(lián)到應(yīng)用程序事件處理器的)

+ result (EventEmitter): an handle to allow the application to attach event handlers on“submitted”, “complete”, and “error”.

用戶

用戶類代表已經(jīng)通過(guò) 注冊(cè)證書(shū)注冊(cè)簽名密鑰簽名 的已登記用戶嗤锉。注冊(cè)證書(shū)必須通過(guò)區(qū)塊鏈網(wǎng)絡(luò)配置信任的 CA 證書(shū)簽名垫挨。已注冊(cè)用戶(擁有已簽名密鑰和注冊(cè)證書(shū))可以引導(dǎo) chaincode 部署,交易和鏈上查詢丙号。

用戶注冊(cè)證書(shū)可以事先作為部署應(yīng)用程序的一部分從 CA 獲取怀薛,或者可以通過(guò)它本身的登記程序從可選的 fabric COP ( 已棄用 ) 服務(wù)獲取。

有時(shí)用戶認(rèn)證和節(jié)點(diǎn)認(rèn)證會(huì)混淆。因?yàn)橛脩艨梢岳盟借€,所以用戶身份有代理簽名的能力有缆,而節(jié)點(diǎn)在應(yīng)用程序 /SDKs 上下文中只有驗(yàn)證簽名的認(rèn)證能力栈虚。應(yīng)用程序不能使用節(jié)點(diǎn)身份來(lái)簽名因?yàn)閼?yīng)用程序不能利用節(jié)點(diǎn)身份的私鑰袖外。

什么是用戶認(rèn)證,什么是節(jié)點(diǎn)認(rèn)證魂务?

用戶可以利用私鑰曼验,所以用戶身份有代理簽名的能力

節(jié)點(diǎn)在應(yīng)用程序 /SDKs 上下文中只有驗(yàn)證簽名的認(rèn)證能力

  • get_name(獲取名稱)

獲取成員名稱。從對(duì)象實(shí)例請(qǐng)求參數(shù)粘姜。

Returns (str):

+ The name of the user
  • get_roles(獲取角色)

    獲取用戶的角色取胎。它可能是“客戶端”“審計(jì)員”這類值的數(shù)組霎迫。成員服務(wù)多定義了兩個(gè)的角色用來(lái)保存節(jié)點(diǎn)成員關(guān)系成肘,如“節(jié)點(diǎn)”和“驗(yàn)證者”姜凄,這兩個(gè)沒(méi)有暴露給應(yīng)用程序。

Returns (str[]):

The roles for this user

  • get_enrollment_certificate(獲取背書(shū)證書(shū))

返回底層認(rèn)證證書(shū)代表的用戶身份證書(shū)坛芽。

Params:

+ none

Returns:

+ Certificate in PEM format signed by the trusted CA(返回已信任的CA按PEM格式簽名的證書(shū))
  • set_name(設(shè)置名稱)

設(shè)置用戶的名稱/ID。

Params:

+ name (string[): The user name / id.
  • set_roles(設(shè)置角色)

按上面定義的角色值設(shè)置用戶角色翼抠。

Params:

+ Roles (string[]): The list of roles for the user(入?yún)⒂脩舻慕巧斜砹#?
  • set_enrollment_certificate(設(shè)置背書(shū)證書(shū))

設(shè)置用戶的背書(shū)證書(shū)。

Params:

+ Certificate : The certificate in PEM format signed by the trusted CA(入?yún)⑹潜灰研湃蔚腃A按PEM格式簽名的證書(shū))
  • generate_tcerts(生成交易證書(shū))

獲取一系列 TCert阴颖,可以在交易中使用活喊。TCert 和交易之間是一對(duì)一的關(guān)系。TCert 可以在本地通過(guò) SDK 使用用戶的加密數(shù)據(jù)項(xiàng)生成量愧。

Params

+ count (number): how many in the batch to obtain?(獲取的交易證書(shū)的數(shù)量)

+ Attributes (string[]): list of attributes to include in the TCert(TCert包含的屬性的列表)

Returns (TCert[]):

+ An array of TCerts

節(jié)點(diǎn)

節(jié)點(diǎn)類代表了遠(yuǎn)程節(jié)點(diǎn)和它本身網(wǎng)絡(luò)成員的數(shù)據(jù)钾菊,即用來(lái)驗(yàn)證簽名的 ECert。節(jié)點(diǎn)成員代表組織偎肃,不像用戶成員代表個(gè)體煞烫。

當(dāng)節(jié)點(diǎn)被創(chuàng)建后,只要配置一個(gè)名為 “eventSourceUrl” 的屬性累颂,節(jié)點(diǎn)實(shí)例就可以被指定為一個(gè)事件源滞详。允許 SDK 自動(dòng)關(guān)聯(lián)交易事件監(jiān)聽(tīng)器事件流凛俱。

需要說(shuō)明的是 節(jié)點(diǎn)事件流功能在 節(jié)點(diǎn)層次,不在 鏈 和 chaincode 的層次料饥。

  • connectEventSource(連接事件源)

由于幾乎所有節(jié)點(diǎn)都是事件的生產(chǎn)者蒲犬,當(dāng)創(chuàng)建一個(gè)節(jié)點(diǎn)實(shí)例時(shí),應(yīng)用可以指定它作為應(yīng)用程序的事件源岸啡。只需要鏈上的一個(gè)節(jié)點(diǎn)成為事件源原叮,因?yàn)殒溕系乃泄?jié)點(diǎn)產(chǎn)生的事件相同。本方法告訴 SDK 對(duì)于客戶端應(yīng)用程序來(lái)說(shuō)哪一個(gè)節(jié)點(diǎn)作為事件源使用巡蘸。管理與節(jié)點(diǎn)的 EventHub 連接的生命周期是 SDK 的責(zé)任奋隶。理解并通知選擇的節(jié)點(diǎn)想接收哪種事件類型以及想使用哪個(gè)回調(diào)方法,是客戶端應(yīng)用程序的責(zé)任赡若。

SDK: 管理與節(jié)點(diǎn)的 EventHub 連接的生命周期
客戶端應(yīng)用程序:理解并通知選擇的節(jié)點(diǎn)想接收哪種事件類型以及想使用哪個(gè)回調(diào)方法

Params:

+ None

Result:

+ Promise/Future: this gives the app a handle to attach “success” and “error” listeners(應(yīng)用獲得一個(gè)處理程序來(lái)關(guān)聯(lián)“成功”或“錯(cuò)誤”的監(jiān)聽(tīng)器)
  • is_event_listened(事件是否已被監(jiān)聽(tīng)的標(biāo)記)

網(wǎng)絡(luò)調(diào)用可以顯示出是否至少有一個(gè)監(jiān)聽(tīng)器已經(jīng)連接到事件的目標(biāo)節(jié)點(diǎn)达布。這能幫助應(yīng)用實(shí)例在崩潰后恢復(fù)中或者多個(gè)實(shí)例部署的情況下決定是否需要連接事件源。

備注:這個(gè)請(qǐng)求對(duì)節(jié)點(diǎn)上事件的生成者有強(qiáng)化作用逾冬。不是很理解

Params:

+ eventName (string): required (必需的)
+ chain (Chain): optional (可選的)

Result:(是否已經(jīng)被鏈上的一些應(yīng)用實(shí)例監(jiān)聽(tīng))

+ (boolean): whether the said event has been listened on by some application instance on that chain
  • addListener(添加監(jiān)聽(tīng)器)

方法為連接到事件源的節(jié)點(diǎn)提供黍聂,監(jiān)聽(tīng)器注冊(cè)在 EventCallBack,用以接收事件類型集的回調(diào)身腻。添加監(jiān)聽(tīng)器的方法可以被執(zhí)行多次來(lái)支持不同的 EventCallBack 方法接收不同類型的事件产还。

說(shuō)明:以下的參數(shù)在某些語(yǔ)言里是可選的,比如 Java嘀趟,為監(jiān)聽(tīng)器接口創(chuàng)建一個(gè)實(shí)例脐区,并把該實(shí)例作為參數(shù)。

Params:

+ eventType : ie. Block, Chaincode, Transaction (事件類型)

+ eventTypeData : Object Specific for event type as necessary, currently needed for “Chaincode” event type, specifying a matching pattern to the event name set in the chaincode(s) being executed on the target Peer, and for “Transaction” event type, specifying the transaction ID (事件類型數(shù)據(jù):事件類型有必要有一個(gè)特定的對(duì)象她按,對(duì)于“chaincode”事件類型要求是牛隅,在目標(biāo)節(jié)點(diǎn)上執(zhí)行的chaincode中設(shè)置一個(gè)指定的事件名匹配范式;對(duì)于“Transaction”事件類型酌泰,要指定交易ID媒佣。)

+ eventCallback : Client Application class registering for the callback.(事件回調(diào):客戶端應(yīng)用程序類為回調(diào)而注冊(cè)的。)

Returns:

+ [event-listener-ref] a reference to the event listener, some language uses an ID (javascript), others uses object reference (Java)(返回值:事件監(jiān)聽(tīng)器的引用陵刹,指向事件監(jiān)聽(tīng)器的引用默伍,有些語(yǔ)言(javascript)使用ID,其他的語(yǔ)言(Java)使用對(duì)象引用衰琐。)
  • removeListener (移除監(jiān)聽(tīng)器)

注銷一個(gè)監(jiān)聽(tīng)器

Params:(SDK返回事件監(jiān)聽(tīng)器的引用)

+ [event-listener-ref] : reference returned by SDK for event listener

Returns:

+ statusFlag: Success / Failure
  • get_name (獲取名稱)

獲取節(jié)點(diǎn)名稱也糊。需要對(duì)象實(shí)例的參數(shù)。

Returns (str):

+ The name of the Peer (Peer 的名稱)
  • set_name (設(shè)置名稱)

Set the Peer name / id. (設(shè)置 Peer 的名稱/id)

Params:

+ Name (string): The unique name / id of this Peer.
  • get_roles(獲取角色)

獲取節(jié)點(diǎn)參與的用戶的角色羡宙±晏辏可能的結(jié)果是“client”和“auditor”的數(shù)組。成員服務(wù)多定義了兩個(gè)角色來(lái)保存節(jié)點(diǎn)成員關(guān)系:“peer”和“validator”狗热,這兩個(gè)沒(méi)有暴露給應(yīng)用程序捕捂。

Returns (str[]):

+ The roles for this user (這個(gè)用戶的角色)
  • set_roles(設(shè)置角色)

設(shè)置節(jié)點(diǎn)參與的用戶角色瑟枫。值遵從上面預(yù)定的幾個(gè)值。

Params:

+ Roles (string[]): The list of roles for the user(用戶角色列表)
  • get_enrollment_certificate(獲取背書(shū)證書(shū))

返回底層代表用戶身份的ECert指攒。

Params:

+ none

Returns:

+ Certificate in PEM format signed by the trusted CA
  • set_enrollment_certificate(設(shè)置背書(shū)證書(shū))

Set the Peer’s enrollment certificate. (設(shè)置 Peer 的背書(shū)證書(shū))

Params:

+ Certificate: Certificate in PEM format signed by the trusted CA (入?yún)⑹潜灰研湃蔚腃A按PEM格式簽名的證書(shū))

鍵值存儲(chǔ)(接口)

區(qū)塊鏈應(yīng)用程序需要保存狀態(tài)慷妙,包含用戶登記材料(私鑰,CA簽名的證書(shū))允悦。這些狀態(tài)需要被持久化膝擂。“KeyValueStore” 的接口為 SDK 自動(dòng)保存狀態(tài)提供了一個(gè)簡(jiǎn)單的機(jī)制隙弛,這對(duì)應(yīng)用程序是有益的架馋。 如果應(yīng)用使用基于軟件密鑰生成器即 CryptoSuite 的實(shí)現(xiàn),那么它需要鍵值存儲(chǔ)全闷。如果應(yīng)用程序還沒(méi)有設(shè)置一個(gè)存儲(chǔ)系統(tǒng)叉寂,SDK 應(yīng)該默認(rèn)使用一個(gè)內(nèi)建的實(shí)現(xiàn),比如一個(gè)基于本地文件系統(tǒng)的實(shí)現(xiàn)总珠。

SDK 也可以在這個(gè)鍵值存儲(chǔ)系統(tǒng)里面以可選緩存的方式保存用戶登記材料屏鳍。但是,如果應(yīng)用程序沒(méi)有配置一個(gè)鍵值存儲(chǔ)系統(tǒng)局服,SDK 會(huì)把應(yīng)用程序理解成選擇了總是為會(huì)話設(shè)置上下文钓瞭,并且沒(méi)有意圖使用默認(rèn)的鍵值存儲(chǔ)。

  • set_value(獲取值)

Retrieves a value given a key (獲取一個(gè)入?yún)⒌?key 的值)

Params

+ key (str): The name of the key

Returns

Result (Object):

+ The value
  • set_value(存入值)

Sets the value (存入值)

Params

+ Key

+ value

Returns

+ Acknowledgement of successful storage of the value (確認(rèn)了值的成功存儲(chǔ))

加密模塊(接口)

加密模塊打包了 數(shù)字簽名算法非對(duì)稱加密方法淫奔,消息對(duì)稱加密方法山涡,和 hash 以及 MAC。這是為區(qū)塊鏈加密服務(wù)提供者接口的一個(gè)鏡像設(shè)計(jì)唆迁,被 fabric 加密團(tuán)隊(duì)發(fā)表鸭丛。

默認(rèn)實(shí)現(xiàn)當(dāng)前 peer 和 COP 的計(jì)劃,并且還有 SDK 的默認(rèn)實(shí)現(xiàn):

  • ECDSA: curves “secp256r1” and “secp384r1”
  • AES: AES128, AES256 with CBC/CTR/GCM mode key length = 128 bits
  • SHA: SHA256, SHA384, SHA3_256, SHA3_384
  • generate_key(生成密鑰)

基于這些選項(xiàng)生成一個(gè) key。輸出可以非對(duì)稱加密算法的一個(gè)密鑰對(duì)唐责,或者對(duì)稱加密算法的一個(gè)密鑰

Params

+ opts (Object): an object that encapsulates two properties, “algorithm” and“ephemeral”.

Returns

+ Result (Key): The key object
  • deriveKey (導(dǎo)出密鑰)

Derives a key from k using opts.(從用上述選項(xiàng)中生成的 k 中獲取 一個(gè) key)

Params

+ k (Key)

+ opts (Object)

Returns

+ (Key) derived key (導(dǎo)出 密鑰)
  • importKey(導(dǎo)入密鑰)

Imports a key from its raw representation using opts.

Params

+ k (Key)

+ opts (Object)

Returns

+ (Key) An instance of the Key class wrapping the raw key bytes
  • getKey(獲取密鑰)

Returns the key this CSP associates to the Subject Key Identifier ski .

Params

+ ski (byte[])

Returns

+ (Key) An instance of the Key class corresponding to the ski
  • hash(hash處理)

Hashes messages msg using options opts .

Params

+ msg (byte[])

+ opts (Object) an object that encapsulates property “algorithm” with values for hashing algorithms such as “SHA2” or “SHA3”

Returns

+ (Key) An instance of the Key class corresponding to the ski
  • encrypt(加密)

Encrypt plain text.

Params

+ key (Key) public encryption key

+ plainText (byte[])

+ opts (Object)

Returns

+ (byte[]) Cipher text
  • decrypt(解密)

Decrypt cipher text.

Params

+ key (Key) private decryption key

+ cipherText (byte[])

+ opts (Object)

Returns

+ (byte[]) Plain text
  • sign(簽名)

Sign the data.

Params

+ Key (Key) private signing key

+ digest (byte[]) fixed-length digest of the target message to be signed

+ opts (function) hashing function to use

Returns

+ Result(Object):Signature object
  • verify(驗(yàn)證)

Verify the signature.

Params

+ key (Key) public verification key

+ signature (byte[]) signature

+ digest (byte[]) original digest that was signed

Returns

+ (bool): verification successful or not

處理網(wǎng)絡(luò)錯(cuò)誤

客戶端 SDK 和 fabric 用兩個(gè)方法溝通:無(wú)狀態(tài)的 HTTP 連接和 HTTP 長(zhǎng)連接系吩。

發(fā)送提案和發(fā)送交易調(diào)用在請(qǐng)求/響應(yīng)中是無(wú)狀態(tài)的。如果出現(xiàn)網(wǎng)絡(luò)錯(cuò)誤妒蔚,調(diào)用會(huì)超時(shí)。SDK 應(yīng)該有一個(gè)可配置的超時(shí)時(shí)間月弛,方便應(yīng)用程序基于對(duì)客戶端應(yīng)用和 fabric 節(jié)點(diǎn)之間的網(wǎng)絡(luò)特征的理解控制調(diào)用的動(dòng)作肴盏。

另外,這些方法可能有一個(gè)重試次數(shù)帽衙,以便于 SDK 根據(jù)超時(shí)錯(cuò)誤自動(dòng)試圖重連 HTTP 調(diào)用菜皂。這些重試都嘗試并且仍然發(fā)生超時(shí)錯(cuò)誤之后,連接方法應(yīng)該返回一個(gè)錯(cuò)誤厉萝。

另一方面恍飘,事件流連接 SDK 和事件源節(jié)點(diǎn)是長(zhǎng)連接榨崩。特別地,由于事件流接口被 fabric 定義章母,連接是雙向的母蛛,允許消息發(fā)送到兩方。對(duì)于網(wǎng)絡(luò)錯(cuò)誤乳怎,以防丟失事件和不能觸發(fā) client 應(yīng)用注冊(cè)的監(jiān)聽(tīng)器的結(jié)果彩郊,連接會(huì)被斷開(kāi)。

為應(yīng)用的利益考慮SDK應(yīng)該試圖重新發(fā)起連接蚪缀。但是秫逝,如果在嘗試了重連次數(shù)之后不能恢復(fù)連接,應(yīng)該用一個(gè)高級(jí)別的嚴(yán)重錯(cuò)誤通知應(yīng)用這種情況询枚。

參考

  1. Next-Consensus-Architecture_Proposal

  2. Consensus endorsing, consenting, and committing model

  3. Node.js SDK

  4. Fabric-Cop Design 這篇文檔已棄用

  5. Next Hyperledger-Fabric Architecture Protocol messages

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末违帆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子金蜀,更是在濱河造成了極大的恐慌刷后,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廉油,死亡現(xiàn)場(chǎng)離奇詭異惠险,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)抒线,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門班巩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嘶炭,你說(shuō)我怎么就攤上這事抱慌。” “怎么了眨猎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵抑进,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我睡陪,道長(zhǎng)寺渗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任兰迫,我火速辦了婚禮信殊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汁果。我一直安慰自己涡拘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布据德。 她就那樣靜靜地躺著鳄乏,像睡著了一般跷车。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橱野,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天朽缴,我揣著相機(jī)與錄音,去河邊找鬼仲吏。 笑死不铆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裹唆。 我是一名探鬼主播誓斥,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼许帐!你這毒婦竟也來(lái)了劳坑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤成畦,失蹤者是張志新(化名)和其女友劉穎距芬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體循帐,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡框仔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拄养。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片离斩。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瘪匿,靈堂內(nèi)的尸體忽然破棺而出跛梗,到底是詐尸還是另有隱情,我是刑警寧澤棋弥,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布核偿,位于F島的核電站,受9級(jí)特大地震影響顽染,放射性物質(zhì)發(fā)生泄漏漾岳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一粉寞、第九天 我趴在偏房一處隱蔽的房頂上張望尼荆。 院中可真熱鬧,春花似錦仁锯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)野芒。三九已至,卻和暖如春双炕,著一層夾襖步出監(jiān)牢的瞬間狞悲,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工妇斤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摇锋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓站超,卻偏偏與公主長(zhǎng)得像荸恕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子死相,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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