1. 引言
前序博客:
账户抽象的承诺之一是完全摆脱用户的私钥,同时保持强大的安全性和自我托管。然而,许多智能帐户未能实现这一愿景,因为:
- 用于实现替代身份验证方法的库较少。这导致许多应用程序开发人员依赖不太用户友好的方法或第三方 MPC 和社交登录服务。这些通常比给用户私钥提供更好的用户体验,但仍然达不到完整的愿景。
怎样来完全摆脱这些依赖呢?
- 答案就是:Passkeys。
- Passkeys代表了革命性的一步,提供了一种安全、用户友好的身份验证替代方案,利用生物识别技术、PIN 或模式,并消除了对助记词短语的需要。
本文探讨了开发人员如何在以太坊应用程序中实现passkey authentication密钥身份验证,利用 ERC-4337 创建无缝、安全的用户体验,而不影响自我托管。
2. 了解Passkeys及其在区块链可访问性中的作用
帐户抽象的目标是让区块链应用程序更容易被公众访问,而Passkeys是使 web3 身份验证像任何其他应用程序或移动应用程序一样无缝的好办法。通过集成Passkeys,可使身份验证过程像使用任何传统应用程序一样简单,从而向用户隐藏面部 ID 或指纹识别等底层技术的复杂性。
3. 使用 ERC-4337 标准实施Passkeys
要在以太坊上启用Passkeys,用户的帐户需要是可验证 P256 签名的 ERC-4337 智能合约。该标准允许在没有传统私钥的情况下进行交易,这是对以太坊和其他 EVM 兼容区块链(如 BnB Smart Chain、Optimism 和 Aribtrum)的限制。
要在以太坊上启用Passkeys,有2个通用步骤:
- 1)使用Passkeys进行客户端签名:使用 WebAuthn API 在用户设备上生成并签署Passkeys。虽然创建本地Passkeys因设备而异,但该过程通常遵循标准模式。有关Passkeys生成的更多详细信息,可参看:创建通行密钥以实现无密码登录。
- 2)设置Passkeys的智能帐户:实施能够验证Passkeys签名的智能帐户。这些签名通常称为 P256 签名或椭圆曲线 secp256r1。实现此操作涉及修改智能合约中的 validateUserOp 函数以包含 P256 签名验证算法。对于那些寻求最大限度地缩短开发时间的人,请考虑使用已建立的智能帐户框架,如 Trust Wallet 的 Barz 或 GitHub 上的 Daimo p256-verifier。一项正在进行的提案EIP-7212: Precompile for secp256r1 Curve Support. Proposal to add precompiled contract that performs signature verifications in the “secp256r1” elliptic curve 建议预编译该合约以减少与签名验证相关的 Gas 成本,但截至 2024 年 2 月仅在 Polygon 上运行。
4. 使用Passkeys创建交易
新帐户的首个UserOperation始终需要包含 initCode 来部署帐户。 initCode 通常是智能帐户工厂和对该工厂的encoded调用的十六进制串联,以创建由passkey拥有的新帐户。简单实现可参看:
然后,可像平常一样创建UserOperation,但是当从用户那里获取签名时,将需要使用 WebAuthn API 从passkey中获取签名。在 ERC-4337 中,通常会对UserOperation的哈希进行签名。
相关简单示例见:
- Stackup的userop.js中有简单示例:https://github.com/stackup-wallet/userop.js/blob/8e78819d6e93193ab67f2fb87f2b80906444fae4/src/preset/signers/barzSecp256r1.ts#L28
- passkeys-4337中示例:https://github.com/passkeys-4337/smart-wallet/blob/f3aa9fd44646fde0316fc810e21cc553a9ed73e0/front/src/libs/smart-wallet/service/userOps/builder.ts#L140
5. 设置智能帐户以使用Passkeys
目前已有一个创建Passkeys并用它们签署消息的系统,还需要一个可以验证 p256 签名的智能帐户。在 ERC-4337 中,签名验证发生在 validateUserOp 函数中,要在该函数内包含 p256 验签算法。
此逻辑的一种实现可以从P256 签名 Solidity 合约中使用(见https://github.com/daimo-eth/p256-verifier),尽管有一项提案EIP-7212: Precompile for secp256r1 Curve Support. Proposal to add precompiled contract that performs signature verifications in the “secp256r1” elliptic curve 在以太坊区块链上预编译此合约,以减少与此曲线相关的 Gas 费用。
如果不想从头开始编写整个智能合约,也可以使用少数已经存在的智能帐户实现之一。
- 使用 P256 签名passkeys的智能合约钱包的实现是Trust Wallet 的 Barz: https://github.com/stackup-wallet/userop.js/blob/main/src/preset/builder/barz.ts。该实现的优点是其已经过世界上最大的以太坊钱包之一的审核和生产,尽管它不是模块化的。
- 如果网络上存在 EIP-7212, ZeroDev 的内核密钥模块将自动使用 EIP-7212 来节省 Gas 费用(高达 400,000 Gas)。
Stackup的userop.js 库原生支持以上2种方式。
还可在https://github.com/passkeys-4337/smart-wallet这个带有passkey SDK 的优秀开源项目中找到简单帐户的基本实现。该存储库包含带有passkeys的 Web 应用程序的非常基本的实现,是一个很好的起点。
6. 迈向更好的 Web3 用户体验
Passkeys为以太坊区块链上的用户身份验证提供了一种革命性的方法,通过消除传统的私钥来与帐户抽象的目标保持一致。对于希望增强区块链应用程序的安全性和用户体验的开发人员和组织来说,将Passkeys与 ERC-4337 集成可以提供前瞻性的解决方案。
参考资料
[1] Stackup博客 How to Use Passkeys on Ethereum