Solidity

Solidity CALL 和 DELEGATECALL:消息和數據格式

  • November 22, 2018

我對 SolidityCALLDELEGATECALL. 我已經閱讀了一些相關主題(連結),但沒有找到我的疑問的答案。

1)通過直接呼叫函式(例如)或使用來執行CALLSolidity 合約中的函式有什麼區別?funct(arg1)``addressOfTheContract.call(bytes4(sha3("funct(uint256)")), _n)

DELEGATECALL2)通過直接呼叫函式(例如lib.funct(arg1))或使用來執行庫函式有什麼區別addressOfTheLibraryContract.delegatecall(bytes4(sha3("funct(uint256)")), _n)嗎?讓我們假設在這兩種情況下,庫都是import在契約開始時使用聲明導入的。

  1. 兩者都生成CALLDELEGATECALL生成具有相同交易格式的消息(nonce, to, value, …),除了gasPriceandgasLimit欄位?

4)最後,在每個節點上都進行CALLDELEGATECALL本地進行嗎?

  1. 如果您在契約中呼叫函式(“內部”呼叫),則會有所不同。內部函式呼叫是通過跳轉完成的,不需要實際的call操作碼。較長的形式等價於this.funct(arg1)
  2. 不,這應該是等價的。
  3. 不,CALL並且DElEGATECALL是 EVM 操作碼,就像SSTOREor一樣MUL。不會生成任何事務,所發生的只是程式碼執行。
  4. 探勘交易中發生的所有執行都發生在網路上的每個完整節點上。如果您在本地模擬事務,例如使用 web3 .call(不要與 solidity 混淆.call),那麼它僅在本地執行

我不是 100% 確定前兩個答案,所以請等待其他人的確認:

  1. 不,這些應該做同樣的事情。
  2. 不,這些應該做同樣的事情。
  3. 不,合約之間的呼叫根本不會創建交易。
  4. 這取決於。它們在其餘程式碼執行的任何地方執行。如果您進行交易,程式碼將在所有節點上執行。如果您用於eth_call呼叫視圖/純函式,則該函式僅在您正在與之交談的節點上本地執行。ACALLDELEGATECALL那是函式執行的一部分在同一個地方執行。

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