Откуда берется газ, когда я создаю новый Контракт в Контракте [дубликат]

Допустим, я создаю контракт из другого контракта, вызывая функцию в родительском контракте. Требуется ли газ для создания нового контракта, включенного в запуск функции, которая создает новый контракт?

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;
    }

}

Вот образец контракта, который я тестирую. Чтобы создать субконтракт, я вызываю функцию createSubContract. Включает ли газ, необходимый для вызова этой функции, газ, необходимый для создания контракта?

Ответы (1)

Да. Вы должны позаботиться о назначении достаточного количества газа для createSubContract()вызова функции, чтобы иметь возможность покрыть все использование газа всеми последующими вызовами, исходящими из createSubContract().

Хотя это назначение газа для дополнительных вызовов может быть выполнено более точным способом, то есть вам не нужно перенаправлять весь газ вашей транзакции на дополнительный вызов, как это объясняется здесь :

Контракт может решить, сколько оставшегося газа должно быть отправлено с вызовом внутреннего сообщения и сколько он хочет сохранить. Если во внутреннем вызове (или любом другом исключении) произойдет исключение из-за отсутствия газа, об этом будет сигнализировано значением ошибки, помещенным в стек. При этом расходуется только газ, отправленный вместе со звонком. В Solidity вызывающий контракт по умолчанию вызывает вручную исключение в таких ситуациях, так что исключения «пузырятся» в стеке вызовов.

В будущем хардфорк Metropolis позволит контрактам оплачивать газ. Ознакомьтесь с параграфом EIP 86 (абстракция безопасности учетной записи) .