Hyperledger Fabric官方中文教程-改進筆記(十六)-策略(policy)

本Fabric中文文檔專欄的閱讀前言:前言


文章目錄

    • 什么是策略
    • 為什么需要策略
    • 策略如何實現
      • 訪問控制列表 (ACLs)
      • 智能合約背書政策
      • 修改策略
    • 如何在 Fabric 中編寫策略
      • Signature policies
      • ImplicitMeta policies
    • 例子: 通道配置策略
      • Organizations 部分
      • Application部分
    • Fabric 鏈碼生命周期
    • 鏈碼背書策略
    • 覆蓋策略定義
  • 訪問控制列表(ACL)
    • 什么是訪問控制列表?
      • 資源
      • 策略
        • Signature 策略
        • ImplicitMeta 策略
      • 訪問控制在哪里指定?
    • `configtx.yaml` 中 ACL 的格式
      • 在 `configtx.yaml` 中更新 ACL 默認值
  • 背書策略
    • 多種方式指定背書策略
    • 設置鏈碼級別背書策略
    • 背書策略語法
    • 設置集合級別背書策略
    • 設置鍵級別背書策略
    • 驗證


什么是策略

在最基礎的層面上,策略是一組規則,定義了決策是如何做出以及特定結果是如何達成的結構。為此,策略通常描述“誰”以及“做什么”,比如某人對某個資源擁有的訪問權限。我們生活中處處可見策略的使用,它們保護著我們珍視的資產,從租車、健康保險、到房屋等。

例如,保險策略定義了保險賠付的條件、條款、限額和有效期。該策略由保單持有者和保險公司共同同意,并定義了雙方的權利和責任。

而在 Hyperledger Fabric 中,策略是用于基礎設施管理的機制。Fabric 策略代表成員如何就接受或拒絕網絡、通道或智能合約的變更達成共識。策略在通道初次配置時由成員同意,但通道隨著發展還可以修改策略。

例如,策略可定義添加或移除通道成員的標準,改變區塊生成方式,或指定驗證智能合約所需的組織數量。這些行為由策略定義“誰”能夠執行。簡而言之,你想在 Fabric 網絡執行的任何操作都受策略控制。


為什么需要策略

策略是 Hyperledger Fabric 與 Ethereum 或 Bitcoin 等其他區塊鏈的不同之處。在那些系統中,任何節點都可以生成和驗證交易,且網絡治理策略在任何時刻都是固定且只能通過與代碼相同的過程修改。

而 Fabric 是一個許可區塊鏈,用戶由基礎設施識別,能在網絡啟動前決定網絡治理規則,也能在網絡運行時變更治理。

策略允許成員決定哪些組織可以訪問或更新 Fabric 網絡,并提供執行這些決策的機制。策略包含對特定資源(如用戶或系統鏈碼)的訪問組織列表,也指定了多少組織需要同意才能更新資源(如通道或智能合約)。

一旦策略編寫完成,它會評估附加在交易和提案上的簽名集合,驗證這些簽名是否符合網絡約定的治理標準。


策略如何實現

策略定義在與特定動作相關的管理域內。例如,將 peer 組織添加到通道的策略定義在 peer 組織的管理域中(即 Application 組)。同樣地,將排序節點添加到通道共識節點列表的策略則定義在 Orderer 組中。

跨 peer 和排序組織管理域的操作則包含在 Channel 組中。

通常,這些策略默認要求所在組的大多數管理員簽名(例如,大多數 peer 組織管理員;Channel 策略需大多數 peer 和排序組織管理員),但你可以定義任何規則。更多信息請查看 下文Signature 策略

訪問控制列表 (ACLs)

網絡管理員應當關注 Fabric 中 ACL(訪問控制列表)的用途,它允許通過關聯現有策略來配置對資源的訪問權限。這些“資源”可以是系統鏈碼的函數(例如 qscc 的 “GetBlockByNumber”),也可以是其他資源(例如誰可以接收區塊事件)。ACL 引用通道配置中定義的策略,并擴展它們以控制附加資源。

默認 ACL 集位于 configtx.yaml 文件的 Application: &ApplicationDefaults 部分中,但在生產環境中應覆蓋它們。configtx.yaml 中列出的資源是 Fabric 當前定義的所有內部資源的完整列表。

在該文件中,ACL 使用如下格式表達:

# 限制調用鏈碼的 ACL:
peer/Propose: /Channel/Application/Writers

其中 peer/Proposee 表示受保護的資源,/Channel/Application/Writers 是必須滿足的策略路徑。

