---
title: "什麼是 RIP-7212？支援 secp256r1 曲線的 Precompile"
description: "RIP-7212 是 Ethereum 協定的核心變更，透過預編譯合約（precompiled contract）提供低成本、安全且快速的 P256 曲線驗證方式。"
---

# 什麼是 RIP-7212？支援 secp256r1 曲線的 Precompile

<ImageBlock
  src="https://media.alchemy.com/1709769768-what-is-rip-7212.jpg"
  alt="RIP-7212 secp256r1 precompile 說明橫幅"
  width={3200}
  height={1800}
  priority
/>

[Account Abstraction](https://www.alchemy.com/overviews/what-is-account-abstraction) 為 Ethereum 帳戶帶來了一項重要功能：帳戶可程式化。這讓開發者能打造出成千上萬種新功能，例如每日消費限額、使用不同的簽署者，以及用任何代幣支付手續費。本文將聚焦於開發者如何透過即將在 rollup 上整合的 [RIP-7212](https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md)（先前稱為 EIP-7212），藉由支援生物辨識簽署者來提升使用者體驗。

## 現行的 Ethereum 簽章方式
**在 EVM 網路上，大多數預設帳戶都是外部持有帳戶（EOA），** 其所有權是透過橢圓曲線密碼學（ECC）來證明，這是一種無需信任第三方即可證明你持有金鑰、且訊息確實是用該金鑰簽署的方式，同時不會洩漏金鑰本身。

目前使用者管理資金的方式，不外乎自託管錢包（例如以助憶詞儲存金鑰）或託管式方案（例如信任第三方進行金鑰管理）。

與此同時，數十年來的 web2 安全研究已累積出一套經過實戰驗證的硬體、軟體、社群層面金鑰管理方案。因此，現代裝置都配備了專門用來保護使用者金鑰的安全硬體元件。然而，這些元件並不支援 Ethereum 目前使用的 secp256k1 橢圓曲線，因此無法將這些安全性最佳實務套用到 EOA 上。

智慧合約帳戶則能支援不同的驗證機制，包括使用 secp256k1（Ethereum 唯一原生支援的曲線）以外的橢圓曲線。使用生物辨識簽署者等不同驗證機制，能同時提升使用者體驗與安全性。本節將說明這些安全隔離區的運作原理，以及它們與智慧帳戶結合後的樣貌。

## 日常裝置上的安全隔離區：藏在手機裡的硬體錢包
幾乎所有現代裝置的晶片設計中，都內建了所謂的[可信任執行環境](https://en.wikipedia.org/wiki/Trusted_execution_environment)（TEE），這是一種進階硬體元件，專門用來保護使用者最敏感的資料。

例如，自 2013 年起，所有 Apple 產品都內建了一種稱為 Secure Enclave 的 TEE。與裝置中處理應用程式流程、通知等一切事務的其他部分不同，TEE 是一顆獨立的微晶片，與裝置的所有其他元件隔離。這種隔離確保了生物辨識資訊、加密金鑰等敏感資料，不會受到可能危及裝置其他部分的威脅所影響。運用 TEE 是現代裝置上儲存金鑰最安全的方式，能有效地將日常裝置轉變為只能透過生物辨識驗證存取的硬體錢包。

### 我們如何將 TEE 用於智慧帳戶？

安全隔離區讓使用者能在 TEE 內部建立金鑰，並用這些金鑰簽署任意訊息，而這正是我們在鏈上驗證所需要的。我們可以建立一個智慧帳戶，其擁有者由存放在 TEE 內部的私鑰所衍生。這些金鑰永遠不會離開裝置，且只有裝置擁有者（透過生物辨識驗證）才能存取它們。

<ImageBlock
  src="https://media.alchemy.com/1709767953-2.jpg"
  alt="trusted execution environments 運作原理示意圖"
  width={3200}
  height={1800}
/>

### Passkey：邁向無密碼網路的方式
約有 81% 與駭客攻擊相關的資料外洩事件，涉及使用被竊取或強度不足的密碼。因此，研究人員一直在關注由 FIDO Alliance 與 W3C 所開發的 WebAuthn 協定，希望藉由公開金鑰密碼學提供更安全的金鑰管理系統，同時改善安全性與使用者體驗。截至目前，WebAuthn 已被 Google、Amazon、Microsoft 及 [Coinbase](https://www.alchemy.com/dapps/coinbase) 等大型公司採用作為驗證方式，且採用速度正快速增加。

WebAuthn 的目標是透過針對特定網域的公開金鑰密碼學來進行使用者驗證，藉此克服傳統密碼系統的弱點與不便。這種做法免除了密碼、忘記密碼、帳戶鎖定等問題，並降低常見的安全風險。

### Passkey 的運作方式
Passkey 是 WebAuthn 標準的一種實作，可在幾乎所有現代裝置上運作。當使用者註冊帳戶時，作業系統會產生一組與該帳戶綁定、且僅限該應用程式或網站使用的獨特金鑰對。這些金鑰會透過 Secure Enclave 加密，通常搭配生物辨識驗證，並透過 iCloud Keychain 或其他密碼管理工具在裝置間同步。

Passkey 在區塊鏈的帳戶管理上有許多應用場景。若要在區塊鏈上使用它，開發者可以將 passkey 的公鑰放入智慧合約，並以此作為驗證方式。

<ImageBlock
  src="https://media.alchemy.com/1709767898-1.jpg"
  alt="passkeys 運作原理示意圖"
  width={3200}
  height={1800}
/>

遺憾的是，幾乎所有安全隔離區與 passkey 都支援由 NIST 開發的 secp256r1（[P256](https://neuromancer.sk/std/nist/P-256)）曲線，而 Ethereum 原生僅支援 secp256k1 曲線。因此，我們必須在鏈上驗證這些簽章，才能向對方證明所有權，但該如何做到呢？

答案就是 RIP-7212。

## RIP-7212 是什麼？一個支援 secp256r1 曲線的預編譯合約
RIP-7212 是 Ethereum 協定的一項核心變更，透過預編譯合約提供了低成本、安全且快速的 P256 曲線驗證方式。這是首個被提出並成功獲得 Layer 2 區塊鏈接受的 Rollup Improvement Proposal。

### 什麼是預編譯合約？
預編譯合約並非傳統意義上的「合約」，而是預先定義好的原生函式，之所以稱為「預編譯」，是因為它們原生內建於 Ethereum 協定中。

預編譯合約針對某些運算進行了效能與 gas 成本上的最佳化，例如密碼學運算（如 secp256k1 與 secp256r1 的簽章驗證）或雜湊函式。若沒有預編譯合約，在 [Ethereum Virtual Machine](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm) 上執行這些運算會需要更多程式碼與大量計算能力，導致更高的 gas 費用。你可以在 evm.codes 網站上查看 [Ethereum 上的預編譯合約清單](https://www.evm.codes/precompiled?fork=shanghai)。

### RIP-7212 與其他方案相比如何？
使用 RIP-7212 驗證 P256 只需要 3450 gas，比目前最佳的非協定層級方案省了 100 倍。RIP-7212 是在 EVM 鏈上驗證 P256 最省 gas、最安全、也最快速的方式。

如前所述，使用生物辨識簽署者（例如基於 Passkey 與 Secure Enclave 的方案）唯有在鏈上能夠驗證 P256 曲線時才可行。目前有幾種在鏈上驗證 P256 曲線的方案，但沒有一種是低成本的。

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 200, title: "Verifier", dataType: "object" },
      {
        key: "2",
        width: 200,
        title: "Gas Consumption (Account Creation)",
        dataType: "object",
      },
      {
        key: "3",
        width: 200,
        title: "Gas Consumption (Single Transaction)",
        dataType: "object",
      },
      {
        key: "1709671329969",
        width: 180,
        title: "Proving Time",
        dataType: "object",
      },
      { key: "1709671346011", width: 180, title: "Type", dataType: "object" },
    ],
    data: [
      {
        "1": {
          title: "<p>Obvious' Solidity Verifier</p>",
          tooltip: "",
          icon: "",
        },
        "2": { title: "<p>330k</p>", tooltip: "", icon: "" },
        "3": { title: "<p>330k</p>", tooltip: "", icon: "" },
        id: 0,
        "1709671329969": { title: "<p>Instant</p>", tooltip: "", icon: "" },
        "1709671346011": {
          title: "<p>Smart Contract Verifier</p>",
          tooltip: "",
          icon: "",
        },
      },
      {
        "1": {
          title: "<p>Alembic's Solidity Verifier</p>",
          tooltip: "",
          icon: "",
        },
        "2": { title: "<p>2M</p>", tooltip: "", icon: "" },
        "3": { title: "<p>375k</p>", tooltip: "", icon: "" },
        id: 1,
        "1709671329969": { title: "<p>Instant</p>", tooltip: "", icon: "" },
        "1709671346011": {
          title: "<p>Smart Contract Verifier</p>",
          tooltip: "",
          icon: "",
        },
      },
      {
        "1": {
          title: "<p>FCL's Solidity Verifier w/o precomputation</p>",
          tooltip: "",
          icon: "",
        },
        "2": { title: "<p>205k</p>", tooltip: "", icon: "" },
        "3": { title: "<p>205k</p>", tooltip: "", icon: "" },
        id: 2,
        "1709671329969": { title: "<p>Instant</p>", tooltip: "", icon: "" },
        "1709671346011": {
          title: "<p>Smart Contract Verifier</p>",
          tooltip: "",
          icon: "",
        },
      },
      {
        "1": {
          title: "<p>FCL's Solidity Verifier with precomputation</p>",
          tooltip: "",
          icon: "",
        },
        "2": { title: "<p>3.2M</p>", tooltip: "", icon: "" },
        "3": { title: "<p>69k</p>", tooltip: "", icon: "" },
        id: 3,
        "1709671329969": { title: "<p>Instant</p>", tooltip: "", icon: "" },
        "1709671346011": {
          title: "<p>Smart Contract Verifier</p>",
          tooltip: "",
          icon: "",
        },
      },
      {
        "1": { title: "<p>Risc0 Verifier</p>", tooltip: "", icon: "" },
        "2": { title: "<p>250k</p>", tooltip: "", icon: "" },
        "3": { title: "<p>250k</p>", tooltip: "", icon: "" },
        id: 4,
        "1709671329969": {
          title: "<p>Nearly instant</p>",
          tooltip: "",
          icon: "",
        },
        "1709671346011": {
          title: "<p>Zero Knowledge Verifier</p>",
          tooltip: "",
          icon: "",
        },
      },
      {
        "1": {
          title: "<p>KnowNothingLab's Verifier</p>",
          tooltip: "",
          icon: "",
        },
        "2": { title: "<p>520k</p>", tooltip: "", icon: "" },
        "3": { title: "<p>520k</p>", tooltip: "", icon: "" },
        id: 5,
        "1709671329969": { title: "<p>~4 seconds</p>", tooltip: "", icon: "" },
        "1709671346011": {
          title: "<p>Zero Knowledge Verifier</p>",
          tooltip: "",
          icon: "",
        },
      },
      {
        "1": { title: "<p>Circom</p>", tooltip: "", icon: "" },
        "2": { title: "<p>230k</p>", tooltip: "", icon: "" },
        "3": { title: "<p>300k</p>", tooltip: "", icon: "" },
        id: 6,
        "1709671329969": {
          title: "<p>Nearly instant</p>",
          tooltip: "",
          icon: "",
        },
        "1709671346011": {
          title: "<p>Zero Knowledge Verifier</p>",
          tooltip: "",
          icon: "",
        },
      },
      {
        "1": { title: "<p>A Verifier with EVMMAX</p>", tooltip: "", icon: "" },
        "2": { title: "<p>73k</p>", tooltip: "", icon: "" },
        "3": { title: "<p>73k</p>", tooltip: "", icon: "" },
        id: 7,
        "1709671329969": { title: "<p>Instant</p>", tooltip: "", icon: "" },
        "1709671346011": {
          title: "<p>Core Protocol Change</p>",
          tooltip: "",
          icon: "",
        },
      },
      {
        "1": {
          title: "<p>EIP-7212 Precomiler Contract for P256</p>",
          tooltip: "",
          icon: "",
        },
        "2": { title: "<p>3450</p>", tooltip: "", icon: "" },
        "3": { title: "<p>3450</p>", tooltip: "", icon: "" },
        id: 8,
        "1709671329969": { title: "<p>Instant</p>", tooltip: "", icon: "" },
        "1709671346011": {
          title: "<p>Core Protocol Change</p>",
          tooltip: "",
          icon: "",
        },
      },
    ],
  }}
/>

<CalloutBlock>

資料來源：[Current State of Verifying P256 Curve](https://hackmd.io/@1ofB8klpQky-YoR5pmPXFQ/SJ0nuzD1T)

</CalloutBlock>

## RIP-7212 的現況與應用場景
RIP-7212 的規格已經定案，已有幾個團隊（Kakarot、Polygon、Optimism、[zkSync](https://www.alchemy.com/overviews/what-is-zksync-era) 與 Arbitrum）承諾將此預編譯合約導入各自的 rollup 生態系。Polygon [近期已將 RIP-7212 部署到其測試網](https://twitter.com/ulerdogan/status/1755358331420418134)，開發者已開始進行測試。

RIP-7212 的應用場景不僅限於智慧帳戶。RIP-7212 也可用於驗證可信任執行環境的遠端證明（remote attestation），這項技術已被用於去中心化區塊建構（SUAVE）、rollup 的雙因子驗證（Taiko 與 Scroll）等眾多場景！

## 打造一個相容 ERC-6900、使用 RIP-7212 的 P256 驗證器合約
一旦 RIP-7212 正式上線，下一步就是讓開發者能盡可能輕鬆地運用它來提升最終使用者的體驗。將新程式碼整合進智慧帳戶是一件摩擦大、風險高的工作，即使是像 RIP-7212 所提供的高度簡化流程，仍需要謹慎地設計架構、測試與審計。

這正是 ERC-6900 派上用場的地方。

[ERC-6900: Modular Smart Contract Accounts and Plugins](https://eips.ethereum.org/EIPS/eip-6900) 是一項 EVM 標準，旨在讓開發者能將邏輯功能封裝成外掛（plugin），供其他帳戶開發者使用。如此一來，開發者便能仰賴經過實戰驗證的外掛來提升最終使用者體驗，而不必自行從頭開發外掛。

將 RIP-7212 與 [ERC-6900](https://github.com/erc6900/resources) 結合，就能打造出一個簡單的帳戶外掛，用於高效率的 P256 驗證，讓使用者能以最低的開發負擔，享有低成本且安全的生物辨識驗證。隨著 RIP-7212 在主網上的採用逐漸加速，我們也很期待將這個外掛發布到各個支援它的 rollup 上。
