Contract-Invocation
我可以將委託呼叫與目標合約的儲存一起使用嗎?
場景如下:我想要一個合約 A,它允許我使用目標合約的儲存和程式碼呼叫其他合約的函式,每次都不同。本質上,我想使用目標合約但不直接與其互動,而是讓合約 A 為我與之互動。這是委託呼叫可以實現的,還是總是使用合約 A 儲存?如果 delegatecall 不是合適的函式,可以用什麼代替?謝謝。
- 如果您希望合約 A 呼叫合約 B 的函式並使用合約 B 的儲存,那隻是呼叫合約 B 上的函式。它沒有什麼花哨的,因為這是合約互動的基礎。在底層,Solidity 編譯器將你的函式呼叫轉換為
CALL
.- 現在,如果您要做的是呼叫合約 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); }