2023 年 6 月、Uniswap 公式のブログが、暗号通貨界全体の注目を集めました。Uniswap-v3 のリリースから 2 年後、v4 が登場するのです!
大幅なガスの最適化と新しいフックの仕組みにより、Uniswap は Dex 領域でのトップの地位をさらに強固にしました。
しかし、筆者がこの記事を書いている 10 月までにはまだリリースされていません。なぜでしょうか?
それは、次のアップグレード(カンクンアップグレード)で導入される新しいバイトコードが必要だからです。具体的には、EIP-1153です。
EIP-1153 は何をするのか#
公式の説明によると、
トランザクションごとに破棄されるが、ストレージと同じように振る舞う状態を操作するためのオペコードを追加します。
現在、スマートコントラクトでは、変数は通常、storage
とmemory
の 2 つの場所に保存されます。
storage
で修飾された変数は永続的にチェーン上に保存され、SSTORE
とSLOAD
という 2 つのオペコードが関連しており、ガスの消費が非常に大きいです。
memory
は、関数内で一時的に宣言される変数であり、使用後(関数の実行が終了すると)解放されます。ガスの消費は少ないですが、関数内でのみ可視です。
これらの 2 つの中間的なものが実現されるのが、実際に 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 によって、一時的な承認が可能になります。つまり、トランザクションが開始されるときに承認し、一連の操作を経て、そのトークンが使用されたかどうかに関係なく最終的に元に戻すことができます。これにより、セキュリティが向上します。
この機能に対応するために、将来的には新しい ERC-20 拡張が提供される予定であり、AA アカウントの抽象化にも一定の助けとなるでしょう。