OIN:开发者指南:详解账户抽象提案EIP-4337工作流程

原文标题:《EIP-4337 详细工作流程》

原文作者:Ben Law

本文不会从头介绍 EIP-4337,仅介绍 4337 的主要合约是如何实现的。适合对 4337 有一定了解的开发者,由其是钱包开发者,以及爱好者或研究员阅读。

主要内容位于流程图中:

需要配合 4337 源码阅读 GitHub—eth-infinitism/account-abstraction at main。

4337 Spec 中有更多详细细节 EIP-4337: Account Abstraction using alt mempool。  

请注意:

本流程图只画出了普通类型的交易,未涉及 Aggregator。掌握普通流程后才方便掌握聚合型的交易。

BCH社区成员发文希望ABC首席开发者Amaury下台:8月19日,BCH社区一名为NilacTheGrim的成员发表《论Amaury为何该退位让贤》文章,并悬赏0.5 BCH找人翻译该文(目前该文已有中文版)。文章认为,BCH进行基础设施融资没有问题,但Bitcoin ABC迫切想拿到coinbase 8%奖励,原因在于Bitcoin ABC效率低下。文章称,Bitcoin ABC存在严重的现金流问题,因为它们的运营成本非常昂贵。与此同时,Bitcoin ABC首席开发者Amuary Sechet视自己是BCH之神,认为他应该得到更好的待遇。文章表示,长久以来,矿工资助Amuary ,Roger Ver以及其他社区领袖也资助Amuary 。而Amuary却再三让人反感,以至于再没人愿意给予资助,因为他从不交付捐赠人所要求实现的技术特征。例如Roger Ver希望能提高链上交易限制,但Amaury却拖拉了两年才有所行动,且为时已晚。币价下跌,中国矿工们也不再资助他。所以Amaury别无选择要么激活IFP,要么下台,IFP是其最后的救命稻草。文章还称,IFP在道义上不合理。BCH不仅仅是ABC。如果ABC缺少资金,也绝不应该去破坏社区多年来共同创造的价值。文章指出,Amaury不在乎社区,而是认为要么给IFP coinbase奖励,要么就破坏BCH。文章给出的聊天记录截图显示,Amaury曾公开表示,哪怕BCH跌到40美金,ABC一年仍然能拿到100万美金。此前消息,由Amuary主导的Bitcoin ABC团队致力于推动在BCH下次升级部署IFP协议,实施coinbase规则,将8%区块奖励给到ABC相关地址,该事件引起社区极大争议。今日早间消息,Amuary表示,如果不实施coinbase规则,BCH的未来将变得无关紧要。[2020/8/20]

流程图中箭头不代表程序的调用栈或输入输出,仅代表相关角色、函数、事件的发生的先后顺序。

动态 | ETC Core举行开发者会议确定Agharta硬分叉高度:昨晚,ETC Core举行开发者电话会议确定Agharta硬分叉高度为9_573_000,预计在2020年1月15日进行。此次硬分叉支持的客户端有Classic Geth,Multi Geth,Parity,Hyperledger Besu。另据核心团队消息,Agharta将成为最后一个支持Classic Geth的ETC网络版本。[2019/12/13]

为方便读者对宏观架构的快速理解,流程图中省略了一部分函数调用和逻辑。被省略的部分有可能对你研究的问题或疑惑有很大意义,具体看你想了解什么内容,所以还是需要你必要时仔细阅读源码。

研究 4337 需要掌握以下核心概念:

UserOperation 的内容 EntryPoint 实现 Wallet 实现 Paymaster 实现验证阶段、执行阶段的执行流程与错误处理 Gas 的支付流程与计算

动态 | 比特币开发者:存储比特币的成本增加,目前约为每年2.1%:比特币开发者Tamas Blummer发文称,存储比特币的成本增加,目前估计为每年2.1%。他补充说,比特币存储最明显的成本是与将其进出钱包相关的费用。这些费用由移动代币的人支付,并且与交易的字节大小成正比,而不与移动的金额成正比。[2019/10/14]

一种内容类似 transaction 的伪交易对象,通过新的 RPC 方法 eth_sendUserOperation 提交给节点。

UO 中的字段含义大部分是显然的,仅挑选几个容易误解的进行分析:

sender,此处指的是要交互的 wallet,而非 msg.sender 或 tx.origin 等其他任何概念 verificationGasLimit,验证交易时的 gasLimitcallGasLimit,执行交易时的gasLimitpreVerificationGas,补偿 bundler 调用 handleOps () 时会一部分未计算在内的 gas 成本(如提交交易的 calldata 成本)。

声音 | BM:为资源和 RAM 而努力的应该是开发者 而不是用户:据 IMEOS 报道,BM 刚刚连发三条推特,具体如下:

