EIP1153 : Transient storageとは
Uniswapv4で調べる中でEIP1153の記載があり、気になったので調べてみました。
概要
Transient storageとはトランザクションの中で一時的に使われるstorageのことを指し、reentrancy lockでよく使われてます。
例) UniswapV2
このTransient storageは言語レベルでサポートされているというより、変数をtransient storageとして使っているだけです。
UniswapV3ではnatspecに記載して、変数がtransient storageであること明記しています。
EIP1153ではこのtransient storageを言語レベルでサポートするために、TLOAD(0x5c)
とTSTORE (0x5d)
の2つのopecodeを追加するものです。
callDataやmemoryでも同様のことは似たようなことはできましたが、ガス代が高かったりコントラクトを跨ぐことができなかったりなどしたため提案されました。
また、EIP3529によりストレージ利用のガスの払い戻しが、トランザクションが消費したガスの20%に制限さるようになりました。つまり、ガス代が少ないトランザクションの中でtransient storageを使った場合、ガス代の払い戻しが少なくなります。
Dencunのアップデートで追加されると予定されています。
実際の使い方
EIP1153が組み込まれると、変数の宣言にtransient
を追加するだけで使えるようになるみたいです。
UniswapV2のreentrancy lockだとこのようになります。
bool private transient locked;
modifier lock() {
require(!locked, 'UniswapV2: LOCKED');
locked = true;
_;
locked = false;
}
ユースケース
EIP1153のユースケースとして以下6つが紹介されていました。
3つ目のユースケースとして提示されている、Single transaction ERC-20 approvals
は非常に面白いと感じました。これができると一つのトランザクションでERC20のapproveとtransferが実行できるようになるそうです。
- Reentrancy locks
- On-chain computable CREATE2 addresses: constructor arguments are read from the factory contract instead of passed as part of init code hash
- Single transaction ERC-20 approvals, e.g. #temporaryApprove(address spender, uint256 amount)
- Fee-on-transfer contracts: pay a fee to a token contract to unlock transfers for the duration of a transaction
- "Till" pattern: allowing users to perform all actions as part of a callback, and checking the "till" is balanced at the end
- Proxy call metadata: pass additional metadata to an implementation contract without using calldata, e.g. values of immutable proxy constructor arguments
参考
Discussion