EntryPoint合约获得对ERC-4337钱包的临时控制权

本文解释了EntryPoint合约如何通过validateUserOpexecute函数获得对ERC-4337钱包(SimpleAccount)的控制权。通过代码示例展示了EntryPoint合约如何在用户操作验证和交易执行过程中与SimpleAccount合约交互,从而控制钱包的行为。但强调这种控制并非绝对或永久,SimpleAccount仍然保持自身的访问控制。

在之前一篇关于使用智能钱包(或者更准确地说,ERC-4337钱包)的风险的文章中,我提到了获得钱包控制权的一种方法。本文将探讨该方法,以扩大关注并帮助开发更好的解决方案。

为了说明 EntryPoint 合约如何获得 ERC-4337 钱包的控制权,让我们研究一个简化的代码示例:

// SimpleAccount.sol
contract SimpleAccount {
    address public owner;
    IEntryPoint private immutable _entryPoint;

    constructor(IEntryPoint anEntryPoint) {
        _entryPoint = anEntryPoint;
        owner = msg.sender;
    }

    function execute(address dest, uint256 value, bytes calldata func) external {
        require(msg.sender == address(_entryPoint) || msg.sender == owner, "Not authorized");   // 未授权
        (bool success, ) = dest.call{value: value}(func);
        require(success, "Transaction failed");   // 交易失败
    }

    function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)
    external returns (uint256 validationData) {
        require(msg.sender == address(_entryPoint), "Sender must be EntryPoint");   // 发送者必须是 EntryPoint
        // Validate signature and nonce here   // 在这里验证签名和随机数
        // ...
        return 0; // Indicates successful validation    // 表示成功验证
    }
}

// EntryPoint.sol (simplified)
contract EntryPoint {
    function handleOps(UserOperation[] calldata ops, address payable beneficiary) external {
        for (uint256 i = 0; i < ops.length; i++) {
            UserOperation calldata op = ops[i];
            address sender = op.sender;

            // Validate the operation   // 验证操作
            IAccount(sender).validateUserOp(op, keccak256(abi.encode(op)), 0);

            // Execute the operation   // 执行操作
            IAccount(sender).execute(op.target, op.value, op.data);
        }
    }
}

在此示例中,EntryPoint 合约通过以下机制获得 ERC-4337 钱包 (SimpleAccount) 的控制权:

  1. SimpleAccount 合约在构造期间将 EntryPoint 地址存储为不可变变量。
  2. SimpleAccount 中的 execute 函数允许由所有者或 EntryPoint 合约启动交易。
  3. SimpleAccount 中的 validateUserOp 函数设计为仅由 EntryPoint 合约调用,并通过 require 语句强制执行此操作。
  4. EntryPoint 合约的 handleOps 函数通过调用 validateUserOp,然后在 SimpleAccount 合约上调用 execute 来处理 UserOperation

此设置允许 EntryPoint 通过以下方式控制 SimpleAccount

  1. 通过 validateUserOp 验证操作。
  2. 通过 execute 执行交易。

当捆绑者向其提交一批 UserOperation 时,EntryPoint 获得此控制权。然后,EntryPoint 处理这些操作,并根据需要与 SimpleAccount 合约交互。

重要的是要注意,这种控制不是绝对的或永久的。SimpleAccount 仍然维护其自身的访问控制(所有者仍然可以直接执行交易),并且 EntryPoint 与帐户交互的能力受 SimpleAccount 合约中实现的规则的约束。

关于 Dana

Dana Love 博士 是一位拥有 33 年技术经验的资深人士,自 2011 年以来活跃于比特币和区块链领域,自 2007 年以来活跃于 AI 和 ML 领域。2024 年,Love 博士是一家去中心化 AI 平台的 CTO,该平台旨在进行 RWA 代币化。 从 2022 年至 24 年,Love 博士是基于 Cosmos 的 Dyme 协议的密码经济学家和核心贡献者,他还开发了一个屡获殊荣的 Cosmos 区块链 web3 社交网络。 从 2018 年至 22 年,Love 博士创立并领导了区块链支付平台 Radpay,500家初创公司和亚利桑那州商务管理局已将其公认为金融科技创新者。 从 2012 年至 18 年,Dana 率先推出了四个区块链 ICO,并担任了不同的企业领导职务。 从 2007 年至 12 年,作为军事承包商 Bright Dawn 的首席执行官,Dana 领导了复杂实时数据系统、大数据和数据融合项目以及 IC、国防和民用机构的各种数字和动力工作的开发。 从 1995 年至 2007 年,Love 创立或担任多家公司的领导职务,包括思科投资支持的 Metacloud 和 Warburg Pincus 支持的 Radnet,并领导了上市公司(包括 GTE(现在的 Verizon)、Prosodie(现在的 Cap Gemini)和 ADC)的部门。 Dana 的职业生涯始于为美国政府提供民事服务。 Dana Love 拥有格拉斯哥大学的公共政策经济学博士学位,是哈佛商学院的贝克学者,并毕业于里士满大学。

  • 原文链接: blog.blockmagnates.com/e...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
blockmagnates
blockmagnates
江湖只有他的大名,没有他的介绍。