這行配置表示:只有滿足 '/Channel/Application/Writers' 策略的身份才能調用鏈碼。在默認 ACL 下,只要滿足對應的隱式元策略即可訪問資源。

如下圖:/Channel/Application/Writers策略滿足 peer/Propose ACL。可以使用任何writers簽名策略的客戶應用程序從任何組織提交的交易來滿足此策略。

深入了解 ACL,請參考文末的訪問控制列表(ACL) 章節。

智能合約背書政策

每個鏈碼包中的智能合約都有一個背書策略,該策略指定了需要多少來自不同通道成員的 peers 執行并驗證該事務,以使其被認為有效。因此,背書策略定義了哪些組織(通過它們的 peers)必須對提案執行進行“背書”(即批準)。

修改策略

最后,還有一種關鍵策略類型:Modification policy(修改策略)。這類策略指定了修改配置更新所需的簽名身份組。它定義了策略本身如何更新。因此,每個通道配置元素都引用了一個管理其修改的策略。


如何在 Fabric 中編寫策略

如果你想變更 Fabric 中的任何內容,相關資源對應的策略會說明誰需要批準,是顯式簽署還是通過群體隱式同意。在保險領域中,顯式簽署可以是單個家庭財產保險代理;隱式簽署則類似于要求多數管理團隊成員同意。

這種方式特別有用,因為組成員可能隨時間變動而無需更新策略。在 Hyperledger Fabric 中,顯式簽署策略使用 Signature 語法表示,隱式簽署則使用 ImplicitMeta 語法表示。

Signature policies

Signature 策略定義必須簽署以使策略滿足條件的用戶類型,例如 OR('Org1.peer', 'Org2.peer')。它支持構造非常具體的規則,如:“組織 A 中的一名管理員和另外兩名管理員,或者六個組織管理員中的五名”。語法支持任意組合的 ANDORNOutOf

例如:

AND('Org1.member', 'Org2.member')

表示需要 Org1 和 Org2 各至少一名成員的簽名。

ImplicitMeta policies

ImplicitMeta 策略僅在基于配置樹的層級結構中有效,它聚合配置樹中更深層的策略結果,這些子策略最終由 Signature 策略定義。

它們稱為“Implicit”,因為它們是基于通道配置中組織動態構建的;稱為“Meta”,因為它們不是針對具體 MSP 身份,而是對配置樹下的子策略進行評估。

下圖展示了應用通道的策略層級結構,以及 ImplicitMeta 通道配置管理員策略(路徑 /Channel/Admins)在配置層級結構中是如何解析的(每個勾號表示該子策略的條件得到滿足)。

policies.policies

正如上圖所示,ImplicitMeta 策略,類型 = 3,使用如下語法:

<ANY|ALL|MAJORITY> <SubPolicyName>

例如:

MAJORITY Admins

圖中顯示 Admins 子策略,指的是配置樹下面的所有 Admins 策略。你可以創建自己的子策略,隨意命名,然后在各組織中定義。

我們也可以換一個形式來多維的了解策略層級關系,如下圖所示:

這張圖顯示:Channel/Application/Admins 隱式元策略可由大多數組織的 Admin 簽名策略滿足。

如果對通道提交更新的請求包含 Org1、Org2 和 Org3 的簽名,則滿足對應的策略;但如果 Org3 是第一個超過多數之后多余的簽名,其提示可能以淺綠色顯示,表示冗余。如下圖所示:

同樣,Channel/Application/Endorsement 策略可由大多數組織的 Endorsement 簽名策略滿足,這是 Fabric 鏈碼生命周期的默認背書策略。除非你明確指定其他策略,否則調用鏈碼需要大多數通道組織背書才能被加入區塊。如下圖

正如前文所述,ImplicitMeta 策略(例如 MAJORITY Admins)的一個關鍵優勢是,當你向通道添加新的管理員組織時,無需更新通道策略。因此,ImplicitMeta 策略被認為更靈活。當它最終解析為配置樹下的 Signature 子策略時,將有效控制。

你也可以定義跨組織的應用級隱式策略,例如在通道中,要求滿足 ANY、ALL 或 MAJORITY 中的任意一種。這種格式更自然,且為不同組織提供了靈活的默認值,使它們能夠確定何為有效背書。

如果包含 NodeOUs 更高的粒度控制,可以將身份類別與數字證書中的組織單位關聯。Fabric 的 NodeOUs 可以在 Fabric CA 客戶端配置文件中啟用,并與生成的身份關聯。例如,某組織啟用了特定 NodeOUs 后,可以要求“peer”簽署才能算背書有效,而未啟用的組織則可能只要求任意成員簽署。

