Solidity
在將程序集寫入哪個記憶體地址時,我應該開始寫入?
您應該何時開始寫入記憶體地址 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))
我希望這回答了你的問題。