Uniswap
在批量多發送/多呼叫中訂購交易
我了解到您可以使用 multisend/multicall 之類的合約將多筆交易批處理為一筆交易。這對於大型空投之類的事情很有用。
但是,如果我們需要對交易進行排序怎麼辦?例如。Trx 1 - 批准 contractA 使用我的代幣。Trx 2 - 讓 contractA 使用我的代幣。
以上需要訂購..但我不確定如果兩個呼叫在一個塊中合併到一個事務中如何完成?
知道這將如何工作嗎?是隨機的嗎?或者,如果我們將 trx1 的 calldata 放在 trx2 之前,它會以某種方式工作嗎?
如果您查看Gnosis-Safe 的 MultiSend 合約,您會注意到您決定了執行“子”交易的順序。
您需要像這樣對要批量處理的每個事務進行編碼。
對於一個
approve(...)
:
- (1)操作(1 個字節):要麼
0x00
(對於呼叫)要麼0x01
(對於委託呼叫)- (2) to (20 bytes) : 交易的目標地址 (eg:
0x6b175474e89094c44da98b954eedeac495271d0f
)- (3) data_length (32 bytes) : 下一個欄位的長度
data
(例如:如果 的長度data
是 68 字節,那就是0x0000000000000000000000000000000000000000000000000000000000000044
)- (4) data (<data_length> bytes) : 根據合約執行函式的字節程式碼
to
(例如:對於批准呼叫,那將是0x095ea7b300000000000000000000000068b34cc833fb72a70ecdfaa5e0e4c7bd86bbfc45ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
)這意味著您的第一個編碼子交易將如下所示
0x00dafea492d9c6733ae3d56b7ed1adb60692c98bc5000000000000000000000000000000000000000000000000000000000000003A0x095ea7b300000000000000000000000068b34cc833fb72a70ecdfaa5e0e4c7bd86bbfc45ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
對您要包含的下一個子事務重複此步驟。
對於一個
transfer(...)
:
- (1)操作(1 個字節):要麼
0x00
(對於呼叫)要麼0x01
(對於委託呼叫)- (2) to (20 bytes) : 交易的目標地址 (eg:
0x6b175474e89094c44da98b954eedeac495271d0f
)- (3) data_length (32 bytes) : 下一個欄位的長度
data
(例如:如果 的長度data
是 68 字節,那就是0x0000000000000000000000000000000000000000000000000000000000000044
)- (4) data (<data_length> bytes) : 根據合約執行函式的字節程式碼
to
(例如:對於批准呼叫,那將是0xa9059cbb000000000000000000000000823e309b1a730f8aa6b0ae7f9165abbf8b1950ae00000000000000000000000000000000000000000000003635c9ad45dea00000
)這給你一個編碼版本等於
0x006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000044 a9059cbb000000000000000000000000823e309b1a730f8aa6b0ae7f9165abbf8b1950ae00000000000000000000000000000000000000000000003635c9ad45dea00000
如果您想將兩者一起批處理,只需將其連接起來(在一行中):
0x 00dafea492d9c6733ae3d56b7ed1adb60692c98bc5000000000000000000000000000000000000000000000000000000000000003A0x095ea7b300000000000000000000000068b34cc833fb72a70ecdfaa5e0e4c7bd86bbfc45ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000000000000000000044a9059cbb000000000000000000000000823e309b1a730f8aa6b0ae7f9165abbf8b1950ae00000000000000000000000000000000000000000000003635c9ad45dea00000
最後,這是
bytes transactions
您需要傳遞給函式multiSend
以同時執行多個事務的參數。順序與上面的邏輯相同