Solidity
在solidity中拆解“刪除數組”
我正在嘗試了解 EVM 字節程式碼,但遇到了這個問題。首先,這是solidity程式碼
pragma solidity ^0.8.0; contract Assembly { function f() public { uint8[3] memory a = [1, 2, 3]; delete a; } }
我只是想知道引擎蓋下發生了什麼。對於數組初始化部分,我可以理解。我無法理解的是
delete a
字節碼的一部分。我首先認為
delete
會將 arraya
的元素設為預設值,即零,但它看起來像這樣。// maybe delete a? 005D 5B JUMPDEST 005E 60 PUSH1 0x40 0060 51 MLOAD 0061 80 DUP1 0062 60 PUSH1 0x60 0064 01 ADD 0065 60 PUSH1 0x40 0067 52 MSTORE 0068 80 DUP1 0069 60 PUSH1 0x03 006B 90 SWAP1 006C 60 PUSH1 0x20 006E 82 DUP3 006F 02 MUL 0070 80 DUP1 0071 36 CALLDATASIZE 0072 83 DUP4 0073 37 CALLDATACOPY 0074 50 POP 0075 91 SWAP2 0076 92 SWAP3 0077 91 SWAP2 0078 50 POP 0079 50 POP 007A 56 *JUMP
像上面的solidity程式碼一樣,我在function中沒有任何calldata
f
。這段程式碼在做什麼?為什麼叫CALLDATASIZE
andCALLDATACOPY
?為什麼它會製造memory[0x40: 0x40 + 0x20] += 0x60
,而不僅僅是離開它?這是整個字節程式碼。
6080604052348015600f57600080fd5b506004361060285760003560e01c806326121ff014602d575b600080fd5b60336035565b005b6040805160608101825260018152600260208201526003918101919091526059605d565b5050565b6040518060600160405280600390602082028036833750919291505056fea264697066735822122054404abffe5e82bae9d564c6e7f48ba27772cdcba99b2066167c1c197e1c063964736f6c63430008040033
提前致謝!
我從黃皮書中發現,
CALLDATACOPY
如果記憶體索引大於或等於其第二個輸入值,則只需將 0 複製到記憶體中,在本例中為CALLDATASIZE
.所以這個字節碼所做的就是做
memory[0xe0: 0xe0 + 0x60] = 0
.(從0xe0
這個程式碼開始,uint8[3] memory a = [1, 2, 3];
,這使得memory[0x40: 0x60] = 0xe0
)但是,這似乎是無用的行為。
我認為程式碼應該
SUB
在SWAP1
添加後使用,而不是ADD
在這種情況下。或者,如果一般情況下不能,那麼什麼也不做。對這種行為沒有任何線索。