還有一個用于驗證區塊有效性的策略:/Channel/Orderer/BlockValidation。peer 節點在接收新塊時使用此策略來確認其由通道排序節點簽發、未被篡改。默認情況下,擁有 Writers 簽名策略的排序組織可以生成和驗證區塊。


例子: 通道配置策略

理解策略從查看 configtx.yaml 中定義的通道策略開始。我們可以使用 Fabric 測試網絡中的 configtx.yaml 示例,查看兩種策略語法的示例。

我們將檢查 fabric-samples/test-network 示例中使用的文件。

Organizations 部分

文件第一部分定義了將成為通道成員的各組織。在每個組織定義內部,存在默認策略 ReadersWritersAdminsEndorsement,當然你也可以自定義名稱。每個策略都有一個 Type,表示策略類型 (SignatureImplicitMeta) 和一個 Rule

下面的測試網絡示例展示了通道中 Org1 組織的定義。其中 TypeSignatureEndorsement 策略規則定義為:

"OR('Org1MSP.peer')"

表示 Org1MSP 的一個 peer 必須簽署。正是這些 Signature 策略成為 ImplicitMeta 策略指向的子策略。

- &Org1# DefaultOrg defines the organization which is used in the sampleconfig# of the fabric.git development environmentName: Org1MSP# ID to load the MSP definition asID: Org1MSPMSPDir: ../organizations/peerOrganizations/org1.example.com/msp# Policies defines the set of policies at this level of the config tree# For organization policies, their canonical path is usually#   /Channel/<Application|Orderer>/<OrgName>/<PolicyName>Policies:Readers:Type: SignatureRule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"Writers:Type: SignatureRule: "OR('Org1MSP.admin', 'Org1MSP.client')"Admins:Type: SignatureRule: "OR('Org1MSP.admin')"Endorsement:Type: SignatureRule: "OR('Org1MSP.peer')"

Application部分

接下來展示的是 ImplicitMeta 策略類型在 configtx.yamlApplication 區段中的用法。這一系列策略位于 /Channel/Application/ 路徑下。如果你使用默認的 Fabric ACL,這些策略定義了應用通道許多重要功能的行為,例如誰可以查詢通道賬本、調用鏈碼、或更新通道配置。這些策略指向為每個組織定義的子策略。

前文 Org1 中定義的 ReaderWriterAdmin 子策略,會被 Application 區域中的 ReaderWriterAdmin ImplicitMeta 策略所評估。因為測試網絡使用默認策略,你可以使用上述 Org1 示例來查詢通道賬本、調用鏈碼以及批準所創建測試網絡通道的更新。

################################################################################
#
#   SECTION: Application
#
#   - This section defines the values to encode into a config transaction or
#   genesis block for application related parameters
#
################################################################################
Application: &ApplicationDefaults# Organizations is the list of orgs which are defined as participants on# the application side of the networkOrganizations:# Policies defines the set of policies at this level of the config tree# For Application policies, their canonical path is#   /Channel/Application/<PolicyName>Policies:Readers:Type: ImplicitMetaRule: "ANY Readers"Writers:Type: ImplicitMetaRule: "ANY Writers"Admins:Type: ImplicitMetaRule: "MAJORITY Admins"LifecycleEndorsement:Type: ImplicitMetaRule: "MAJORITY Endorsement"Endorsement:Type: ImplicitMetaRule: "MAJORITY Endorsement"

:完整的文件詳解請看本專欄 《configtx通道配置文件》 一文。


Fabric 鏈碼生命周期

Fabric 鏈碼生命周期在鏈碼由組織成員批準并提交到通道過程中使用策略。

configtx.yaml 文件的 Application 區段包含默認鏈碼生命周期背書策略。在生產環境中,通常會根據具體應用場景自定義該策略。

################################################################################
#
#   SECTION: Application
#
#   - This section defines the values to encode into a config transaction or
#   genesis block for application related parameters
#
################################################################################
Application: &ApplicationDefaults# Organizations is the list of orgs which are defined as participants on# the application side of the networkOrganizations:# Policies defines the set of policies at this level of the config tree# For Application policies, their canonical path is#   /Channel/Application/<PolicyName>Policies:Readers:Type: ImplicitMetaRule: "ANY Readers"Writers:Type: ImplicitMetaRule: "ANY Writers"Admins:Type: ImplicitMetaRule: "MAJORITY Admins"LifecycleEndorsement:Type: ImplicitMetaRule: "MAJORITY Endorsement"Endorsement:Type: ImplicitMetaRule: "MAJORITY Endorsement"
  • LifecycleEndorsement 策略控制誰需要批準鏈碼定義。

  • Endorsement 策略是鏈碼的默認背書策略。


