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
官方是这么写的
Add opcodes for manipulating state that behaves identically to storage but is discarded after every transaction.
我们知道,目前在智能合约中,变量通常可以声明存储为 2 个位置 storage
和 memory
:
storage
修饰的变量是永久保存链上的,涉及 SSTORE
和 SLOAD
这两个 opcode,gas 花费很大
memory
出现在一个函数里临时声明的变量,用完(函数执行结束)就释放了,gas 消耗小,但只是函数内可见
折中一下它们两者,其实就是 EIP-1153 要做的:修改了 storage
变量,但最后又复原了,一套下来相当于没改。比起普通修改 storage
要节省很多 gas
引入新的 opcode: TSTORE
和 TLOAD
,笔者预测关键字:Transient
引入这一机制,能带来什么好处呢?
在 Uniswap-v4 中,废弃了 Factory - Pair 这种模式,转而将所有币对池子都放在一个(单例)合约里,因为省去了跨合约调用,故节省了很多 gas。单例合约的实现需要依靠 EIP-1153 来记录 token balance 变化
当然关于 Uniswap-v4 具体是如何运用 EIP-1153 的还需要读者自己去研究🤓
笔者在这里介绍一个很常见的应用场景 —— 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
不知道有没有其他小伙伴和笔者一样,在刚接触 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 账户抽象起一定帮助。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!