Delegate Call
Es ist möglich, dass ein Smart Contract A einen anderen Smart Contract aufruft, diesen aber im eigenen Kontext (Speicherbereich) laufen lässt. Dies wird mittels Delegate Call gemacht.
Damit können Nutzer auf die Funktionen sehr umfangreicher Smart Contracts zugreifen, ohne diese jedes Mal neu deployen zu müssen. Zudem erleichtert es die Nutzerverwaltung.
Ein Delegate Call wird mit dem Befehl “delegatecall” durchgeführt. Wir erstellen zwei Contracts.
- den Logic-Contract: Dieser enthält die Programmlogik und soll durch andere Contracts aufgerufen werden können.
- Caller-Contract: Auch Proxy-Contract genannt. Dieser ist der Einstiegspunkt für den Nutzer. Im Hintergrund leitet er den Aufruf an den Logic-Contract weiter. Die Ausführung fiondet aber im Context des Proxy-Contracts statt.
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
// NOTE: Deploy this contract first
contract LogicContract {
// NOTE: storage layout must be the same as contract CallerContract
uint256 public num;
address public sender;
uint256 public value;
function setVars(uint256 _num) public payable {
num = _num + 1;
sender = msg.sender;
value = msg.value;
}
}
contract CallerContract {
uint256 public num;
address public sender;
uint256 public value;
function setVars(address _contract, uint256 _num) public payable {
// A's storage is set, LogicContract is not modified.
(bool success, bytes memory data) = _contract.delegatecall(
abi.encodeWithSignature("setVars(uint256)", _num)
);
}
}
Den Beispiel-Code finden Sie in der Datei contract_s2_10.sol.
Aufgabe
- Deployen Sie beide Smart Contracts.
- Wie viel Gas hat das Deployen jedes einzelnen Smart Contracts gekostet?
- Führen Sie den CallerContract aus und prüfen Sie, welche Variable sich geändert hat.