理由#
AAVE は最近、金利を更新するガバナンスを通過させましたが、その結果、Polygon 上の BTC、ETH、USDT、MATIC のプールが凍結され、1.1 億ドルの資金に影響を与えました。詳細は以下をご覧ください:BlockSec のツイート、技術分析、公式声明
公式は、修正はガバナンス投票を通じてのみ行えると主張しており、少なくとも 7 日間待たなければならず、emergencyAdmin 権限を使用するつもりはないとしています。
そのため、AAVE のクロスチェーンガバナンスがどのように行われているのか、技術的にはどのように実現されているのか、実際に 7 日間待つ必要があるのか、自然に疑問が生じます。
提案の提出から実行までの全プロセス#
今回問題が発生した提案 224 を例に、この提案の全体のタイムラインを見てみましょう。
1. 2023/4/22 フォーラムでの議論#
2. 2023/4/29~2023/5/6 スナップショットのオフチェーン投票#
2023/4/29 開始、2023/5/6 終了
合計 15854 人が投票に参加し、574K AAVE が賛成(99.93%)
3. 2023/5/10 ペイロード契約のデプロイ#
今回の提案は、ETH チェーンと Polygon チェーンの金利モデルを同時に変更しました。
2023/5/10 に ETH 上にペイロード契約 0x24bdacf6bbebaf567123da16cdb79a266597e92b をデプロイし、その中で新しい金利契約が含まれています。例えば、USDT の金利契約 は 2023/5/8 にデプロイされました。
2023/5/10 に Polygon 上にペイロード契約0xF22c8255eA615b3Da6CA5CF5aeCc8956bfF07Aa8 をデプロイし、その中で新しい金利契約が含まれています。例えば、USDT の金利契約 は 2023/5/7 にデプロイされました。
4. 2023/5/11 オンチェーン提案の提出#
今回のオンチェーン提案はマルチシグウォレットによって提出されました。
https://etherscan.io/tx/0x05152e33582d861b7047254680588b249783be8d680936423f91bb90a74717cf#eventlog
提案提出のブロック高は 17240283、投票開始高は 17247483(7200 ブロックの間隔)、終了高は 17266683(投票期間中 19200 ブロック)
Executor は0xEE56e2B3D491590B5b31738cC34d5232F378a8D5 で、この Executor は実際には AAVE のグローバル admin 契約です。
提案が実行することは 2 つです:
- delegatecall を使用して ETH 上のペイロード契約 0x24db...e92b の
execute()
- delegatecall を使用して ETH 上の CrosschainForwarderPolygon 契約 0x158a...d45b の
execute(0xF22C8255EA615B3DA6CA5CF5AECC8956BFF07AA8)
を実行し、Polygon で実行する必要があるペイロード契約のアドレスをパラメータとして渡します。
5. 2023/5/11 ~ 2023/5/15 オンチェーン投票#
https://app.aave.com/governance/proposal/?proposalId=224
投票が通過するために満たすべき条件:
- クォーラム 320K
- 差異 80K
合計 11 のアドレスが投票を完了しました。例えば、aavechan.eth の投票取引。
6. 2023/5/15 ETH チェーン上での実行待機#
投票終了後、queue(224)
を呼び出して提案を投票成功状態から Queued 状態に変更する必要があります:
https://etherscan.io/tx/0x7dbfef2616f1efa17328d4bfe97b7bfd7e72f05d9f413c64a3c934278f54d242
この取引は ChainLink Keeper によってトリガーされ、その後、1684280195 の時間が経過した後にオンチェーンで実行できます。
また、grace period の概念もあり、提案が実行可能でも grace period(432000 秒 = 5 日)を超えても実行されない場合は expired 状態に入り、提案は期限切れとなり実行できなくなります。
7. 2023/5/17 ETH チェーン上での実行#
提案実行の取引: https://etherscan.io/tx/0xe0e0ab8f7524f0165e6cb1182db18cf3ffe1c4f7cb57f335b40a322d8026de3f タイムスタンプ 1684284539
これも ChainLink Keeper によってトリガーされ、EthRobotKeeper が Goverance 契約のexecute(224)
を呼び出します。
その後、Executor.executeTransaction が delegatecall を使用してペイロード契約を呼び出します。
Executor 契約はグローバル admin ですので、この方法で任意の操作を実行できることになります。
ETH 上での実行のメッセージはどのように Polygon 上に伝達されるのでしょうか?これには Polygon 公式ブリッジを使用します。
CrosschainForwarderPolygon は Executor によって delegatecall の方法で呼び出され、Polygon 公式ブリッジ FX_ROOT_ADDRESS = 0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2 を呼び出し、メッセージを Polygon のターゲット契約 POLYGON_BRIDGE_EXECUTOR = 0xdc9A35B16DB4e126cFeDC41322b3a36454B1F772 に伝達します。
したがって、Polygon 公式ブリッジから見ると、メッセージの送信者は依然として Executor のアドレス 0xee56...a8d5 という admin アドレスです。
Polygon 公式ブリッジ契約がこの呼び出しを受け取ると、StateSynced(counter, receiver, data)
イベントを発生させます。ここで、counter はグローバルインクリメントカウンター、receiver は固定の fxChild、data は(msg.sender, _receiver, _data)
の abi エンコードです。ここでのインスタンスは:
data を abi デコードすると、次のようになります:
msg.sender = 0xee56e2b3d491590b5b31738cc34d5232f378a8d5
receiver = 0xdc9a35b16db4e126cfedc41322b3a36454b1f772
data = 00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f22c8255ea615b3da6ca5cf5aecc8956bff07aa800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000009657865637574652829000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
この長い data は何のためにあるのでしょうか。
8. 2023/5/17 Polygon チェーン上でのメッセージ受信#
Polygon 公式ブリッジは0x0000000000000000000000000000000000001001
アドレスの身分で FxChild 契約 0x8397259c983751DAf40400790063935a11afa28a を呼び出し、その後 receiver のprocessMessageFromRoot(stateId, rootMessageSender, data)
関数を呼び出します。
https://polygonscan.com/tx/0x52ed6243fc44b0b3999685020ca4b7b42c2629582194789a25792c044743dd59
この取引は Polygon システム取引で、sender と to は両方とも 0 アドレスであり、他の無関係なクロスチェーン取引も含まれています。
タイムスタンプ 1684285952 では、このクロスチェーンメッセージの伝達に 23 分かかったことがわかります。かなり早いです。
メッセージを受け取った後、receiver PolygonBridgeExecutor 0xdc9a...f772 の processMessageFromRoot 関数に入ります。この関数は、msg.sender がクロスチェーンブリッジ FxChild であること、メッセージの送信元が_fxRootSender、つまり ETH 上の admin 契約であることを検証します。
data は実際には targets、values、signatures、alldatas、withDelegates の 5 つの配列の abi エンコードであることがわかります。したがって、デコードすると次のようになります:
targets: (('0xf22c8255ea615b3da6ca5cf5aecc8956bff07aa8',)
values: (0,)
signatures: ('execute()',)
calldatas: (b'',)
withDelegatecalls: (True,)
ここでの targets はペイロード契約です。
メッセージを受け取った後、すぐに実行されるわけではなく、172800=2 日の遅延待機期間があります。同様に、3 日の GracePeriod もあります。
9. 2023/5/19 Polygon チェーン上での実行#
https://polygonscan.com/tx/0x6172ae452fb2c6abab7aef013e33cf899e3de09e4933433eeeae5fa41be46457
これも ChainLink Keeper によってトリガーされ、PolygonBridgeExecutor が delegatecall の方法でペイロード契約を実行し、パラメータの変更を完了します。
したがって、全体のプロセスは確かに 7 日間を要します:
ガバナンスの時間を考慮すると、承認されれば、修正は今から約 7 日後に適用されます:
- 投票開始までの 1 日の遅延、
- 3 日の投票、
- ETH 上での 1 日のタイムロック
- そして Polygon 上での 2 日の追加タイムロック。