Contract-Development
我可以將 int32 添加到 int256 嗎?
我試圖通過減少儲存我的 int 數據類型(除其他外)所需的字節來減少我的契約的儲存大小。
我可以獲得添加
int256
和其他較小 int 數據類型(即int32
)的最佳實踐嗎?我可以添加它們嗎?我需要做一些轉換嗎?這只是一個壞主意嗎?謝謝。
這是可能的,但不建議這樣做。如果你這樣做,你應該強制
int32
轉換為 anint256
以便明確。int32 a = 1; int256 b = 3; int256 c = int256(a) + b;
但是,使用小於 32 字節的類型實際上可能比使用 32 字節的類型(例如
int256
、uint256
等)更昂貴。這樣做的原因是 EVM需要32 個字節,如果它想要在更少的內容上進行操作,則必須執行額外的操作。從文件:
當使用小於 32 字節的元素時,您的合約的 gas 使用量可能會更高。這是因為 EVM 一次執行 32 個字節。因此,如果元素小於這個值,EVM 必須使用更多的操作才能將元素的大小從 32 字節減少到所需的大小。
只有在處理儲存值時才使用減小大小的參數是有益的,因為編譯器會將多個元素打包到一個儲存槽中,從而將多個讀取或寫入組合到一個操作中。在處理函式參數或記憶體值時,沒有固有的好處,因為編譯器不會打包這些值。
最後,為了讓 EVM 對此進行優化,請確保您嘗試對儲存變數和結構成員進行排序,以便它們可以緊密打包。例如,按照 uint128、uint128、uint256 的順序聲明儲存變數,而不是 uint128、uint256、uint128,因為前者只佔用兩個儲存槽,而後者將佔用三個。