Contract-Invocation

我可以將委託呼叫與目標合約的儲存一起使用嗎?

  • October 5, 2021

場景如下:我想要一個合約 A,它允許我使用目標合約的儲存和程式碼呼叫其他合約的函式,每次都不同。本質上,我想使用目標合約但不直接與其互動,而是讓合約 A 為我與之互動。這是委託呼叫可以實現的,還是總是使用合約 A 儲存?如果 delegatecall 不是合適的函式,可以用什麼代替?謝謝。

  1. 如果您希望合約 A 呼叫合約 B 的函式並使用合約 B 的儲存,那隻是呼叫合約 B 上的函式。它沒有什麼花哨的,因為這是合約互動的基礎。在底層,Solidity 編譯器將你的函式呼叫轉換為CALL.
  2. 現在,如果您要做的是呼叫合約 B 的函式並使用合約 B 的儲存防止對 B 的儲存進行任何潛在的更改,我相信您需要使用STATICCALL. 不幸的是,Solidity 沒有提供一種輕鬆編寫它的方法。

你想做的是哪一個?

編輯:你想要案例 2。這是一個可以做你想做的快速功能

function doStatic(address target, bytes memory dataIn, uint256 outSize) public view returns(bytes memory dataOut) {
   uint256 gasToSend = gasleft() - 50 * outSize;
   uint256 dataLength = dataIn.length;
   bool success;
   assembly {
       success := staticcall(gasToSend, target, dataIn, dataLength, dataOut, outSize)
   }
   require(success);
}

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