Solidity

calldata 可以在每個函式可見性中使用嗎?

  • March 6, 2022
  1. 當我一般看它時,到處都說 calldata 僅用於外部可見性,但我也可以在編寫契約時將它與 public 一起使用?因為當我使用public時,沒有問題。
  2. 總的來說,我發現合約中呼叫數據的使用較少。用的不多?
  3. calldata 是我們的 abi 編碼資訊,指定要呼叫到合約的函式和參數嗎?
  4. 根據我的第三個問題, msg.data 和 calldata 是否具有相同的含義?
  1. calldata通常只能與具有可見性的函式一起使用。但是,只要您使用參數呼叫它external,Solidity 將允許您聲明任何函式。這意味著這些參數的來源需要直接或間接地來自消息呼叫數據(即通過前向參數傳遞)。calldata``calldata``calldata
  2. calldata可以有用!它通過將消息呼叫數據的副本跳過到記憶體中來幫助降低氣體消耗。
  3. 恰恰!:)
  4. 是的!msg.data是與 EVM 中的 calldata 概念等效的 Solidity。

Solidity 關鍵字calldata告訴編譯器您想直接使用來自消息呼叫數據(即msg.data)的值,而不是將其複製到記憶體(或更糟的是,儲存)並花費額外的氣體。

calldata 的概念遠遠超出了作為 EVM 術語的 Solidity。

以下是OpenZeppelin 部落格文章的有用摘錄:

calldata 是一個只讀的字節可定址空間,其中保存了事務或呼叫的數據參數。與堆棧不同,要使用此數據,您必須指定確切的字節偏移量和要讀取的字節數。EVM 提供的用於操作 calldata 的操作碼包括:

  • CALLDATASIZE 告訴事務數據的大小。
  • CALLDATALOAD 將 32 字節的交易數據載入到堆棧中。
  • CALLDATACOPY 將交易數據的多個字節複製到記憶體中。

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