Solidity

在solidity中拆解“刪除數組”

  • September 12, 2021

我正在嘗試了解 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。這段程式碼在做什麼?為什麼叫CALLDATASIZEand CALLDATACOPY?為什麼它會製造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

但是,這似乎是無用的行為。

我認為程式碼應該SUBSWAP1添加後使用,而不是ADD在這種情況下。或者,如果一般情況下不能,那麼什麼也不做。對這種行為沒有任何線索。

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