本文介绍了一个基于 Passkey 的签名器,用于账户抽象钱包或 SDK,实现基于 Passkey 的登录机制。Passkey 允许用户使用设备的主要身份验证机制(如面容 ID、触摸 ID 或密码)来创建钱包并签署交易。PasskeySigner 扩展了 ethers 提供的抽象签名器,提供使用 Passkey 为区块链签名交易、消息和类型消息的功能,提升用户体验和安全性。
简而言之——我们为账户抽象钱包或 SDK 提供了一个新的签名器,用于实现基于密钥的登录机制。密钥允许用户使用其设备的主要身份验证机制(如面容 ID、触控 ID 或密码)来创建钱包并签署交易。
感谢 @nlok5923 和 @0xjjpa 的工作、审查和讨论
定义
根据 ethers 文档,签名器是:
“…一个以太坊账户的抽象,可用于签署消息和交易,并将已签名交易发送到以太坊网络以执行状态更改操作。”
PasskeySigner 包将扩展 ethers 提供的抽象签名器,并提供使用密钥对区块链的交易、消息和类型化消息进行签名的功能。 密钥是一种与用户帐户以及网站或应用程序关联的数字凭证。密钥允许用户在无需输入用户名或密码或提供任何其他身份验证因素的情况下进行身份验证。 这项技术旨在取代密码等传统身份验证机制。 密钥可以替代私钥管理,从而提供更快的登录、易用性和更高的安全性。
在此上下文中,Bundler 和 EntryPoint 指的是 ERC 4337 中提到的相同概念。
有以下几个优势:
Gas成本: 基于密钥的交易的链上签名验证会产生大量的 gas 成本。 人们已经努力降低验证的 gas 成本。 Opclave 遵循 Optimism 的 Bedrock Release 标准,利用带有“secp256r1 verifier”预编译合约的自定义 rollup 。 Ledger 也在努力进一步优化 gas 成本。
设备依赖性: 虽然密钥依赖于设备,但有一些解决方法。 Apple 设备用户可以在 iCloud 钥匙串中安全地备份他们的密钥,从而克服了这一限制。 对于其他设备,该模块将提供多设备支持,允许用户向他们的智能合约钱包添加多个所有者(设备)。
如果钱包 sdk 本身公开了接受外部签名器的必要接口,则初始化将非常简单。 例如,假设有一个名为 abc sdk 的钱包 sdk。 并且假设它在初始化它的实例时接受签名者,所以在这种情况下,集成将如下所示
// importing BananaPasskeyEoaSigner package
import { BananaPasskeyEoaSigner } from '@rize-labs/banana-passkey-manager';
import { ABCWallet } from 'ABCWallet-sdk';
// initializing jsonRpcProvider
const provider = ethers.getDefaultProvider();
// creating an instance out of it
const bananaEoaSignerInstance = new BananaPasskeyEoaSigner(provider);
// initializing the EOA with a specific username (it should be unique) corresponding to which the passkey
// would be created and later on accessing
await bananaEoaSignerInstance.init('<username>');
// initializing signer for smart contract wallet.
const abcSmartWalletInstance = new ABCWallet(bananaEoaSignerInstance);
进行交易的流程如下所示
智能合约钱包的一个显着特征是为交易提供自定义签名。 在突出的签名方案中,基于 secp256R1 的签名脱颖而出。 重要的是要注意 secp256k1 是一个 Koblitz 曲线,而 secp256r1 不是。 Koblitz 曲线通常被认为比其他曲线略弱。 secp256k1 和 secp256r1 都是在字段 z_pzp 上定义的椭圆曲线,其中 p 表示 256 位素数(尽管每条曲线使用不同的素数)。 两种曲线都遵循 y² = x³ + ax + by²=x³+ax+b 的形式。 在 Koblitz 曲线的情况下,我们有:a=0 a=0 且 b=7 b=7
对于 R1,我们有 a = FFFFFFFF 00000001 00000000 00000000 00000000 FFFFFFFF FFFFFFFF FFFFFFFC a=FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC 和 b = 5AC635D8 AA3A93E7 B3EBBD55 769886BC 651D06B0 CC53B0F6 3BCE3C3E 27D2604B b=5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B
与 K1 相比,R1 曲线被认为更安全,并且支持主要的硬件 enclave 。 此外,大多数安全 enclave 无法生成基于 K1 的签名,而 EVM 区块链通常使用这些签名来签署交易和消息。
典型的 ethers 签名者通过拥有私钥本身或通过连接到 JsonRpcProvider 来获取签名者来签署交易。 但是,密钥签名者的运作方式不同,因为它不 possess 私钥。 相反,它可以通过将交易和消息发送到硬件来签署交易和消息,并且签名的字符串作为输出提供。
const publicKeyCredentialCreationOptions = {
//The challenge is a buffer of cryptographically random bytes generated on the server, and is needed to prevent "replay attacks".
challenge: Uint8Array.from(
randomStringFromServer, c => c.charCodeAt(0)),
rp: {
name: "Your Name",
id: "yourname.com",
},
user: {
id: Uint8Array.from(
"UZSL85T9AFC", c => c.charCodeAt(0)),
name: "your@name.guide",
displayName: "ABCD",
},
//describe the cryptographic public key. -7 is for secp256R1 elliptical curve
pubKeyCredParams: [{alg: -7, type: "public-key"}],
authenticatorSelection: {
authenticatorAttachment: "cross-platform",
},
timeout: 60000,
attestation: "direct"
};
const credential = await navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions
});
//credential object
PublicKeyCredential {
id: 'ADSUllKQmbqdGtpu4sjseh4cg2TxSvrbcHDTBsv4NSSX9...',
rawId: ArrayBuffer(59),
response: AuthenticatorAttestationResponse {
clientDataJSON: ArrayBuffer(121),
attestationObject: ArrayBuffer(306),
},
type: 'public-key'
}
提取公钥,然后将其传递给智能合约钱包。
在身份验证期间,会创建一个断言,这是用户 possess 私钥的证明。
const assertion = await navigator.credentials.get({
publicKey: publicKeyCredentialRequestOptions
});
publicKeyCredentialCreationOptions 对象包含服务器指定的许多必需和可选字段,用于为用户创建新凭据。
const publicKeyCredentialRequestOptions = {
challenge: Uint8Array.from(
randomStringFromServer, c => c.charCodeAt(0)),
allowCredentials: [{\
id: Uint8Array.from(\
credentialId, c => c.charCodeAt(0)),\
type: 'public-key',\
transports: ['usb', 'ble', 'nfc'],\
}],
timeout: 60000,
}
与硬件的交互将使用 webauthn 库完成,该库允许我们在硬件中生成新的加密密钥。 获取对应于此私钥的公钥,这是一个 (x,y) 坐标。 这些坐标应存储在智能合约钱包中,它们将充当智能合约钱包的所有者。
- 原文链接: ethresear.ch/t/passkey-b...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!