鏈碼背書策略

當鏈碼通過 Fabric 鏈碼生命周期審批并提交到通道時,需要指定背書策略(一個策略適用于與該鏈碼相關的所有狀態)。背書策略可通過引用通道配置中定義的策略,或顯式使用 Signature 策略指定。

如果在審批階段未顯式指定背書策略,則使用通道的 Endorsement 策略,默認值為 "MAJORITY Endorsement",意味著通道中大多數組織的 peer 必須執行一次交易,才能使其被視為有效。該默認策略允許加入通道的新組織自動成為鏈碼背書策略的一部分。

如需使用非默認背書策略,可使用 Signature 策略格式指定更復雜的條件(例如要求一個組織背書,再加上通道中另一個組織的背書)。

Signature 策略還支持使用 principals,它可以將身份映射為角色。principals 類似于用戶 ID 或組 ID,但更通用,因為它們可以包含身份的諸多屬性,如組織、組織單位、角色,甚至特定身份。身份角色定義為 'MSP.ROLE',其中 MSP 是 MSP ID(組織),ROLE 是四種可接受角色之一:Member、Admin、Client、Peer。這些角色在用戶通過 CA 注冊時被關聯。你也可以自定義 Fabric CA 上可用的角色。

一些有效的 principals 示例:

  • 'Org0.Admin':Org0 MSP 的管理員

  • 'Org1.Member':Org1 MSP 的成員

  • 'Org1.Client':Org1 MSP 的客戶端

  • 'Org1.Peer':Org1 MSP 的 Peer

  • 'OrdererOrg.Orderer':排序組織 MSP 的排序節點

在某些情況下,特定狀態(例如某個鍵值對)可能需要不同的背書策略。這種基于狀態的背書允許你覆蓋默認的鏈碼級別背書策略,為指定鍵設置不同策略。

如需深入了解如何編寫背書策略,請參考文末的 背書策略 一章節。


覆蓋策略定義

Hyperledger Fabric 包含一些默認策略,適用于入門、開發和測試,但在生產環境中應進行自定義。在 configtx.yaml 文件中,你應該了解這些默認策略。通道配置策略可以擴展,除了 configtx.yaml 中默認的 Readers, Writers, Admins,你可以定義任意策略。

如需了解如何更新通道配置,請參考本專欄 《向通道中添加組織》 一文,絕大多數通道配置的修改更新步驟和文中添加組織的例子一致,區別僅在于配置文件的修改。

訪問控制列表(ACL)

什么是訪問控制列表?

注意:本主題涉及通道管理級別的訪問控制和策略。

Fabric 使用訪問控制列表(ACL)通過將一個 策略(Policy) 與一個資源關聯來管理對資源的訪問。Fabric 內置了多個默認 ACL。本篇文檔將討論它們的格式,以及如何覆蓋這些默認設置。

但在開始之前,我們先需要理解一下資源與策略的概念。

資源

用戶通過調用用戶鏈碼(user chaincode)、事件流源(events stream source),或某些系統鏈碼(system chaincode)與 Fabric 進行交互。因此,這些接口都被視為應受訪問控制保護的“資源”

應用開發者需要了解這些資源以及它們對應的默認策略。configtx.yaml 文件中包含了這些資源的完整列表。你可以在本專欄 《configtx通道配置文件》 一文獲得詳解。 這里查看 configtx.yaml 示例文件。

configtx.yaml 中資源的命名形式幾乎囊括了 Fabric 當前定義的所有內部資源。命名約定類似 <component>/<resource>,例如 cscc/GetConfigBlock 指的是 CSCC 組件中的 GetConfigBlock 調用。

策略

策略是 Fabric 的核心機制,它允許檢查請求附帶的身份(或身份集合)是否滿足資源所需的策略。背書策略(endorsement policies)用于判斷交易是否被正確背書。通道配置中定義的策略既用于配置變更,也用于訪問控制,所有策略都存儲在通道配置內。

策略通常分為兩種格式:Signature 策略 或 ImplicitMeta 策略。

Signature 策略

此類策略定義必須由哪些具體用戶簽名才能滿足策略。例如:

