EIP-1153 除了赋能 Uniswap-v4 还能做什么

  • Confucian
  • 更新于 2023-10-13 15:42
  • 阅读 1817

2023年6月,Uniswap官方发布的一篇博客吸引了币圈所有人的眼球。继Uniswap-v3推出2年后,v4要来了!凭借大幅的gas优化以及全新的Hook玩法,进一步巩固了Uniswap在Dex领域的龙头地位。但直到笔者写作日期的10月,都还迟迟未上线,这

2023 年 6 月,Uniswap 官方发布的一篇博客吸引了币圈所有人的眼球。继 Uniswap-v3 推出 2 年后,v4 要来了!

凭借大幅的 gas 优化以及全新的 Hook 玩法,进一步巩固了 Uniswap 在 Dex 领域的龙头地位。

但直到笔者写作日期的 10 月,都还迟迟未上线,这是为什么呢?

因为它需要下次升级(坎昆升级)所引入的新字节码,具体就是 EIP-1153

EIP-1153 干了什么事

官方是这么写的

Add opcodes for manipulating state that behaves identically to storage but is discarded after every transaction.

我们知道,目前在智能合约中,变量通常可以声明存储为 2 个位置 storagememory :

storage 修饰的变量是永久保存链上的,涉及 SSTORESLOAD 这两个 opcode,gas 花费很大

memory 出现在一个函数里临时声明的变量,用完(函数执行结束)就释放了,gas 消耗小,但只是函数内可见

折中一下它们两者,其实就是 EIP-1153 要做的:修改了 storage 变量,但最后又复原了,一套下来相当于没改。比起普通修改 storage 要节省很多 gas

引入新的 opcode: TSTORETLOAD ,笔者预测关键字:Transient

意义

引入这一机制,能带来什么好处呢?

在 Uniswap-v4 中,废弃了 Factory - Pair 这种模式,转而将所有币对池子都放在一个(单例)合约里,因为省去了跨合约调用,故节省了很多 gas。单例合约的实现需要依靠 EIP-1153 来记录 token balance 变化

当然关于 Uniswap-v4 具体是如何运用 EIP-1153 的还需要读者自己去研究🤓

Reentrancy lock

笔者在这里介绍一个很常见的应用场景 —— ReentrancyGuard

相信稍懂些智能合约的朋友都知道“重入攻击”是区块链一大经典攻击手段,ReentrancyGuard 作为 OpenZeppelin 推出一个库,能有效防止被重入。

我们来看下它的核心代码:

uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;

modifier nonReentrant() {
    _nonReentrantBefore();
    _;
    _nonReentrantAfter();
}

function _nonReentrantBefore() private {
    if (_status == ENTERED) {
        revert ReentrancyGuardReentrantCall();
    }
    _status = ENTERED;
}

function _nonReentrantAfter() private {
    _status = NOT_ENTERED;
}

它做的事情很简单,引入了一种“”机制,在上下文的前后检查和修改 _status 的值从而防止“重入”进来

那么为什么要使用 1 和 2 来做区分,而不是 True 和 False 呢,为了节省 gas,具体可以参考 WTF-Academy

然而我们可以注意到,在 nonReentrant 里,最开始和结束后的 _status 是一样,一套下来没变,恰好符合 EIP-1153

因此在坎昆升级后,将会有更节省 gas 的新版 ReentrancyGuard 出来,或者说不需要单独的库,直接自己几行代码搞定。到时会让绝大部分 DeFi 合约更节省 gas

Single transaction ERC-20 approval

不知道有没有其他小伙伴和笔者一样,在刚接触 Dex 的时候,被想要 Swap 却要先 Approve Token 这一操作给整懵了。更难受的是,假如你之前 approve 的数量不够,还要再 approve 一次,要知道每笔交易都要付钱啊😭;一次 approve 的数量过多,暂时花不完又会有安全问题(合约把你的 token 转走),这叫一个矛盾啊😤

为了解决先 approve 再 swap 这个问题,提出了 transferFromWithPermit 这一方法,通过预先签名随后验签的方式把 approve 合并到 swap 里来从而实现“一步化”。

但有个问题,假如我签名 approve 后那些 token 没用上反悔了,签名被盗取怎么办,会不会给坏人可乘之机?

EIP-1153 可以带来 temporary approve 也就是在交易开始时我 approve 了,经过一系列操作,不管那些 token 用没用上,最后都恢复回去,这样是不是安全很多。

将来针对此特性应该会出新的 ERC-20 Extension 估计还会对 AA 账户抽象起一定帮助。

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Confucian
Confucian
0xDa6E...5500
Keep Learning