介绍
会话密钥是构建无缝链上应用的重要功能。它们允许与应用和游戏顺畅交互而无需不断确认,从而改善用户体验。这些密钥提供具有特定权限的用户帐户的临时访问权限。这在用户体验至关重要的情况下尤其有用,例如游戏或自动交易。例如,用户可以让应用代表他们执行交易,从而减少游戏或其他活动期间的中断。
此外,会话密钥降低了主私钥泄露的风险,从而增强了安全性。如果会话密钥被泄露,攻击者将无法访问用户的主帐户和资金。此安全功能对于维护用户对区块链应用程序的信任至关重要。
会话密钥可以自主为用户签署交易,同时限制在特定的时间范围和值内。这允许用户授予 dApp 发送预先批准的交易的权限,而无需每次都进行确认,从而为 dApp 开辟了许多用例。
什么是会话密钥?
会话密钥是额外的授权签名者,可让用户与区块链应用程序交互而无需重复使用其主密钥。这些密钥通过 ERC-4337 基础设施(包括打包器和 EntryPoint)运行,以在特定限制下代表帐户执行交易。此功能对于需要频繁用户交互的应用程序(例如游戏和去中心化金融 (DeFi) 平台)至关重要。
例如,用户可以允许应用使用会话密钥代表他们执行特定交易,从而显著减少游戏过程中的中断或奖励申领和流动性管理等自动化流程。会话密钥的权限可以根据应用程序的需求进行定制,同时保持整体帐户安全。
功能和权限
会话密钥的优势在于它们能够根据预定义的权限限制操作。开发人员可以指定各种参数,包括时间范围、访问控制列表以及 ERC-20 代币和原生代币的支出限制。这可确保用户在享受流畅体验的同时保持对其资产的控制。
例如,可以设置会话密钥以允许应用程序在特定时间范围内花费一定数量的代币,从而在不影响安全性的情况下自动完成交易。此功能不仅增强了用户体验,还开辟了新的支付模式,例如订阅和定期付款。
安全注意事项
会话密钥虽然简化了交互,但也带来了重要的安全问题。即使会话密钥被泄露,主账户仍然是安全的,因为会话密钥在其定义的限制内运行。
这最大限度地减少了主私钥的暴露,这对于维护用户安全至关重要。
账户抽象:转换加密用户体验 (UX)。
账户抽象使得在您的 web3 应用程序或游戏中部署会话密钥成为可能。
账户抽象可以创建智能合约钱包,这些钱包是独立的智能合约,可以发起和执行交易,具有增强的灵活性和可编程性。任何可以以智能合约代码形式定义的自定义操作都可以在这些钱包中实现。
智能合约钱包(或账户抽象钱包)的操作相当简单。智能合约钱包不像传统钱包那样发送常规交易,而是使用 UserOperations,它代表代表用户执行的操作。
UserOperation 包含多个字段,描述交易类型、代币、交易各个步骤的 gas 限制和价格、用于验证交易的签名以及其他元数据。
每次智能账户发送 UserOperation 时,它都会进入所有 UserOperations 的公共等待区(称为 alt mempool)。
然后,这些请求由打包器打包,打包器类似于验证常规交易的节点。它们甚至使用与挖矿或验证器节点相同的逻辑来优先处理可以提取最大价值的交易。
捆绑的 UserOperations 通过单个白名单“入口点”发送,其中每个单独的 UserOperation 都通过调用不同的函数进行验证和执行。
由于 UserOperations 可以包含任何类型的逻辑,它允许用户根据他们想要的方式管理他们的账户和其中的资金实施各种定制。
在 Web3 应用程序中实现会话密钥以构建无缝的用户体验。
要在您的 web3 应用中启用会话密钥,只需将帐户抽象添加到您的thirdweb Connect 登录模块。
在您选择的网络上部署 帐户工厂智能合约:
ConnectButton
使用应用内钱包添加账户抽象

import { ConnectButton } from "thirdweb/react";const accountAbstraction = { chain: chain, factoryAddress: "<contract_address>", sponsorGas: true,}export const AALogin = () => { return ( <ConnectButton client={client} chain={chain} accountAbstraction={accountAbstraction} connectButton={{ label: "AA Login" }} /> )};
在这个例子中,我们将使用智能钱包(账户抽象)并使用付款人来赞助用户所需的 gas 费用。
这意味着用户可以使用电子邮件或社交登录并立即开始使用我们的应用程序并与区块链交互,而无需为他们的钱包提供资金。
使用扩展程序创建会话密钥
addSessionKey
。使用为我们的智能钱包部署的智能合约,我们可以将权限设置为sessionKeyAddress

const account = useActiveAccount();const smartAccount = getContract({ client: client, chain: <chain>, address: account?.address as string,});const createSessionKey = async () => { if (!account) return; try { const tx = addSessionKey({ contract: smartAccount, account: account, sessionKeyAddress: "<address>", permissions: { approvedTargets: "*", nativeTokenLimitPerTransaction: 0.1, permissionStartTimestamp: new Date(), permissionEndTimestamp: new Date(Date.now() + <set_date>), } }); await sendAndConfirmTransaction({ account: account, transaction: tx, }); } catch (error) { console.error(error); }};
通过调用该函数查看智能钱包上的签名者
getAllSigners
。使用useReadContract
钩子和getAllSigners
扩展可以轻松完成此操作。

const smartAccount = getContract({ client: client, chain: <chain>, address: account?.address as string,});const { data: activeSigners } = useReadContract( getAllActiveSigners, { contract: smartAccount, });
使用扩展程序删除签名者及其权限
removeSessionKey
。

const revokeSessionKey = async (signer: string) => { if (!account) return; try { const tx = removeSessionKey({ contract: smartAccount, account: account, sessionKeyAddress: signer, }); await sendAndConfirmTransaction({ account: account, transaction: tx, }); } catch (error) { console.error(error); }};
现在,您可以从智能钱包中添加、查看和删除会话密钥。创建会话密钥时,会设置会话密钥代表您的智能钱包执行的权限和限制。这包括支出限制、白名单合约和会话密钥具有权限的时间段等权限。
真实用例和成功案例
会话密钥使得构建具有近乎完美用户体验的 web3 应用程序成为可能——从而能够吸纳非加密原生用户。
Cityverse Tycoon是一款由 OwnPlay 开发的大富翁风格手机游戏,它席卷了手机游戏界,仅在美国 iOS 版的下载量就已超过 20 万次。
该体验是使用thirdweb 的应用内钱包和账户抽象相结合构建的,前者允许用户使用电子邮件、谷歌或苹果账户登录,后者为用户提供会话密钥,使用户无需签署交易即可完成链上操作。
结论:利用会话密钥提升 web3 用户体验
采用会话密钥代表区块链应用程序可用性和功能的重大飞跃。这些临时加密密钥允许用户与应用程序交互,而无需使用主密钥进行不断确认。这项创新不仅增强了用户体验,而且还最大限度地减少了敏感信息的暴露,使区块链交互更加安全和无缝。
通过简化身份验证流程并增强用户体验,会话密钥为与去中心化技术进行更直观的交互铺平了道路。希望增强区块链应用程序的开发人员应考虑集成会话密钥,以创造无缝且安全的用户体验。