2023 年 6 月、Uniswap 公式のブログが、暗号通貨界全体の注目を集めました。Uniswap-v3 のリリースから 2 年後、v4 が登場するのです!
大幅なガスの最適化と新しいフックの仕組みにより、Uniswap は Dex 領域でのトップの地位をさらに強固にしました。
しかし、筆者がこの記事を書いている 10 月になっても、まだリリースされていません。なぜでしょうか?
それは、次のアップグレード(カンクンアップグレード)で導入される新しいバイトコードが必要だからです。具体的にはEIP-1153です。
EIP-1153 は何をするのか#
公式の説明によると、
トランザクションごとに破棄されるが、ストレージと同じように振る舞う状態を操作するためのオペコードを追加します。
現在、スマートコントラクトでは、変数は通常、storage
とmemory
の 2 つの場所に保存されます。
storage
で修飾された変数は永続的にチェーン上に保存され、SSTORE
とSLOAD
という 2 つのオペコードが関与し、ガスを多く消費します。
memory
は関数内で一時的に宣言される変数であり、使用後(関数の実行が終了すると)解放されます。ガスの消費は少ないですが、関数内でのみ可視です。
それらの中間にあるのが、実際に EIP-1153 が行うことです:storage
変数を変更し、最後に元に戻すことで、実質的に変更しなかったことになります。通常のstorage
の変更に比べて、はるかに多くのガスを節約できます。
新しいオペコードTSTORE
とTLOAD
が導入されます。筆者の予測では、キーワードは「Transient」です。
意義#
このメカニズムを導入することで、どのような利点がもたらされるのでしょうか?
Uniswap-v4 では、Factory-Pair のようなモデルが廃止され、すべてのトークンペアプールが 1 つの(シングルトン)コントラクトに配置されるようになりました。これにより、コントラクト間の呼び出しを省略することで、多くのガスが節約されます。シングルトンコントラクトの実装には、EIP-1153 を使用してトークンの残高の変化を記録する必要があります。
もちろん、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
の値をチェックおよび変更することで、「再入」を防止しています。
では、なぜ True と False ではなく 1 と 2 を使用して区別するのでしょうか?それは、ガスを節約するためです。詳細については、WTF-Academyを参照してください。
しかし、nonReentrant
の中で、最初と最後の_status
は同じであることに注意することができます。一連の操作が終わった後も変わらず、ちょうど EIP-1153 に合致しています。
したがって、カンクンアップグレード後には、よりガスを節約できる新しいバージョンの ReentrancyGuard が登場するか、個別のライブラリを使用せずに数行のコードで対応できるようになるでしょう。これにより、ほとんどの DeFi コントラクトがよりガスを節約できるようになります。
単一トランザクションのERC-20承認#
他の方々も、筆者と同じように、Dex に初めて触れたときに、スワップする前にトークンを承認する必要があるという操作に戸惑ったことがあるのではないでしょうか。さらに困ったことに、以前に承認した数量が足りない場合は、もう一度承認する必要があります。それぞれのトランザクションにはお金がかかることを忘れないでください😭。一度に承認する数量が多すぎると、一時的に使い切れずにセキュリティ上の問題(コントラクトがトークンを奪う)が発生する可能性があります。これは困難な問題です😤。
先に承認してからスワップする問題を解決するために、transferFromWithPermit というメソッドが提案されました。この方法では、事前に署名し、後で検証することにより、承認をスワップに統合して「ワンステップ」で行うことができます。
しかし、もし私が承認した後にそのトークンを使用しなかった場合、署名が盗まれた場合にどうなるでしょうか?悪用される可能性はありませんか?
EIP-1153 によって、一時的な承認(temporary approve)が可能になります。つまり、トランザクションが開始されるときに承認し、一連の操作を経て、それらのトークンが使用されたかどうかに関係なく、最終的に元に戻されます。これにより、セキュリティが向上します。
この機能に対応するために、将来的には新しい ERC-20 拡張が提供される予定であり、AA アカウントの抽象化にも一定の助けとなるでしょう。