Policies:MyPolicy:Type: SignatureRule: "OR('Org1.peer', 'Org2.peer')"

該策略表示,名為 MyPolicy 的策略只有在“Org1 的 peer”或“Org2 的 peer”簽名時才滿足。Signature 策略支持結合 AND、OR 以及 NOutOf 語法,靈活構建復雜規則,例如:“組織 A 的一名管理員和兩名其他管理員,或 20 名組織管理員中的 11 人”。

ImplicitMeta 策略

ImplicitMeta 策略會聚合配置樹中更深層定義的 Signature 策略結果。它允許使用類似“大多數組織管理員”這樣的默認規則,語法形式更簡單,例如:

<ALL|ANY|MAJORITY> <SubPolicyName>

例子:

Policies:AnotherPolicy:Type: ImplicitMetaRule: "MAJORITY Admins"

該策略表示,只需配置樹中大多數 Admins 策略滿足即可。默認策略中一般將 Admins 用于敏感或操作性的網絡行為(例如在通道上實例化鏈碼);Writers 通常用于提出賬本更新;Readers 只能訪問信息但無更新或操作權限。如果開啟了 NodeOU 支持,還可加入新的 peerclient 角色。

訪問控制在哪里指定?

訪問控制默認值位于 configtx.yaml 文件中,這是 configtxgen 用來構建通道配置的模板文件。

你可以通過兩種方式更新訪問控制:一是直接編輯 configtx.yaml(用于創建新通道);二是更新已有通道配置中的 ACL。

configtx.yaml 中 ACL 的格式

ACL 的格式由資源名稱映射到策略路徑構成,示例如下:

# 調用 peer 上鏈碼的 ACL 策略
peer/Propose: /Channel/Application/Writers# 接收區塊事件的 ACL 策略
event/Block: /Channel/Application/Readers

上述 ACL 表示:只有滿足 /Channel/Application/Writers 策略的身份才能訪問 peer/Propose;滿足 /Channel/Application/Readers 策略的身份才能訪問 event/Block

configtx.yaml 中更新 ACL 默認值

如果你希望在引導網絡時覆蓋默認 ACL,或者在通道創建前修改 ACL,最佳實踐是直接編輯 configtx.yaml

例如,將 peer/Propose ACL 默認值從 /Channel/Application/Writers 修改為某個策略 MyPolicy

  1. Application.Policies 中定義一個名為 MyPolicy 的簽名策略,例如:
Policies: &ApplicationDefaultPoliciesReaders:Type: ImplicitMetaRule: "ANY Readers"Writers:Type: ImplicitMetaRule: "ANY Writers"Admins:Type: ImplicitMetaRule: "MAJORITY Admins"MyPolicy:Type: SignatureRule: "OR('SampleOrg.admin')"
  1. Application: ACLs 部分,將 peer/Propose 引用的策略從舊值修改為 MyPolicy

背書策略

每個鏈碼都有一個背書策略,用于指定在通道上哪些 peer 必須執行鏈碼并背書執行結果,才能使交易被視為有效。背書策略定義了哪些組織(通過它們的 peer)必須“背書”(即批準)提案的執行。

注意
請記住,狀態(以鍵值對形式表示)與區塊鏈數據是分離的。

作為 peer 驗證交易的一部分,每個驗證 peer 會檢查交易是否包含了符合背書策略要求的背書次數,并且背書來自預期的源(這兩個條件都由背書策略指定)。還會驗證背書是否有效(即是否來自有效證書的有效簽名)。


多種方式指定背書策略

默認情況下,背書策略在鏈碼定義中指定,由通道成員達成一致后提交到通道(即一個背書策略覆蓋一個鏈碼相關的所有狀態)。

對于私有數據集合,還可以在集合級別指定背書策略,該策略會覆蓋鏈碼級別的背書策略,針對私有數據集合中的鍵施加更嚴格的寫入控制。

此外,還可以針對特定公共通道狀態或私有數據集合狀態(即特定鍵值對)設置不同的背書策略。這種“基于狀態的背書”允許使用不同于鏈碼級別或集合級別的策略。例如,一個代表資產的鍵可能需要持有執照的評估員的背書,或者資產所有人(若屬于通道成員)希望他們的 peer 簽署。此類策略適用于那些需要與默認背書策略不同的資產。


設置鏈碼級別背書策略

鏈碼級別的背書策略在通道成員批準鏈碼定義時達成一致。在鏈碼定義提交到通道前,需要滿足 Channel/Application/LifecycleEndorsement 策略(默認是大多數應用組織的簽名)。

