Evm

evm opcode create 上的參數

  • July 7, 2020

為什麼使用 evm 操作碼創建合約的常用方法使用addand mload,例如:

bytes memory bytecode = hex"600580600c6000396000b800602a600052b8";
...
assembly {
   _address := create(0, add(bytecode, 0x20), mload(bytecode))
}

我不明白為什麼要添加0x20到初始位置以及為什麼mload(bytecodes)返回字節碼的大小。有人可以指點我相關的文件,我將不勝感激。

謝謝。

這是因為記憶體變數被視為來自solidity 彙編的指針——並且該指針指向變數在記憶體中的開始。Solidity中數組儲存在記憶體中的方式是前0x20(32)字節是數組中數據的長度,然後是實際數據,這就是為什麼add(bytecode, 0x20)需要獲取實際數據的開頭bytecode. 由於前 0x20 字節是數組mload(bytecode)的長度,因此獲取要儲存的字節碼的長度。

編輯:要完全理解這一點,您應該通讀 Solidity Docs 的Assembly以及Miscellaneous(主要是關於儲存/記憶體佈局的詳細資訊)部分

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