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.
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.
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.
Guenole de Cadoudal
Fyde
Guenole de Cadoudal
Seetharaman GR