---
title: "什么是 RIP-7212？支持 secp256r1 曲线的预编译合约"
description: "RIP-7212 是 Ethereum 协议的一项核心变更，通过预编译合约实现低成本、安全且快速的 P256 曲线验证。"
---

# 什么是 RIP-7212？支持 secp256r1 曲线的预编译合约

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

[账户抽象](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="可信执行环境工作原理图"
  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 钥匙串或其他密码管理器在设备间同步。

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 协议中原生可用。

预编译合约针对特定操作（例如 secp256k1 和 secp256r1 的签名验证等加密计算，或哈希函数）在性能和 gas 成本上做了优化。如果没有预编译合约，在 [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）等诸多场景！

## 构建一个使用 RIP-7212、兼容 ERC-6900 的 P256 验证器合约
一旦 RIP-7212 上线，下一步就是让开发者能够以最简单的方式使用它来改善终端用户体验。将新代码集成进智能账户是一件摩擦大、风险高的事情，即便是 RIP-7212 所提供的这类高度简化的流程，仍需要经过仔细的架构设计、测试和审计。

这正是 ERC-6900 的用武之地。

[ERC-6900：模块化智能合约账户与插件](https://eips.ethereum.org/EIPS/eip-6900) 是一项 EVM 标准，旨在让开发者能够将逻辑单元封装为插件，供任何其他账户开发者使用。这样一来，开发者就可以依赖经过实战检验的插件来改善终端用户体验，而无需自行构建插件。

将 RIP-7212 与 [ERC-6900](https://github.com/erc6900/resources) 结合，可以得到一个简单的账户插件，用于高效的 P256 验证，从而以极低的开发成本为用户提供低成本、安全的生物识别验证。随着 RIP-7212 在主网上的采用不断加速，我们很高兴能在支持该预编译合约的 rollup 上发布这一插件。
