本頁面說明多方運算 (MPC) 政策引擎如何評估以 Cedar 政策語言編寫的交易政策、處理跨鏈情境,以及解析選用或省略的中繼資料欄位。
核心評估原則
政策引擎會使用 Cedar 政策語言,授權加密簽署作業。引擎會使用三個基本公理,以確定性方式評估政策:
- 預設拒絕:所有作業都會隱含拒絕。作業必須至少與一項有效的
permit政策相符,才能執行。如果找不到相符的permit政策,最終決策會是DENY。 - 明確禁止:
forbid政策會絕對覆寫其他政策。如果作業符合任何有效的forbid政策,系統會立即將決策解析為DENY,無論是否有任何相符的permit政策允許該作業。 - Missing Fields Just Mean "No Match" (Skip):如果規則尋找的欄位不存在於交易酬載中 (例如省略的選項欄位),Cedar 不會當機,系統會將該規則視為「不相符」(評估結果為 false),並繼續評估下一項規則。
邏輯評估矩陣
下表說明政策引擎如何評估規則組合。
所有情境皆假設:
- 交易呼叫端 (在 Cedar 政策中以主體表示) 是 Alice (
User::"alice")。在多方運算中,主體代表要求授權加密簽署作業的角色或身分 (例如人類簽署者、自動化服務用戶端或後端系統帳戶)。 - 這筆交易會轉移剛好 1 ETH (在
context.transaction.spend_amount_scaled中以 1,000,000,000 個縮放奈米幣單位表示)。
| 情境 | 有效政策 | 結果 | 原因 |
|---|---|---|---|
| 情境 1:空白狀態 | 沒有任何執行中的政策。 | DENY |
根據預設,除非相符的 permit 政策明確允許,否則所有作業都會遭到封鎖。 |
| 情境 2:單一許可證相符 |
permit( principal == User::"alice", action, resource ) when { context.transaction.spend_amount_scaled < 10000000000 }; 最多可存入 10 ETH |
PERMIT |
交易參數符合政策條件。由於沒有衝突的 forbid 政策,因此要求獲准。 |
| 情境 3:單一許可證不符 |
permit( principal == User::"alice", action, resource ) when { context.transaction.spend_amount_scaled < 500000000 }; 最多可存入 0.5 ETH |
DENY |
轉帳金額 (1 ETH) 超出政策限制。由於不符合任何相符的 permit 規則,預設拒絕規則會封鎖交易。 |
| 情境 4:多項允許政策 |
政策 A: permit( principal == User::"alice", action, resource ) when { context.transaction.spend_amount_scaled < 500000000 }; 最多可存入 0.5 ETH 政策 B: permit( principal == User::"alice", action, resource ) when { context.transaction.spend_amount_scaled < 5000000000 }; 最多 5 ETH |
PERMIT |
雖然政策 A 不符合,但政策 B 符合。只要有一項相符的 permit 政策,即可允許交易。 |
| 情境 5:允許和禁止衝突 |
政策 A (允許): permit( principal == User::"alice", action, resource ) when { context.transaction.spend_amount_scaled < 5000000000 }; 最多 5 ETH 政策 B (禁止): forbid( principal == User::"alice", action, resource ) when { context.transaction.recipient == "0xBlockedAddress" }; 假設目的地為 |
DENY |
轉移作業會傳送至 0xBlockedAddress。雖然政策 A 允許交易金額,但目的地符合政策 B 的條件。明確的 forbid 規則會覆寫政策 A,並封鎖交易。 |
| 情境 6:不相符的禁止政策 |
與前一個情境相同的政策 |
PERMIT |
轉移作業會傳送至安全地址 (例如 0xSafeAddress)。政策 A 成功比對,政策 B 則因目的地不是 0xBlockedAddress 而未比對。如果沒有相符的禁止規則,系統會套用允許規則。 |
多鏈和選填欄位情境
雖然上述矩陣展示了允許和禁止規則的核心邏輯優先順序,但以下情境說明瞭政策引擎如何在多鏈環境中評估規則:特別是在針對選填欄位或不同區塊鏈網路結構定義執行時。
注意: 零值資料正規化 為避免發生非預期的評估錯誤,並確保政策可預測性,政策引擎的剖析層會將評估環境中未填入值的字串和位元組欄位,正規化為特定類型的零值 (例如空字串
""或空位元組陣列),而非省略這些欄位。這樣一來,您就能針對未填入資料的欄位,制定明確的政策,而不必擔心 Cedar 評估錯誤。不過,如果存取的欄位在區塊鏈結構定義中完全未定義 (例如比特幣交易中僅限 EVM 的
gas_limit,或 EVM 交易中僅限比特幣的outputs),會導致該特定政策發生 Cedar 評估錯誤,評估結果為false(不相符),並安全地失敗關閉。
情境 7:跨鏈政策評估和未對應的結構定義屬性
背景資訊:呼叫端提交比特幣交易。不過,使用中的政策組合包含一項以太坊專屬政策:
permit( principal == User::"alice", action, resource ) when { context.transaction.schema == "ethereum.transaction.v2" && context.transaction.gas_limit < 100000 };結果:
DENY原因:通用意圖屬性 (例如
spend_amount_scaled、recipient和max_fee_atomic) 在以太坊和比特幣交易中,評估方式都一致。如果政策參照的鏈結專屬屬性不存在於提交交易的結構定義中 (例如比特幣交易的gas_limit),Cedar 會將不相符的屬性視為評估失敗,並將該特定政策解析為false(不相符),但不會停止引擎。由於沒有其他有效的permit政策與比特幣交易相符,因此系統預設會拒絕這項作業。
情境 8:permit 政策缺少選填欄位
背景:呼叫端提交標準 ETH 轉帳 (不使用智慧型合約)。有效政策組合包含檢查合約互動的規則:
permit( principal == User::"alice", action, resource ) when { context.transaction.asset_contract_address == "0x1111111111111111111111111111111111111111" };結果:
DENY原因:標準 ETH 轉帳不會填入選用的
asset_contract_address。剖析器會將其正規化為評估情境中的零值空字串""。評估比較"" == "0x1111..."會傳回false(不相符),而不是引發錯誤。由於沒有其他政策允許轉移,因此系統預設會拒絕這項作業。
情境 9:forbid 政策缺少選填欄位
背景:呼叫端提交 10 ETH 的標準 ETH 轉帳。政策組合包含:
政策 A (允許):
permit( principal == User::"alice", action, resource ) when { context.transaction.spend_amount_scaled <= 100000000000 };政策 B (禁止):
forbid( principal == User::"alice", action, resource ) when { context.transaction.asset_contract_address == "0xBannedContract" };
結果:
PERMIT原因:10 ETH 低於上限,因此政策 A 成功比對。政策 B 會檢查合約地址是否與禁止地址相符。由於零值正規化,未填入的合約地址會解析為
""。評估比較"" == "0xBannedContract"會傳回false。由於禁止政策不相符,而允許政策相符,因此交易獲准。
情境 10:明確檢查空白或缺少的欄位
背景資訊:呼叫端提交標準 ETH 轉帳 (未傳送至智慧型合約)。政策組合包含:
政策 A (允許):
permit( principal == User::"alice", action, resource ) when { context.transaction.spend_amount_scaled <= 1000000000000 };政策 B (禁止):
forbid( principal == User::"alice", action, resource ) when { context.transaction.asset_contract_address == "" };
結果:
DENY原因:由於剖析器正規化,缺少的
asset_contract_address在評估情境中會顯示為空字串""。評估政策 B 後,條件會解析為true("" == "")。forbid政策相符,因此交易遭拒。
預先評估驗證 (快速失敗閘道)
政策引擎會強制執行嚴格的資料驗證。在將酬載傳遞給 Cedar 進行政策評估之前,基礎剖析器會驗證交易結構、RLP 編碼和密碼編譯完整性。
情境 11:交易酬載格式錯誤和無效
- 背景:用戶端提交格式錯誤的位元組序列、結構無效的酬載,或缺少必要密碼編譯欄位的交易 (例如 RLP 結構無效或缺少 gas 參數的 EVM 交易)。
- 結果:
gRPC InvalidArgument - 原因:內部交易剖析器在 API Gateway 層偵測到無效輸入。作業會立即失敗並關閉,向用戶端傳回
gRPC InvalidArgument錯誤,並完全略過 Cedar 政策引擎的評估。