任何人都可以幫助解釋 calldataload
在 Solidity 文件中,定義
calldataload
為:calldataload(p) 從位置 p 開始呼叫數據(32 字節)
但我真的對所謂的數據感到困惑。是上一筆交易的呼叫數據還是目前呼叫的呼叫數據?
假設我們有一個智能合約,我們呼叫
method1
,然後呼叫method2
包含帶有 的程序集calldataload
。這會calldataload
載入method2
or的輸入method1
嗎?
從文件:
calldata 是包含函式參數的特殊數據位置,僅可用於外部函式呼叫參數。
每個引用類型,即數組和結構,都有一個附加註釋,即“數據位置”,關於它的儲存位置。共有三個數據位置:記憶體、儲存和呼叫數據。calldata 只對外部合約函式的參數有效,該類型參數是必需的。Calldata 是儲存函式參數的不可修改、非持久性區域,其行為主要類似於記憶體。
簡而言之,
calldata
就是函式上事務的輸入數據。例如,如果您查看此交易,您會看到calldata
如下:
0x51d0eac4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f32833125eed6d3b7fbccdcf38139967d4034ba100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000011c37937e08000
假設我們有一個智能合約,我們呼叫 method1,然後呼叫包含帶有 calldataload 的程序集的 method2。這個calldataload會載入method2或method1的輸入嗎?
如果這兩個方法呼叫不同,那麼
calldata
每個事務的呼叫也會不同。calldata
for將只是該method1()
方法的輸入參數(以上述格式),而calldata
formethod2()
將只是該方法的輸入參數。*如果這兩個方法在合約上互動,*則在交易中呼叫的方法將是在
calldata
整個交易中使用並持續存在的方法。編輯,基於flygoing的評論:
calldataload
將根據呼叫幀載入不同的數據,並將持續到單個呼叫幀,但不會持續到下一個呼叫幀。例如,如果 EOA 呼叫函式 a oncontract A
和contract A
呼叫function b
oncontract B
,則 calldataload 將不再載入 EOA 的呼叫數據,而是載入子呼叫幀中使用的數據。