鏈碼一旦被提交,任何寫入數據到賬本的調用都必須經過足夠的通道成員簽名以滿足背書策略。

可以通過 CLI 在審批和提交鏈碼定義時使用 --signature-policy 標志指定背書策略。例如:

peer lifecycle chaincode approveformyorg --channelID mychannel \--signature-policy "AND('Org1MSP.member', 'Org2MSP.member')" \--name mycc --version 1.0 --package-id <package-id> --sequence 1 \--tls --cafile <tls-cert> --waitForEvent

上述命令審批了 mycc 鏈碼定義,背書策略為 AND('Org1MSP.member', 'Org2MSP.member'),要求 Org1 和 Org2 的成員都簽名。審批數達到要求后,通過以下命令提交:

peer lifecycle chaincode commit --channelID mychannel \--signature-policy "AND('Org1MSP.member', 'Org2MSP.member')" \--name mycc --version 1.0 --sequence 1 --init-required \--tls --cafile <tls-cert> --peerAddresses <peers> ...

值得注意的是,如果啟用了 MSP 的角色識別(如 peer),你可以只限制 peer 簽名:

peer lifecycle chaincode approveformyorg ... \--signature-policy "AND('Org1MSP.peer', 'Org2MSP.peer')" ...

此外,也可以使用通道配置中的策略路徑:使用 --channel-config-policy 標志選擇通道配置中的策略,如:

peer lifecycle chaincode approveformyorg ... \--channel-config-policy Channel/Application/Admins ...

如果未指定策略,默認使用 Channel/Application/Endorsement 策略,該策略要求大多數通道成員背書。該策略會隨著組織成員的增減自動更新。若使用 --signature-policy,則在組織變動時需手動更新策略,否則新加入的組織將無法背書。


背書策略語法

如上所述,策略以“主體(principals)”表達,形式為 'MSP.ROLE',其中 MSP 是 MSP ID,ROLE 是以下四種之一:memberadminclientpeer

有效主體示例:

  • 'Org0MSP.admin':Org0 內任何管理員

  • 'Org1MSP.member':Org1 內任何成員

  • 'Org1MSP.peer':Org1 的任何 peer

語法格式為:

EXPR(E[, E...])

EXPRANDOROutOfE 可以是主體或嵌套的表達式。例如:

  • AND('Org1MSP.member', 'Org2MSP.member'):要求這兩名成員的簽名

  • OR('Org1MSP.member', 'Org2MSP.member'):任意一名成員簽名即可

  • OR('Org1MSP.member', AND('Org2MSP.member', 'Org3MSP.member')):Org1 成員簽名或同時有 Org2 和 Org3 成員簽名

  • OutOf(1, 'Org1MSP.member', 'Org2MSP.member') 等同于 OR(...)

  • OutOf(2, ...) 等同于 AND(...),也可組合構造復雜邏輯


設置集合級別背書策略

在審批和提交鏈碼定義時,還可以為私有數據集合指定集合級別背書策略。若設置了此策略,則寫入該私有數據集合的事務必須滿足集合級別的背書要求。

集合級別策略可以更寬松或更嚴格,例如鏈碼層可能要求大多數組織背書,但私有集合可能要求特定組織背書。

如果未指定集合級別策略,則默認使用鏈碼級別背書策略。這在某些場景下很有用,比如授權組織能寫入他人私有集合;而在其他情況下,應強制集合級別控制,則應明確設置策略。

集合級別策略語法與鏈碼級別完全一致:在集合配置文件中使用 endorsementPolicy,可通過 signaturePolicychannelConfigPolicy 設定。


設置鍵級別背書策略

鏈碼級別或集合級別背書策略與鏈碼生命周期綁定,只能在定義鏈碼時設置。而鍵級別背書策略可在鏈碼內部更靈活地設置和修改,作為交易讀寫集的一部分。

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)

Go shim 還提供 KeyEndorsementPolicy 接口方便構建策略:

type KeyEndorsementPolicy interface {Policy() ([]byte, error)AddOrgs(roleType RoleType, organizations ...string) errorDelOrgs(organizations ...string) errorListOrgs() ([]string)
}

例如,為某鍵設置兩個組織背書:調用 AddOrgs() 后用 Policy() 獲取字節表示,并傳入 SetStateValidationParameter()


驗證

