{"content":{"title":"账户抽象, 审计人员的看法","body":"作者：Dmitri Zakharov，MixBytes 首席技术官\r\n\r\n![](https://img.learnblockchain.cn/2025/03/09/45.jpg)\r\n\r\n## 引言\r\n\r\nEIP-4337 提出了以一种创新的方法进行以太坊账户抽象化的方案，该方案不需要对共识层进行更改。EIP-4337 的体系结构在高层系统中复制了交易内存池的功能，允许更灵活和动态的处理模型。系统中的主要参与者是用户和 Bundlers，他们通过专门的点对点客户端网络运作，并实现了 UserOperationPool。\r\n\r\n在这种设置中，用户将 UserOperation 对象提交到 UserOperationPool。Bundlers 作为交易生成者，监控内存池，并将 UserOperation 对象组合成一个单一的捆绑事务，然后发送到 EntryPoint 智能合约。该 EntryPoint 合约充当中心处理枢纽，执行 UserOperation 对象并部署实现指定接口的自定义账户智能合约。\r\n\r\n所部署的账户智能合约不仅仅是资产存储；它们还处理非ces和签名验证，为操作过程和资产利用提供自定义逻辑的机会。为了进一步增强 EIP-4337 的灵活性，协议引入了 Paymaster 角色，在执行内部事务期间处理Gas费用的支付。这一补充允许基于不同条件的可定制Gas费用支付方法，例如接受 ERC-20 代币作为 Paymaster 的支付。\r\n\r\nEIP-4337 的详细架构和逻辑可以在由 [Vitalik Buterin 等人](https://eips.ethereum.org/EIPS/eip-4337) 撰写的提案中找到。\r\n\r\n## 理解账户抽象的机制\r\n\r\n- 用户应该创建一个 UserOperation 伪事务对象并为其签名。UserOperation 描述如下：\r\n\r\n```Solidity\r\nstruct UserOperation {\r\n    address sender,\r\n    uint256 nonce,\r\n    bytes initCode,\r\n    bytes callData,\r\n    uint256 callGasLimit,\r\n    uint256 verificationGasLimit,\r\n    uint256 preVerificationGas,\r\n    uint256 maxFeePerGas,\r\n    uint256 maxPriorityFeePerGas,\r\n    bytes paymasterAndData,\r\n    bytes signature\r\n}\r\n```\r\n\r\nUserOperation 结构由多个字段组成，这些字段定义了执行事务的参数和指令。我们来探讨每个字段及其重要性：\r\n\r\n- **sender**\r\n\r\n该字段指示发起事务的智能合约钱包的地址；\r\n\r\n- **nonce**\r\n\r\nnonce 作为抵抗重放攻击的安全措施，它在创建用户账户时用作盐，以确保唯一性；\r\n\r\n- **initCode**\r\n\r\n在首次事务的情况下，initCode 用于部署智能合约钱包。智能合约开发者引入的工厂合约使用此代码；\r\n\r\n- **callData**\r\n\r\ncallData 字段包含要由智能合约钱包执行的数据；\r\n\r\n- **callGasLimit**\r\n\r\n该字段设置智能合约钱包执行过程中的Gas限制；\r\n\r\n- **verificationGasLimit**\r\n\r\nverificationGasLimit 指定 UserOperation 验证过程的Gas限制，由 EntryPoint 合约执行；\r\n\r\n- **preVerificationGas**\r\n\r\n该费用用于补偿 Bundler 的服务；\r\n\r\n- **maxFeePerGas 和 maxPriorityFeePerGas**\r\n\r\n这些值遵循 EIP-1559 标准，定义事务的最大Gas价格；\r\n\r\n- **paymasterAndData**\r\n\r\n该字段包含 Paymaster 合约地址及相关验证和确认所需的特定数据；\r\n\r\n- **signature**\r\n\r\n结合 nonce，signature 确保了 UserOperation 的合法性，验证它是由授权用户创建的。\r\n\r\n- UserOperation 被发送到特定的内存池，专门用于此类对象（使用 eth_sendUserOp 调用）。Bundlers 监视该内存池，使用 EntryPoint 合约的公共函数验证 UserOperation 对象，然后将 UserOperation 打包成事务（这是对 EntryPoint 合约的调用，包含 UserOperation[] 数组），以便将其包含在区块中（如果 Bundler 作为区块生成器，可以提出该区块）。\r\n\r\n- 如果 UserOperation 对象中设置了 initCode，则 EntryPoint 合约使用该 initCode 调用工厂合约，并返回创建的账户合约钱包地址。工厂使用 CREATE2 操作码创建用户钱包。nonce 用作盐（在大多数情况下等于 0，因为这是与 UserOperation 的第一次事务）。CREATE2 被用于在不同网络上生成相同的账户地址，因为 EntryPoint 在其他网络上是持久的。\r\n\r\n- 然后，在一个账户合约内检查 UserOperation，确认该调用来自 EntryPoint，检查 UserOperation 中提供的 nonce，验证提供的签名并调用 Paymaster 为事务进行预融资（如果请求）。eth-infinitism 实现使用 OpenZeppelin 的 ECDSA recover 函数从 UserOperation 结构哈希中获取签名者地址。\r\n\r\n```Solidity\r\nbytes32 hash = userOpHash.toEthSignedMessageHash();\r\nif (owner != hash.recover(userOp.signature))\r\n    return SIG_VALIDATION_FAILED;\r\n```\r\n\r\n其中 owner 是用户的地址。\r\n\r\n在实现 BLS 账户签名的情况下，用户的智能合约钱包必须包含一个 getBlsPublicKey() 函数。UserOperation 结构被转换为可验证消息。然后获取的公钥、消息和签名被传递到签名验证函数。\r\n\r\n- Paymaster 允许用户通过提供 ERC-20 代币授权而不是使用本网络原生货币进行Gas费支付。Paymaster 计算以提供的代币为交易定价，确定是否需要退款，并检查给定的授权是否足够。值得注意的是，eth-infinitism 在 UserOperation 执行结束时更新代币价格。如果自上次获取以来代币价格下降，则应用负退款。eth-infinitism 实现中的 OracleHelper 合约包含一个 priceUpdateThreshold，用于确定何时需要价格更新。\r\n\r\n- 在通过所有检查后，包括逻辑检查和Gas支出验证，提供的 callData 通过从 EntryPoint 对用户的账户合约钱包的调用被执行。账户合约随后再次调用目标地址，并使用指定的 calldata。\r\n\r\n## 可能的集成方式\r\n\r\n### 集成 Paymasters\r\n\r\n在 ERC-4337 中，集成的 Paymaster 是 DeFi 项目的重要组成部分，因为它处理相关的Gas成本。它提供了不同的方法来覆盖这些成本，例如使用 ERC-20 代币或直接赞助Gas价格，从而增强了协议的吸引力。\r\n\r\n在集成 Paymaster 时，所有协议都需要考虑拒绝服务（DOS）攻击的风险。如果有人发现通过赞助他们的事务而不提供公平补偿的方法，他们就可以耗尽 Paymaster 的资金。为了说明这一点，考虑一个新的 ERC-20 代币补偿任何转账的Gas成本的场景。攻击者可能通过不断地相互转移代币来利用这一点，迅速耗尽 Paymaster 的资金。\r\n\r\nPaymasters 在去中心化交易所（DEX）中具有实用性，如 Uniswap，使 ERC-20 代币的交易不需要本土代币。例如，在将代币 A 交易为代币 B 时，分配给交易的代币 A 数量可以减少，以考虑相应的Gas成本。此外，ERC-20 代币可以被兑换为包装的原生代币，然后立即解包并发送到用户的账户中。\r\n\r\n在这种用例中，考虑滑点至关重要。代币 B 的最小金额计算应考虑Gas价格补偿。对滑点机制的不正确调整可能导致事务持续失败或可被尝试盗取用户资金的 MEV-bots 利用。\r\n\r\n此外，像 OpenSea 这样的 NFT 市场可以利用 Paymasters，使艺术家能够铸造 NFT 而不需要本土代币。艺术家或机构可以通过传统方式（例如，市场上的银行卡）进行支付。随后，协议将在 Paymaster 中将这些用户列入白名单，允许他们在不需要深入了解加密货币的情况下，通过用户友好的界面部署他们的作品。此外，市场甚至可以赞助Gas支付，以支持文化机构或吸引著名艺术家，进一步增强生态系统。\r\n\r\n### 定期操作\r\n\r\nERC-4337 引入了额外的功能，如定期操作和订阅，这可以为 DeFi 项目带来新特性。然而，实现这些功能需要支持一个抽象账户的实现，钱包合约可以验证这种 UserOperations。\r\n\r\n定期操作的一个应用是在诸如 Aave 和 Compound 的借贷平台中。用户可以设置定期向协议转账资金，使他们的代币持续被借出。这会产生收益，并改善用户债务的健康因子。此外，当健康因子低于某个阈值时，用户还可以自动批准一定金额的资金。\r\n\r\n另一个用例是不需要用户余额的情况下，在去中心化交易所（DEX）或其他交易平台上设置订单。用户可以为 ERC-20 代币设置审批条件。交易协议仅在满足这些条件以及用户拥有足够余额的情况下执行该订单。\r\n\r\n在实施定期或触发的批准时，务必密切关注诸如批准数量、授权转账者和自动批准的周期等各种细节。协议所有者与用户共同负责确保这些设置得到仔细定义和管理。\r\n\r\n## 限制\r\n\r\n尽管 EIP-4337 在以太坊账户管理方面采取了革命性的方法，但仍面临几个固有限制。这些限制源于各种因素，例如潜在的干扰和拒绝服务攻击、用户操作的隔离验证过程的必要性以及整体系统的去中心化特性：\r\n\r\n- 验证过程中的Gas限制：EIP-4337 的设计对验证过程施加了限制。为了防止过高的Gas消耗和潜在的干扰，高成本的验证算法无法被纳入账户智能合约。如果验证过程的Gas限制参数设置过高，Bundler 被允许排除 UserOperation 对象。\r\n\r\n- 验证过程的独立性：被分组到单个捆绑的账户和 Paymasters 的验证过程必须保持独立，意味着它们不能调用与其他 UserOperations 相关的账户或访问相同的存储槽。此限制确保了验证的一致性不依赖于捆绑事务内 UserOperation 对象的顺序。因此，使用 BeaconProxy 的可能性受限，连接到相同 Beacon 的账户不能包含在一个捆绑中。\r\n\r\n- 存储访问限制：账户和 Paymasters 只能读取与其地址相关的存储槽。为了减少 DoS 和干扰攻击的可能性，引入了一种质押机制。如果 Paymaster 验证过程访问与其他地址相关的存储，则必须质押指定金额的资产。该质押可以在固定延迟后随时解质押。\r\n\r\n- Paymasters 的白名单：客户端实现了 Throttle 和 Ban 机制，以确定在包含在捆绑后的验证过程失败的 Paymasters。简单来说，这个机制针对的是验证函数不一致的 Paymasters。如果一个 Paymaster 在被包含在捆绑后频繁失败（超过客户端或 Bundler 预定义参数的频率），Bundler 可能会降低该操作的优先级，甚至禁止使用该 Paymaster 一段时间。\r\n\r\n- UserOperationPool 和链内存池之间的延迟：UserOperation 对象包含在 UserOperationPool 中，然后才能被添加到捆绑事务至链内存池。这意味着，从发送操作到内存池到在区块中包含相关捆绑事务之间可能会经过较长时间。为了减轻延迟处理操作，账户验证函数返回一个 validUntil 参数，使 Bundlers 能够避免使用过时的 UserOperation 对象。\r\n\r\n- 操作码限制：EIP-4337 要求验证过程不依赖于区块和事务状态，以维护验证模拟和捆绑事务执行之间的一致性。此限制要求 Bundlers 确保账户的 validateUserOp 方法和 Paymasters 的 validatePaymasterUserOp 不使用特定操作码（GASPRICE, GASLIMIT, DIFFICULTY, TIMESTAMP, BASEFEE, BLOCKHASH, NUMBER, SELFBALANCE, BALANCE, ORIGIN, GAS, CREATE, CREATE2, COINBASE, SELFDESTRUCT）。对于 GAS，只有在后面跟随一个调用操作码的情况下可以例外。\r\n\r\n- 部署成本：每个账户智能合约必须在使用前部署。如果推断到数百万个账户，部署成本可能是巨大的。然而，通过 [EIP-1167 (最小代理合约)](https://eips.ethereum.org/EIPS/eip-1167)，可以减轻这些成本，从而降低合约创建成本。\r\n\r\n- 防止复制攻击：为了防止复制攻击，EIP-4337 要求 UserOperation 验证依赖于 chainId、nonce 和 msg.sender（即 EntryPoint 智能合约）。\r\n\r\n## 安全风险\r\n\r\nEIP-4337 的实现突出了若干风险。这些风险与账户智能合约中自定义签名验证方法的潜在漏洞、干扰的潜力、与特定项目集成的限制，以及全面审计的关键需求相关：\r\n\r\n- 自定义签名验证风险：EIP-4337 下账户智能合约采用自定义签名验证的能力可能会 introduce 安全漏洞。这些自定义验证方法可能不如用于以太坊中事务签名的标准 ECDSA 算法安全，导致更高的漏洞风险。\r\n\r\n- 干扰：尽管采取了预防措施，但 EIP-4337 中仍存在潜在的干扰。例如，恶意行为者可以在内存池中抢先执行捆绑事务，改变多个账户的状态，导致验证过程在消耗大量Gas后失败。\r\n\r\n- 项目集成限制：EIP-4337 的结构，其中每个账户都是智能合约，对使用 isContract() 修饰符的项目施加了集成限制。此限制基本上禁止非 EOA 消息发送者使用这些项目。\r\n\r\n- 审计的必要性：鉴于账户和 Paymaster 中可能存在的安全漏洞，必须对它们进行严格审计，以确保整体系统的安全性。\r\n\r\n- Bundler 提取的价值：Bundlers 可以重放 UserOperationPool 中用户的操作，可能抢先实施套利机会。此风险可以通过将客户端实现为可信第三方来减轻，就像 FlashBots 项目所做的那样，从而保障用户与 Bundlers 或直接区块生成者的安全操作。\r\n\r\n## 结论\r\n\r\nERC-4337 提供了一个创新的解决方案，用于管理以太坊网络上的事务，允许在处理资产和Gas支付方面具有更大的灵活性。该协议有潜力增强现有的 DeFi 协议，使其更加方便和可适应。但是，重要的是在实施过程中仔细考虑相关的限制和风险。在利用 ERC-4337 的优势与实施强有力的安全措施之间寻求谨慎的平衡，将是这一途径在以太坊生态系统中建立重要里程碑的关键。\r\n\r\n- MixBytes 是谁？\r\n\r\n[MixBytes](https://mixbytes.io/) 是一个由专家区块链审计员和安全研究人员组成的团队，专注于为与 EVM 兼容的和基于 Substrate 的项目提供全面的智能合约审计和技术顾问服务。请关注我们在 [X](https://twitter.com/MixBytes) 上，获取最新的行业趋势和见解。\r\n\r\n>- 原文链接： [mixbytes.io/blog/account...](https://mixbytes.io/blog/account-abstraction)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/24680","address":null},"history":null,"timestamp":1741514331,"version":1}