Solidity
calldata 可以在每個函式可見性中使用嗎?
- 當我一般看它時,到處都說 calldata 僅用於外部可見性,但我也可以在編寫契約時將它與 public 一起使用?因為當我使用public時,沒有問題。
- 總的來說,我發現合約中呼叫數據的使用較少。用的不多?
- calldata 是我們的 abi 編碼資訊,指定要呼叫到合約的函式和參數嗎?
- 根據我的第三個問題, msg.data 和 calldata 是否具有相同的含義?
calldata
通常只能與具有可見性的函式一起使用。但是,只要您使用參數呼叫它external
,Solidity 將允許您聲明任何函式。這意味著這些參數的來源需要直接或間接地來自消息呼叫數據(即通過前向參數傳遞)。calldata``calldata``calldata
calldata
可以有用!它通過將消息呼叫數據的副本跳過到記憶體中來幫助降低氣體消耗。- 恰恰!:)
- 是的!
msg.data
是與 EVM 中的 calldata 概念等效的 Solidity。Solidity 關鍵字
calldata
告訴編譯器您想直接使用來自消息呼叫數據(即msg.data
)的值,而不是將其複製到記憶體(或更糟的是,儲存)並花費額外的氣體。calldata 的概念遠遠超出了作為 EVM 術語的 Solidity。
以下是OpenZeppelin 部落格文章的有用摘錄:
calldata 是一個只讀的字節可定址空間,其中保存了事務或呼叫的數據參數。與堆棧不同,要使用此數據,您必須指定確切的字節偏移量和要讀取的字節數。EVM 提供的用於操作 calldata 的操作碼包括:
- CALLDATASIZE 告訴事務數據的大小。
- CALLDATALOAD 將 32 字節的交易數據載入到堆棧中。
- CALLDATACOPY 將交易數據的多個字節複製到記憶體中。