now / block.timestamp funktioniert nicht auf testrpc?

Ich habe Probleme mit testrpc, oder zumindest denke ich, dass das die Ursache ist. Dieser bestimmte Teil des Codes

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

nie ausgeführt wird, ist es so, als ob now (oder block.timestamp) immer kleiner als die Frist ist, auch wenn dies eindeutig nicht der Fall ist. Deadline ist im Unix-Zeitstempel (zum Beispiel 1487399645), aber dieser Code wird nicht ausgeführt, selbst wenn ich 1 setze.

Hier ist der Vertrag:

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

Ich stelle den Vertrag aus einem anderen Vertrag bereit und teste fund() mit diesem Stück Javascript:

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

Der Vertrag funktioniert perfekt auf Browser Solidity, auf TestRPC funktioniert alles gut außer dieser speziellen if-Anweisung. Ist das ein Problem von TestRPC oder mache ich etwas falsch? Ich verwende TestRPC v3.0.3.

Kann ich vorschlagen, dass Sie ein Debug-Ereignis erstellen, um die Werte von now und info.deadline direkt vor der if-Anweisung zu protokollieren. Sobald die Transaktion abgebaut ist, können Sie die genauen Werte (ohne Zweifel) in den Transaktionsprotokollen sehen. Viel Glück
Ich habe es so gemacht, wie Sie gesagt haben, das Ereignis hat die richtigen Werte zurückgegeben und der Code wurde tatsächlich korrekt ausgeführt. Ich habe das Ereignis entfernt und der Code funktioniert immer noch. Jetzt habe ich genau den gleichen Code wie zuvor, aber jetzt funktioniert es tatsächlich. Ich werde nie verstehen, wie dieses Zeug funktioniert. Danke für Ihre Hilfe.
Wenige Möglichkeiten: Sie haben die Adresse eines Vertrags verwendet, der mit einer früheren Version des Codes bereitgestellt wurde, der Solidity-Compiler hat eine dumme Optimierung vorgenommen, es gab anfangs einen Tippfehler usw. oder 42. :-)
Kann mir jemand die Ursache des Problems nennen. Oder wie es gesovt wurde. Mir geht es genauso. Gibt es irgendwelche Optionen, die ich bestehen muss, wenn ich testrpc starte? Bitte adressieren.

Antworten (3)

Ich hatte ein ähnliches Problem, vielleicht hilft es jemandem. Ähnlicher Fall wie oben, Finanzierung mit Frist, Testen mit testrpc aus Javascript. Während die Fristfunktion in jedem Testfall gut funktionierte, stellte ich fest, dass das Datum der Vertragserstellung in jedem Testfall geändert wird. Nach einigem „Debuggen“ stellte ich fest, dass das Problem bei beforeEach close of test script lag – es stellte einen neuen Vertrag für jeden Testfall bereit. :)

Empfehlen Sie Tests mit Trüffelganache: truffleframework.com/ganache

Ihre elektronenbasierte App ergänzt testrpc ziemlich gut für diese Art von Szenario.

Zurück zur vorliegenden Frage, auf testrpc findet standardmäßig kein Mining statt, sodass sich die Blockzeit nur vorwärts bewegt, wenn Sie über einen Schreibvorgang mit der Blockchain interagieren.

Geben Sie hier die Bildbeschreibung ein

https://ethfiddle.com/3MfpQS8bMy

Meiner Erfahrung nach wird der Zeitstempel „jetzt“ auf testrpc jedes Mal aktualisiert, wenn ich ein Solidity-Ereignis sende. Zum Beispiel jedes Mal, wenn ich das folgende Ereignis in meinem Code aufrufe:

Transfer(msg.sender, _to, _value);

Wenn ich keine Ereignisse habe, ist der Zeitstempel "jetzt" immer derselbe Anfangswert, wenn er auf testrpc ausgeführt wird. Hoffnung ist zutreffend.