提交時,設置鍵值與設置背書策略在處理方式上無區別,都是狀態更新并按相同規則驗證。

  • 若鍵沒有鍵級策略,則默認使用鏈碼級別或集合級別策略;

  • 若首次為鍵設置鍵級策略,需滿足原先的鏈碼/集合級策略;

  • 若存在鍵級策略,則其優先級高于鏈碼/集合級策略,它可以更寬松或嚴格;

  • 若刪除鍵級策略(設為 nil),則回退到默認策略。

若交易修改了多個鍵且它們有不同鍵級策略,則所有相關策略都需滿足方可成立。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94496.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flutter性能優化完全指南:構建流暢應用的實用策略

Flutter性能優化完全指南&#xff1a;構建流暢應用的實用策略 探索從UI構建到內存管理的全方位優化技巧&#xff0c;打造如絲般順滑的Flutter體驗 引言 在跨平臺開發領域&#xff0c;Flutter以其出色的性能表現脫穎而出。然而&#xff0c;正如任何強大的框架一樣&#xff0c;不…

jvm對象內存占用

歡迎訪問我的主頁: https://heeheeaii.github.io/ 在Java虛擬機&#xff08;JVM&#xff09;中&#xff0c;一個對象在內存中的存儲布局可以分為三個部分&#xff1a;對象頭&#xff08;Object Header&#xff09;、實例數據&#xff08;Instance Data&#xff09;和對齊填充…

嵌入式系統中mcu寄存器分類劃分

目錄一、 按行為特性分類二、 按功能角色分類&#xff08;更宏觀的角度&#xff09;總結與注意事項在32位單片機&#xff08;尤其是基于ARM Cortex-M系列內核的&#xff09;中&#xff0c;寄存器的種類可以按照其“行為模式”和“功能”來進行分類。以下是32位單片機&#xff0…

Redis如何高效安全的遍歷所有key?

大家好&#xff0c;我是鋒哥。今天分享關于【Redis如何高效安全的遍歷所有key?】面試題。希望對大家有幫助&#xff1b; Redis如何高效安全的遍歷所有key? 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; 在 Redis 中&#xff0c;遍歷所有的 key 是一個相對昂貴的…

網易云音樂歌曲導出緩存為原始音樂文件。低調,低調。。。

最近買了個榭蘭圖耳機頭&#xff0c;拿到手第一件事當然是煲機了。弄個舊手機做24小時煲機但是不想再裝多一個網易云音樂&#xff0c;省得一號多登錄會問題。對于軟工男最先想到的肯定是在本地直接播放音樂了&#xff0c;正好自己 有淘寶88VIP聯合會員&#xff0c;于是琢磨著怎…

從Android到鴻蒙:一場本應無縫的轉型-優雅草卓伊凡

從Android到鴻蒙&#xff1a;一場本應無縫的轉型-優雅草卓伊凡看到Android開發者詢問如何轉向鴻蒙&#xff0c;卓伊凡不禁搖頭&#xff1a;真正的Android工程師根本不需要“學習”鴻蒙&#xff0c;只需要簡單查閱文檔即可。近年來&#xff0c;隨著鴻蒙系統的不斷發展&#xff0…

HTML————更實用于后端寶寶們學習的前端

博主主攻后端&#xff0c;但是畢竟要做網站&#xff0c;我們來學習一點前端的知識&#xff0c;一共有三節&#xff0c;學完就能做一點小小的頁面啦&#xff1b;1.1 HTML基礎什么是HTML呢&#xff0c;他是超文本標記語言&#xff0c;還記得HTTP是啥不&#xff0c;HTTP是超文本傳…

Vue.js 核心機制深度學習筆記

Vue核心機制深度學習筆記 概述 本文檔整理自一次深入的 Vue.js 技術討論&#xff0c;涵蓋了響應式系統原理、虛擬 DOM 工作機制、更新策略等核心概念。通過問答形式&#xff0c;旨在幫助開發者徹底理解 Vue.js 的內部運行機制。 目錄 SPA 應用與虛擬 DOM虛擬 DOM 生成與 Di…

通義千問VL-Plus:當AI“看懂”屏幕,軟件測試的OCR時代正式終結!

—— 一位測試老兵的實戰手記&#xff1a;如何用多模態大模型讓Bug無處遁形 深夜11點&#xff0c;某電商App緊急上線前 測試工程師小王盯著第37次失敗的自動化腳本崩潰截圖&#xff1a; “Network Error: Conn3ct1on t1m30ut” 傳統OCR把“timeout”識別成“t1m30ut”&#xff…

Notepad++換行符替換

