Solidity

在將程序集寫入哪個記憶體地址時,我應該開始寫入?

  • July 14, 2022

您應該何時開始寫入記憶體地址 mstore(0x40, x) 以及何時開始寫入 mstore(0x80, x)?

我見過的一些契約,例如這個https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol

他們使用 0x40 記憶體地址,但其他人使用 0x80。

有什麼區別,我應該使用哪一個?

非常感謝,希望問題很清楚。

如果你問這個問題,你可能應該寫在返回的地址mload(0x40),你可以在文件中閱讀更多關於solidity記憶體佈局的資訊

這就是您連結的程式碼正在執行的操作:

// Get a pointer to some free memory.
let freeMemoryPointer := mload(0x40)

// Write the abi-encoded calldata into memory, beginning with the function selector.
mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)

直接寫入0x80或任何其他固定地址是一種可能的優化(因為不要為mload(0x40)指令支付額外的氣體),如果您:

  • 知道這是目前值memory[0x40]0x80是儲存在的初始值0x40
  • 不關心覆蓋分配記憶體/尊重可靠記憶體模型。(代理例如通過從 address 開始寫入任意數量的數據來做到這一點0x00

在任何情況下,如果您打算返回/使用任何分配的記憶體空間,請確保通過遞增空閒記憶體指針將該記憶體標記為已分配:

// Allocate 32 bytes of memory by :
// taking the value of the free memory pointer : mload(0x40)
// incrementing it by 0x20 (32) : add(mload(0x40), 0x20)
// writing the resulting value to 0x40 : mstore(0x40, ...)
mstore(0x40, add(mload(0x40), 0x20))

我希望這回答了你的問題。

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