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 pay
los paga a cualquier dirección. Pero cuando conecto Remix a la ejecución local testrpc
o a Rinkeby
la red, este contrato falla en línea con transfer
una llamada con error transact to Test.pay errored: VM Exception while processing transaction: out of gas
.
Traté de reemplazar transfer
con send
sin 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?
out of gas
el error a veces significa que no hay suficiente gasolina para completar la transacción.
Mientras que antes de la introducción del error de REVERT
código de operación out of gas
podía aparecer en caso de un lanzamiento ya que consumía todo el gas, con REVERT
este error es más confiable y puede asumir con alta probabilidad que es una excepción real out of gas
y no alguna otra.
Intente aumentar el límite de gas para su transacción y vea si funciona.
medvedev1088
ismael
msg.sender
un 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 bajocall
, asírequire(msg.sender.call.value(_amount).gas(_gas)());
alex gp
alex gp
medvedev1088
alex gp
32144
. Para la segunda función de contrato,pay
funciona con el mismo límite de gas, por lo que no está relacionado con el problema.medvedev1088
alex gp
alex gp
medvedev1088
alex gp
Máximo
truffle console
. Me funciona con el mismo problema.