1.不为用户支付带宽费用的 EOSIO APPs 是错的。当我们发布 EOS 的时候,我们提到了为资源和 RAM 而努力的应该是 APP 的开发人员,而不是用户。Voice 将展示最佳的做法。

2.仅仅因为 EOS 给用户提供了给自己抵押带宽的选择,对于开发者来说不应该依赖这种良好的用户体验设计。

3.你不会看到 Coinbase 和推特要求人们支付费用。那么为什么区块链的 APP 开发者会这样设计程序呢?[2019/9/15]

这个并非 UO 中的一个字段,而是由上面三个 gas 参数计算而出。代表了该 UO 在 验证阶段 预先支付给 EntryPoint 的总成本。Prefund 虽然是在验证阶段支付的,但包含了 preVerificationGas,验证和执行三部分的成本。之后不会再向 EntryPoint 进行支付 gas。

声音 | 门罗币开发者:就安全性而言 比特币和门罗币一样脆弱:据AMBcrypto消息,门罗币开发者Jethro Grassie最近直播中谈到了比特币的缺点。Grassie称,关于比特币的早期假设是“一堆废话”。让Grassie大为光火的是比特币社区的一名成员称门罗币无法审核承诺的安全性,因为没有正式的秩序,因为它们完全隐藏起来了,而“只有”计算绑定。Grassie阐明了计算绑定是椭圆曲线密码学的基础,这正是椭圆曲线的离散对数问题的硬度(hardness)。因此,Grassie认为,说“只有计算绑定”是一种误导。他补充称,任何在不清楚这一点的前提下抱怨门罗币的缺陷并暗示其存在隐性通胀的人基本上都是在胡说八道。 在他进一步表示,就安全性而言,比特币和门罗币一样脆弱。[2019/6/1]

具体计算参见 EntryPoint 中的 _getRequiredPrefund。

EntryPoint 是所有功能的核心入口。每个项目自行部署自己的 EntryPoint。Bundler,Wallet 和 Paymaster 都需要围绕 EntryPoint 工作。

链下验证 UO,剔除不符合要求和有问题的 UO。链下验证一是防止 DoS,二是避免 bundler 在链上损失 gas。

打包合规的 UO,提交上链。

向 EntryPoint 支付 gas 费

只响应来自 EntryPoint 的消息

执行来自 EntryPoint 的具体交易内容

注意,EntryPoint 不是 Wallet 的 factory。官方给出的图片容易给人造成这种误解,但官方实现并非如此。

向 EntryPoint 确认自己的为某 UO 服务的意愿

在 EntryPoint 内质押才能成为 paymaster

我们可以看到 Wallet 与 Paymaster 都有可能向 EntryPoint 支付 gas。gas 余额会存储在 deposits 这个 mapping 中。

注意,虽然 deposits 字面意思为充值,但并非必须一个需要预先手动完成的动作,也可以在每一笔 UO 发生时,计算缺少多少 gas 并自动充值。

最终,若所有操作的 actualGasCost 小于 prefund, EntryPoint 会将多余额度退款至你的 deposit。  

注意, validationActualCost & callActualCost 仅仅是为了说明而作的标记,并非真实存在的变量。它们是由 gasPrice() 累加的。  

代表用户最终使用的钱包。需要开发者至少实现以下两个自定义方法:

签名验证:你可以使用任何密码学手段来实现签名验证,比如,为了配合使用苹果的 Security Enclave 而实现 NIST P-256 的 ECDSA。如果没有特殊需求可直接使用以太坊的 ECDSA。

处理交易:EntryPoint 通过 address (sender).call (callData) 来调用 wallet 中的具体的交易功能。那么 call 需要有至少一个可执行的函数,如 transferEther (),callAnotherContrat () 等。

开发者还需要自行实现 wallet factory,需要创建钱包时,工厂会被 SenderCreator 合约调用。新建钱包应使用 CREATE2 方法以保障生成地址的确定性。

Paymaster 可以为用户支付 gas,因此可以实现:

免费交易:用户激励,让用户免费使用钱包 

gasless 交易:不直接用 ether 支付 gas,而使用其他 token 或 nft 等

等等其他类似的赞助交易功能

Paymaster 需要开发者实现:

validatePaymasterUserOp ():由于 paymaster 的开放性,验证逻辑需要开发者完全自己定义。验证后有可能需要实现类似 wallet 中 payPrefund () 的功能。

postOp:必须重写此方法,否则会被 revert。此方法可以定义在 paymaster 赞助完交易后需要做什么,如在验证时为用户支付了 ether,则此处要求用户支付等价的 ERC-20。

区块律动BlockBeats

媒体专栏

阅读更多

金色早8点

金色财经

去中心化金融社区

CertiK中文社区

虎嗅科技

念青

深潮TechFlow

Odaily星球日报

腾讯研究院

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

地球链

[0:15ms0-0:928ms