Función de recuperación simple sin gasolina

Tengo un contrato muy básico como este:

pragma solidity ^0.4.15;

contract Test {
    function() public payable {
    }

    function pay(uint _amount) public returns (uint) {
        require(this.balance >= _amount);
        msg.sender.transfer(_amount);
    }
}

Una vez iniciado en Remix con JavascriptVM, funciona como se esperaba: la función de pago recibe éteres y paylos paga a cualquier dirección. Pero cuando conecto Remix a la ejecución local testrpco a Rinkebyla red, este contrato falla en línea con transferuna llamada con error transact to Test.pay errored: VM Exception while processing transaction: out of gas.

Traté de reemplazar transfercon sendsin suerte.

Por supuesto, estoy tratando de pagar menos del saldo actual del contrato (envié 10 ETH, tratando de pagar 5 ETH).

UPD:

Es muy extraño, pero casi el mismo contrato funciona:

contract Test {

    event Event(string _msg, address _address, uint _amount);

    function() public payable {
    }

    function pay(uint _amount) public returns (uint256) {
        require(this.balance >= _amount);

        _pay(msg.sender, _amount);
    }

    function _pay(address _to, uint _amount) private {
        _to.transfer(_amount);
        Event("Outcome", _to, _amount);
    }
}

¡PERO! Si elimino las menciones de Event, ¡deja de funcionar con el mismo error!

UPD2: Se vuelve más y más extraño. Si en contrato eso funciona lo quito returns (uint256)dejo de funcionar también. Estoy totalmente confues: ¿por qué el valor de retorno afecta el trabajo por contrato? ¿Por qué la lógica separada funciona y se fusiona en una sola función, no?

¿Cuál es el límite de gas que establece? ¿Tiene un enlace a la transacción en rinkeby?
es msg.senderun contrato? Al enviar ether a un contrato mediante transferencia, el gas está limitado a 2300 'gas estipendio' como medida de seguridad. Para permitir más gas tienes que usar el nivel bajo call, asírequire(msg.sender.call.value(_amount).gas(_gas)());
@medvedev1088 predeterminado para la transferencia del contrato.
@Ismael no, msg.sender es la dirección del usuario.
@AlexG.P. Me refiero al límite de gas que estableciste para la transacción.
@medvedev1088 32144. Para la segunda función de contrato, payfunciona con el mismo límite de gas, por lo que no está relacionado con el problema.
@AlexG.P. la función de transferencia cuesta 9700 por lo que puede ser que el límite de gas proporcionado no sea suficiente. ¿Tiene un enlace a la transacción en Rinkeby?
@medvedev1088 9700 < 37144
@AlexG.P. necesita agregar gas intrínseco y gas para los cálculos, podría estar muy cerca del límite de gas que estableció. Todas las transacciones en el enlace que proporcionó son exitosas.
@ medvedev1088 sí, ahora veo que todos los tx están bien pero, sin embargo, cuando este contrato se crea en la ejecución local de testrpc, falla. No tiene ningún cálculo/lógica adicional.
Es un error de Remix. Trate de usar truffle console. Me funciona con el mismo problema.

Respuestas (1)

out of gasel error a veces significa que no hay suficiente gasolina para completar la transacción.

Mientras que antes de la introducción del error de REVERTcódigo de operación out of gaspodía aparecer en caso de un lanzamiento ya que consumía todo el gas, con REVERTeste error es más confiable y puede asumir con alta probabilidad que es una excepción real out of gasy no alguna otra.

Intente aumentar el límite de gas para su transacción y vea si funciona.