本文解释了EntryPoint合约如何通过validateUserOp
和execute
函数获得对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
) 的控制权:
SimpleAccount
合约在构造期间将 EntryPoint
地址存储为不可变变量。SimpleAccount
中的 execute
函数允许由所有者或 EntryPoint
合约启动交易。SimpleAccount
中的 validateUserOp
函数设计为仅由 EntryPoint
合约调用,并通过 require
语句强制执行此操作。EntryPoint
合约的 handleOps
函数通过调用 validateUserOp
,然后在 SimpleAccount
合约上调用 execute
来处理 UserOperation
。此设置允许 EntryPoint
通过以下方式控制 SimpleAccount
:
validateUserOp
验证操作。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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!