使用 Postman 測試接口時&#xff0c;有時候會遇到需要發送一篇文章&#xff0c;但是我們需要收到將文章的換行符換成 \n&#xff0c;我們可以通過 Notepad 實現快速替換。 首先&#xff0c;將文章粘貼到 Notepad 中&#xff0c;使用 Ctrl H 快捷鍵打開替換窗口。 查找目標&a…

前饋神經網絡總結

前饋神經網絡由三個主要部分組成&#xff1a;輸入層&#xff1a; 負責接收原始數據&#xff0c;通常對應于特征的維度。隱藏層&#xff1a; 包含一個或多個層&#xff0c;每層由多個神經元組成&#xff0c;用于提取輸入數據的抽象特征。輸出層&#xff1a; 產生網絡的最終預測或…

AI 自動化編程 trae1 體驗 頁面添加富編輯器

體驗總結 目前solo功能未使用過&#xff0c; trae 能夠準確率很高地處理簡單問題&#xff0c;如代碼格式化等。 對于復雜的問題&#xff0c;如涉及代碼組件版本和bug等問題&#xff0c;準確率主要依賴整個互聯網資源庫的分析&#xff0c; 目前準備率一般有時候還不如自己添加…

Java基礎(十四)分布式

一、CAP 理論 CAP 原則&#xff0c;又稱 CAP 定理&#xff0c;指出在分布式系統中&#xff0c;Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;和 Partition tolerance&#xff08;分區容錯性&#xff09;這三個特性無法同時滿足&…

接口自動化測試(一)

接口測試1.接口的概念程序內部的接口:程序內部接口指同一程序或系統內不同模塊、組件或類之間的交互點&#xff0c;用于數據傳遞、功能調用或資源共享系統對外的接口:是不同系統、模塊或服務之間進行交互的邊界定義&#xff0c;通常通過預定義的協議、數據格式和通信方式實現。…

單片機外設(七)RTC時間獲取

文章目錄一.RTC介紹二.IMX6ull RTC介紹1.SNVS_HP (high power domain)2.SNVS_LP (low power domain)3.SNVS interrupts and alarms三. SNVS重點寄存器介紹1.SNVS_HP Command(HPCOMR)2.SNVS_HP/SNVS_LP Control register (SNVS_HPCR/SNVS_LPCR)3.SNVS_HP/SNVS_LP 狀態寄存器&…

第1篇:走進日志框架的世界 - 從HelloWorld到企業級應用

前言 在現代企業級應用開發中&#xff0c;日志系統扮演著至關重要的角色。無論是問題排查、性能監控&#xff0c;還是業務分析&#xff0c;都離不開完善的日志記錄。今天&#xff0c;我們將從零開始&#xff0c;手把手教你構建一個現代化的注解驅動日志框架。 為什么需要自定義…

173-基于Flask的微博輿情數據分析系統

基于Flask的微博輿情數據分析系統 - 技術實現與架構設計 本文詳細介紹了一個基于Flask框架開發的微博輿情數據分析系統&#xff0c;包含數據爬取、情感分析、可視化展示等完整功能模塊。 &#x1f4cb; 目錄 項目概述技術棧系統架構目錄結構核心功能模塊代碼實現數據可視化部署…

美股期權歷史市場數據波動特性分析

標題&#xff1a;基于本地CSV數據的美股期權分析與應用實踐 在金融量化研究領域&#xff0c;本地CSV數據的高效應用是開展美股期權研究的重要基礎。本文將圍繞美股期權日級別行情數據、波動率分析及策略構建的核心流程&#xff0c;詳細介紹從數據預處理到實際場景落地的關鍵方…

VUE從入門到精通二:ref、reactive、computed計算屬性、watch監聽、組件之間的通信

目錄 一、ref、reactive創建響應式對象 1、ref() 2、reactive() 3、ref和reactive的區別 二、computed計算屬性 1、什么是計算屬性computed 2、計算屬性computed和函數方法的區別 3、計算屬性computed的優勢 三、watch監聽函數 1、什么是watch&#xff1f; 2、基本語…

構建AI智能體:十二、給詞語繪制地圖:Embedding如何構建機器的認知空間

我們理解“蘋果”這個詞&#xff0c;能聯想到一種水果、一個公司、或者牛頓的故事。但對計算機而言&#xff0c;“蘋果”最初只是一個冰冷的符號或一串二進制代碼。傳統的“One-Hot”編碼方式&#xff08;如“蘋果”是[1,0,0,...]&#xff0c;“香蕉”是是[0,1,0,...]&#xff…