Solidity
Solidity CALL 和 DELEGATECALL:消息和數據格式
我對 Solidity
CALL
和DELEGATECALL
. 我已經閱讀了一些相關主題(連結),但沒有找到我的疑問的答案。1)通過直接呼叫函式(例如)或使用來執行
CALL
Solidity 合約中的函式有什麼區別?funct(arg1)``addressOfTheContract.call(bytes4(sha3("funct(uint256)")), _n)
DELEGATECALL
2)通過直接呼叫函式(例如lib.funct(arg1)
)或使用來執行庫函式有什麼區別addressOfTheLibraryContract.delegatecall(bytes4(sha3("funct(uint256)")), _n)
嗎?讓我們假設在這兩種情況下,庫都是import
在契約開始時使用聲明導入的。
- 兩者都生成
CALL
並DELEGATECALL
生成具有相同交易格式的消息(nonce
,to
,value
, …),除了gasPrice
andgasLimit
欄位?4)最後,在每個節點上都進行
CALL
並DELEGATECALL
在本地進行嗎?
- 如果您在契約中呼叫函式(“內部”呼叫),則會有所不同。內部函式呼叫是通過跳轉完成的,不需要實際的
call
操作碼。較長的形式等價於this.funct(arg1)
- 不,這應該是等價的。
- 不,
CALL
並且DElEGATECALL
是 EVM 操作碼,就像SSTORE
or一樣MUL
。不會生成任何事務,所發生的只是程式碼執行。- 探勘交易中發生的所有執行都發生在網路上的每個完整節點上。如果您在本地模擬事務,例如使用 web3
.call
(不要與 solidity 混淆.call
),那麼它僅在本地執行
我不是 100% 確定前兩個答案,所以請等待其他人的確認:
- 不,這些應該做同樣的事情。
- 不,這些應該做同樣的事情。
- 不,合約之間的呼叫根本不會創建交易。
- 這取決於。它們在其餘程式碼執行的任何地方執行。如果您進行交易,程式碼將在所有節點上執行。如果您用於
eth_call
呼叫視圖/純函式,則該函式僅在您正在與之交談的節點上本地執行。ACALL
或DELEGATECALL
那是函式執行的一部分在同一個地方執行。