ahora / block.timestamp no funciona en testrpc?

Tengo problemas con testrpc, o al menos creo que esa es la causa. Esta parte particular del código

if (now > info.deadline) {
    ended = true;
    refundEnabled = true;
    return false;
}

nunca se ejecuta, es como si now (o block.timestamp) fuera siempre menor que la fecha límite, incluso cuando claramente no lo es. La fecha límite está en la marca de tiempo de Unix (por ejemplo, 1487399645), pero ese código no se ejecuta incluso si pongo 1.

Aquí está el contrato:

pragma solidity ^0.4.6;

contract Project {

    struct projectInfo {
        address projectOwner;
        string name;
        uint256 amountToRaise;
        uint256 deadline;
    }

    projectInfo public info;
    uint256 public amountRaised;
    bool public ended;
    bool public refundEnabled;
    mapping(address => uint256) public contributions;

    function Project(string name, uint256 amountToRaise, uint256 deadline) {
        info = projectInfo(tx.origin, name, amountToRaise, deadline);
        amountRaised = 0;
        ended = false;
        refundEnabled = false;
    }

    function getInfo() constant returns (address, string, uint256, uint256) {
        return (info.projectOwner, info.name, info.amountToRaise, info.deadline);
    }

    function fund() payable returns (bool successful) {
        if (ended) {
            return false;
        }
        contributions[tx.origin] += msg.value;
        amountRaised += msg.value;
        if (now > info.deadline) {
            ended = true;
            refundEnabled = true;
            return false;
        }
        if (amountRaised >= info.amountToRaise) {
            ended = true;
            payout();
        }
        return true;
    }

    function payout() private returns (bool successful) {
        if (ended) {
            if (!info.projectOwner.send(this.balance)) {
                throw;
            }
        }
    }

    function refund() public returns (bool successful) {
        if (refundEnabled) {
            if (contributions[msg.sender] > 0) {
                if (msg.sender.send(contributions[msg.sender])) {
                    contributions[msg.sender] = 0;
                    return true;
                } else {
                    return false;
                }
            } else {
                throw;
            }
        }
    }
}

Estoy implementando el contrato de otro contrato y estoy probando fund() con esta pieza de Javascript:

function fund(address) {
    project = Project.at(address);
    project.fund({from: coinbase, value: 50, gas: 150000}).then(function(value) {
        console.log(value);
    });
}

El contrato funciona perfectamente en Browser Solidity, en TestRPC todo funciona bien excepto esa declaración if en particular. ¿Es esto un problema de TestRPC o estoy haciendo algo mal? Estoy usando TestRPC v3.0.3.

¿Puedo sugerirle que cree un evento de depuración para registrar los valores de now e info.deadline justo antes de la declaración if? Una vez que se extrae la transacción, podrá ver los valores exactos (sin dudas) en los registros de transacciones. Buena suerte
Hice lo que dijiste, el evento devolvió los valores correctos y el código se ejecutó correctamente, eliminé el evento y el código aún funciona. Entonces ahora tengo exactamente el mismo código que antes, pero ahora realmente funciona. Nunca entenderé cómo funciona esto. Gracias por tu ayuda.
Pocas posibilidades: usó la dirección de un contrato implementado con una versión anterior del código, el compilador de solidity hizo una optimización estúpida, hubo un error tipográfico inicialmente, etc. o 42. :-)
¿Alguien podría decirme la causa raíz del problema? O cómo la forma en que fue esoved. Estoy recibiendo lo mismo. ¿Hay alguna opción que deba pasar cuando inicie testrpc. Por favor dirección.

Respuestas (3)

Tuve un problema similar, tal vez ayude a alguien. Caso similar al anterior, financiación con fecha límite, prueba con testrpc de javascript. Si bien la funcionalidad de fecha límite funcionaba bien en cada caso de prueba, pensé que la fecha de creación del contrato se cambiaba en cada caso de prueba. Después de un poco de 'depuración', pensé que el problema era antes de cada cierre del script de prueba: implementó un nuevo contrato para cada caso de prueba. :)

Recomiende probar usando ganache de trufa: truffleframework.com/ganache

Su aplicación basada en electrones complementa bastante bien a testrpc para este tipo de escenario.

Volviendo a la pregunta en cuestión, no se realiza minería en testrpc de forma predeterminada, por lo que el tiempo de bloqueo solo avanza si interactúa con la cadena de bloques a través de una escritura.

ingrese la descripción de la imagen aquí

https://ethfiddle.com/3MfpQS8bMy

En mi experiencia, la marca de tiempo "ahora" en testrpc se actualiza cada vez que envío un evento de solidez. Por ejemplo, cada vez que llamo al siguiente evento dentro de mi código:

Transferir(mensaje.remitente, _a, _valor);

Cuando no tengo eventos, la marca de tiempo "ahora" siempre tiene el mismo valor inicial cuando se ejecuta en testrpc. La esperanza es precisa.