De donde sale el gas cuando creo un nuevo Contrato en un Contrato [duplicar]

Digamos que estoy creando un contrato a partir de otro contrato llamando a una función en un contrato principal, ¿el gas requerido para crear un nuevo contrato está incluido en la ejecución de la función que crea un nuevo contrato?

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

}

Aquí hay un contrato de muestra que estoy probando. Para crear un subcontrato llamo a la función createSubContract, ¿el gas requerido para llamar a esta función incluye el gas requerido para crear el contrato?

Respuestas (1)

Sí. Debe encargarse de asignar suficiente gas a su createSubContract()llamada de función para poder cubrir todo el uso de gas de todas las llamadas posteriores originadas desde createSubContract().

Aunque esta asignación de gas a las subllamadas se puede hacer de una manera más precisa, es decir, no tiene que transferir todo el gas de su transacción a la subllamada como se explica aquí :

Un contrato puede decidir cuánto de su gas restante debe enviarse con la llamada de mensaje interno y cuánto quiere retener. Si ocurre una excepción de falta de gas en la llamada interna (o cualquier otra excepción), esto se señalará con un valor de error colocado en la pila. En este caso, solo se consume el gas enviado junto con la llamada. En Solidity, el contrato de llamada provoca una excepción manual de forma predeterminada en tales situaciones, de modo que las excepciones "aumentan" la pila de llamadas.

En el futuro, la bifurcación dura de Metropolis permitirá contratos para pagar el gas. Consulte aquí el párrafo EIP 86 (abstracción de seguridad de la cuenta) .