El gas no es suficiente y no puede ejecutar funciones

Soy un recién llegado a Ethereum y estoy escribiendo un contrato inteligente para mi proyecto. Usé Win 10 y Mist 0.8.8 con la red de prueba que comenzaba con "R".

El código del contrato tiene las funciones de cambiar el estado y algunos modificadores, sin embargo, después de iniciar el contrato, no puedo ejecutar ninguna función del mismo. Aparecen los siguientes errores. ¡¡¡Muchas gracias!!!

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

El código del contrato se muestra a continuación: ¡Muchas gracias!

pragma solidity ^0.4.6;
contract FairTrade {

    /* Variables */
    address public creater;
    address public trader;
    address public framer;
    address public preieumHandler;

    /* State handling */
    enum State { Paying, Transporting, Received, Completed }
    State public state;

    /* Contructor */
    function FairTrade(address _trader, address _framer, address _preieumHandler,
      uint _price, uint _quantity) {
        creater = msg.sender;
        trader = _trader;
        framer = _framer;
        preieumHandler = _preieumHandler;

    }

    /* Modifiers */    
    modifier onlyFramer {
        if (msg.sender != framer) throw ; else _;
    }

    modifier onlyTrader {
        if (msg.sender != trader) throw; else _;
    }

    modifier inState(State s) {
        if (state != s) throw; else _;
    }

    modifier notInState(State s) {
        if (state == s) throw; else _;
    }

    /* Functions */    
    function completedPaid() onlyTrader {
        state = State.Transporting;
    }    

    function receivedGood() inState(State.Transporting) onlyFramer {
        state = State.Received;
    }

    function paid() inState(State.Received) {
        state = State.Completed;
    }
}

Respuestas (1)

La Testnet tiene el nombre de Ropsten .

A partir de los datos sin procesar 0x295b4e17en su primera imagen, está intentando ejecutar la paid()función.

Revisé cada una de las firmas de función en la gethlínea de comando y la siguiente firma coincidió:

> web3.sha3("paid()").substring(0, 10)
"0x295b4e17"

Esta paid()función tiene el modificador inState(State.Received)y este modificador arrojará un error si la statevariable actual NO es State.Received.

La advertencia que se muestra se debe a que Mist simula la llamada que intenta ejecutar y ha determinado que la llamada paid()fallará porque la statevariable actual no está configurada en State.Received.

Para probar su funcionalidad, puede:

  1. Agregue otra(s) función(es) para mover su estado de flujo de trabajo a State.Received; o

  2. Elimina el inState(State.Received)modificador de la paid()función.

Sugeriría primero probar 2. arriba para que pueda determinar si puede ejecutar la paid()función con éxito. Una vez que haya confirmado que la paid()función sin el modificador se ejecuta con éxito, cree las otras funciones requeridas para mover su contrato cuando funcione statecon su modificador.State.Receivedpaid()



Actualizar respondiendo al comentario a continuación

P : ¿Debería usar uint como el tipo de variable para registrar cada envío?

A : uint(que es uint256) es adecuado para registrar el número de éteres.

P : Cuando envío 1 Ether al contrato, muestra 1000000000 wai en su lugar.

R : 1 ether es 1e18 o 1,000,000,000,000,000,000 weis. en geth:

> 1e18
1000000000000000000
> web3.fromWei(1e18,"ether")
"1"
> web3.toWei(1,"ether")
"1000000000000000000"

P : Finalmente, me gustaría aprender el cml para ejecutar el contrato. ¿Tienes algún enlace recomendado para mí?

R : Si cmlse refiere a la línea de comandos, es decir, usando la gethlínea de comandos, hay algunas guías paso a paso en:

También puede consultar la solidez del navegador: consulte ¿Cómo llamar a la función de biblioteca desde un contrato? => [error] El código de contrato no se pudo almacenar, verifique la cantidad de gas. indefinido para un ejemplo.

¡¡Oh Dios mío!! Muchas gracias, lo probaré una vez que tenga la computadora. ¿Puedo preguntarle cuál es el modificador pagadero en el contrato? He visto muchos contratos que tienen esta función para manejar la traducción. Alguien dijo que si no lo tenemos, una vez que lo tiremos, se consumirá toda la gasolina. Muchas gracias.
Cualquier función que esté marcada como pagadera, incluida la función predeterminada (consulte ethereum.stackexchange.com/a/9297/1268 ) puede recibir ethers enviados con la transacción que invoca la función. Se generará un error si envía éteres al llamar a una función que no está marcada como pagadera. Esto es para que pueda diseñar contratos en los que un usuario no pueda enviar ethers accidentalmente cuando no sea necesario.
Gracias de nuevo. Todo está funcionando bien. ¿Debo usar uintpara ser el tipo de variable para registrar ehter enviar? Cuando envío 1 Ether al contrato, muestra 1000000000 wai en su lugar. Finalmente, me gustaría aprender el cml para ejecutar el contrato. ¿Tienes algún enlace recomendado para mí? Muchas gracias.
Consulte la respuesta actualizada para responder a las preguntas en su comentario anterior.