我们在 @Alchemy 如何开发并推出了历史上最节省燃料的智能账户。🕶️ 这一切源于一个大约三年前的想法。 当时我并不知道,这最终会为用户节省大量金钱。
在2023年5月,Twitter上出现了一种关于代理(例如ERC1967、克隆等)的热潮。 人们有不可变的变量,但他们想要代理。这是不可能做到的——但我们中的一些人接受了这个挑战。问题不在于EVM。 而在于我们对代理的思考方式。
所以我们构建了它——出现了多个版本。 我的和@wighawag都遵循相同的概念——我们可以通过在构造时将指定的内存切片复制到返回的字节码的末尾来附加不可变项。 实际代码非常简短且甜蜜。
(你可以在这里看到我三年前为了好玩而做的旧实现,哈哈:)
在运行时访问不可变参数也有两种方法。 第一种——我的方法,就是从一个固定的偏移量开始读取代理的字节码。简单! 只需将不可变参数加载到内存中,并根据您设置的任何模式进行解码。
第二个方案复杂得多,但稍微更节省燃料,而且非常有趣。 这个想法是将不可变对象附加到代理委托的每个调用上。这导致了更便宜的不可变访问,但代价是复杂性和更高的基础燃料成本。
有趣的是,Solady(我们现在使用的库,不要在生产环境中使用我的小演示,呵呵)最初选择了第二种方法! 但现在,我们都趋向于简单,我不知道生产环境中有任何附加 calldata 的不可变性,而 Solady 也选择了我使用的相同方法。
那么这与账户有什么关系呢? 智能账户的最基本、最常见的用例是它们被另一个签名者“拥有”。 通常,你会通过用所有者地址初始化智能账户来实现这一点。 但我在链上的兄弟,有更好的方法。
你可能已经明白了——我们只需将签名者地址附加到代理的字节码上。 简单。 然后,我们完全跳过初始化。很简单。而且实现知道所有者在字节码中的确切位置(更好的是,Solady 为我们处理这一切)。
瞧,迄今为止构建的最强大的智能账户现在也比 Uniswap 的交易便宜。 那么我们可以从中学到什么呢?
1. 始终追求你的好奇心 如果我们多年前没有追求这个带有不可变参数的克隆想法,可能就不会有使用这项技术的智能账户——仅仅因为我们觉得它有趣。
2. 几乎总有一个简单的解决方案 当你无法避免复杂性时,将复杂性切分成更小、更简单的部分。你应该能够向一个对代码库不熟悉的人解释你所有的代码。 如果你做不到,那么你的解决方案几乎可以肯定是过于复杂的。
3. 实际上,没有什么能阻止你。 如果你有一个想法,想要让某件事情变得更好,那就去做吧。没有什么能阻止你。我认为这个方法可行,尝试了,结果成功了。 如果你能停止自我限制,你将能够做出令人难以置信的事情,匿名者。
你的堆栈是否太深了? 希望这个帖子有点有趣。 如果你觉得这很不错,请成为朋友并给你的男孩点赞,这样我就可以在这里通过我的帖子接触到 5 人以上。 此外,基准测试 😸 我们不仅在部署上便宜......
5.44K