Uniswap

在批量多發送/多呼叫中訂購交易

  • October 6, 2022

我了解到您可以使用 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以同時執行多個事務的參數。

在此處輸入圖像描述

順序與上面的邏輯相同

引用自:https://ethereum.stackexchange.com/questions/136945