Solidity

任何人都可以幫助解釋 calldataload

  • March 7, 2019

在 Solidity 文件中,定義calldataload為:

calldataload(p) 從位置 p 開始呼叫數據(32 字節)

但我真的對所謂的數據感到困惑。是上一筆交易的呼叫數據還是目前呼叫的呼叫數據?

假設我們有一個智能合約,我們呼叫method1,然後呼叫method2包含帶有 的程序集calldataload。這會calldataload載入method2or的輸入method1嗎?

文件

calldata 是包含函式參數的特殊數據位置,僅可用於外部函式呼叫參數。

每個引用類型,即數組和結構,都有一個附加註釋,即“數據位置”,關於它的儲存位置。共有三個數據位置:記憶體、儲存和呼叫數據。calldata 只對外部合約函式的參數有效,該類型參數是必需的。Calldata 是儲存函式參數的不可修改、非持久性區域,其行為主要類似於記憶體。

簡而言之,calldata就是函式上事務的輸入數據。例如,如果您查看交易,您會看到calldata如下:

0x51d0eac4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f32833125eed6d3b7fbccdcf38139967d4034ba100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000011c37937e08000

假設我們有一個智能合約,我們呼叫 method1,然後呼叫包含帶有 calldataload 的程序集的 method2。這個calldataload會載入method2或method1的輸入嗎?

如果這兩個方法呼叫不同,那麼calldata每個事務的呼叫也會不同。calldatafor將只是該method1()方法的輸入參數(以上述格式),而calldataformethod2()將只是該方法的輸入參數。

*如果這兩個方法在合約上互動,*則在交易中呼叫的方法將是在calldata整個交易中使用並持續存在的方法。


編輯,基於flygoing的評論:

calldataload將根據呼叫幀載入不同的數據,並將持續到單個呼叫幀,但不會持續到下一個呼叫幀。例如,如果 EOA 呼叫函式 a oncontract Acontract A呼叫function bon contract B,則 calldataload 將不再載入 EOA 的呼叫數據,而是載入子呼叫幀中使用的數據。

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