Contract-Development

我可以將 int32 添加到 int256 嗎?

  • December 4, 2019

我試圖通過減少儲存我的 int 數據類型(除其他外)所需的字節來減少我的契約的儲存大小。

我可以獲得添加int256和其他較小 int 數據類型(即int32)的最佳實踐嗎?我可以添加它們嗎?我需要做一些轉換嗎?這只是一個壞主意嗎?謝謝。

這是可能的,但不建議這樣做。如果你這樣做,你應該強制int32轉換為 anint256以便明確。

int32  a = 1;
int256 b = 3;
int256 c = int256(a) + b;

但是,使用小於 32 字節的類型實際上可能比使用 32 字節的類型(例如int256uint256等)更昂貴。這樣做的原因是 EVM需要32 個字節,如果它想要在更少的內容上進行操作,則必須執行額外的操作。

文件

當使用小於 32 字節的元素時,您的合約的 gas 使用量可能會更高。這是因為 EVM 一次執行 32 個字節。因此,如果元素小於這個值,EVM 必須使用更多的操作才能將元素的大小從 32 字節減少到所需的大小。

只有在處理儲存值時才使用減小大小的參數是有益的,因為編譯器會將多個元素打包到一個儲存槽中,從而將多個讀取或寫入組合到一個操作中。在處理函式參數或記憶體值時,沒有固有的好處,因為編譯器不會打包這些值。

最後,為了讓 EVM 對此進行優化,請確保您嘗試對儲存變數和結構成員進行排序,以便它們可以緊密打包。例如,按照 uint128、uint128、uint256 的順序聲明儲存變數,而不是 uint128、uint256、uint128,因為前者只佔用兩個儲存槽,而後者將佔用三個。

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