Woher kommt Gas, wenn ich einen neuen Vertrag in einem Vertrag erstelle [Duplikat]

Angenommen, ich erstelle einen Vertrag aus einem anderen Vertrag, indem ich eine Funktion in einem übergeordneten Vertrag aufrufe. Ist das zum Erstellen eines neuen Vertrags erforderliche Gas in der Ausführung der Funktion enthalten, die einen neuen Vertrag erstellt?

pragma solidity ^0.4.15;

contract Test {
    bool public active = true;
    address public owner;
    address public contract_address;

    uint public amountReceived;

    address[] public activeContracts;
    uint256 public gasLeft;

    function () payable {
        amountReceived = msg.value;
        gasLeft = msg.gas;
    }

    function Test() {
        owner = msg.sender;
        contract_address = this;
        gasLeft = msg.gas;
    }

    function updateStatus() {
        active = false;
    }

    function kill() {
        selfdestruct(owner);
        gasLeft = msg.gas;
    }

    function createSubContract() {
        address newContractAddress = new SubTest();
        activeContracts.push(newContractAddress);
        gasLeft = msg.gas;
    }
}

contract SubTest {

    address public owner;
    address public contract_address;

    uint256 public amountReceived;
    uint256 public gasLeft;

    function () payable {
        amountReceived = msg.value;
        gasLeft = msg.gas;
    }

    function SubTest() {
        owner = msg.sender;
        contract_address = this;
        gasLeft = msg.gas;
    }

    function kill() {
        selfdestruct(owner);
        gasLeft = msg.gas;
    }

}

Hier ist ein Mustervertrag, den ich teste. Um einen Untervertrag zu erstellen, rufe ich die Funktion createSubContract auf. Enthält das zum Aufrufen dieser Funktion erforderliche Gas das zum Erstellen des Vertrags erforderliche Gas?

Antworten (1)

Ja. Sie müssen darauf achten, Ihrem Funktionsaufruf genügend Gas zuzuweisen , um den gesamten Gasverbrauch aller nachfolgenden Anrufe createSubContract()abdecken zu können, die von stammen .createSubContract()

Obwohl diese Gaszuweisung zu Sub-Calls feiner abgestimmt werden kann, müssen Sie nicht das gesamte Gas Ihrer Transaktion an den Sub-Call weiterleiten, wie es hier erklärt wird :

Ein Vertrag kann entscheiden, wie viel von seinem verbleibenden Gas mit dem inneren Nachrichtenruf gesendet werden soll und wie viel er behalten möchte. Wenn im inneren Aufruf (oder irgendeiner anderen Ausnahme) eine Aus-dem-Gas-Ausnahme auftritt, wird dies durch einen Fehlerwert signalisiert, der auf den Stack gelegt wird. In diesem Fall wird nur das mit dem Anruf mitgeschickte Gas verbraucht. In Solidity verursacht der aufrufende Vertrag in solchen Situationen standardmäßig eine manuelle Ausnahme, sodass Ausnahmen den Aufrufstapel „aufblasen“.

In Zukunft wird der Metropolis-Hardfork Verträge zur Bezahlung von Gas ermöglichen. Sehen Sie sich hier den Abschnitt EIP 86 (Account Security Abstraction) an .