Solidity

Solidity Assembly 基本呼叫數據返回 4 個字節

  • July 10, 2021

我寫了一個小測試腳本來看看 callData 在混音中是如何工作的。該腳本如下所列:

contract Assem {
   uint256 public count;
   function callData() public pure returns(bytes4) {
       assembly {
           calldatacopy(0x0, 0, 4)
           return (0x0, 4)
       }
   }
}

程式碼拋出錯誤:

error: Failed to decode output: Error: data out-of-bounds (length=4, offset=32, code=BUFFER_OVERRUN, version=abi/5.1.2)

我對 return(0x0,32) 進行了更改,它似乎工作正常。

contract Assem {
   uint256 public count;
   function callData() public pure returns(bytes4) {
       assembly {
           calldatacopy(0x0, 0, 4)
           return (0x0, 32)
       }
   }
}

我不確定它為什麼以這種方式工作。我相信我只從callData複製了0~4個字節,怎麼會變成32個字節?

Remix 預計契約將遵循ABI 規範。在規範的一部分中,所有小於 32 字節的數據都必須填充到 32 字節。

合約實際上返回了 4 個字節,而 remix 不知道只用 4 個字節做什麼,因為它需要 32 個字節。它將通過刪除填充來修剪這 32 個字節。

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