Funktionsaufruf gibt 0 zurück

Hey, kann mir jemand helfen herauszufinden, warum diese Funktion 0 zurückgibt, wenn ich sie aufrufe? Die Funktion wirft keine Fehler, wenn ich eine Transaktion an sie sende, aber der Ether wird nicht gesendet und die Variablen werden nicht gesetzt.

    function payout() returns (uint) { 
       if (projectPaid) {return 3; }
       projectPaid = true;
       if (!msg.sender.send(amountRaised)) { 
        projectPaid = false;
        return 4; 
      }
    return 5; 
    }

Hier ist der Aufruf von web3/truffle

  var projectToFund = document.getElementById("payout").value;
  var thisProject = Project.at(projectToFund); 
  thisProject.payout.call({from: account, gas:200000}).then(function(_result) { 
    console.log(_result.valueOf());
Hast du das gelöst? Können Sie bitte etwas Licht ins Dunkel bringen, was das eigentliche Problem war?
Es schien also, dass ich die Variable sowohl mit uint als auch mit uint256 (an verschiedenen Punkten der Anwendung) gesetzt habe. Es schien behoben zu werden, als ich jede Variable in uint256 änderte.

Antworten (2)

return 5;es wird nicht mit außerhalb der Funktion kompiliert .

Betrachten wir also:

function payout() returns (uint) { 

       if (projectPaid) {return 3; }
       projectPaid = true;
       if (!msg.sender.send(amountRaised)) { 
        projectPaid = false;
        return 4; 
       }


 // return 5; 

wenn Projektbezahlt ??? Nein.

wenn send() fehlgeschlagen ist ??? Nein.

Es wurde nichts zurückgegeben, wenn das Senden funktioniert hat, also 0.

Einfache Funktion:

    bool projectPaid;
    uint amountRaised;

    function payout() returns(bool success) {
        if(projectPaid) return false;
        projectPaid = true;
        if(!msg.sender.send(amountRaised)) {
            projectPaid = false;
            return false;
        }
        return true;
    }

Ich hoffe es hilft.

Hey, sorry Rob, ich habe vergessen, das abschließende Semikolon hinzuzufügen, ich habe die Frage so bearbeitet, dass sie mit meiner Solidität übereinstimmt.
Wenn ich also jede Zeile auskommentiere und nur versuche, ein uint wie 5 zurückzugeben, gibt es 0 zurück, wenn ich versuche, wahr zurückzugeben, gibt es falsch zurück.
Klingt so, als würden Sie nicht darauf warten, dass die Transaktion abgebaut wird. Schauen Sie sich diesen Code an, den ich erfolgreich für ein schönes Muster verwendet habe. gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6
Ok, ich mache eigentlich einen call() und versuche dann die Transaktion, aber sollte ich warten, bis der call() auch abgebaut wird? Wissen Sie, wie Sie den Transaktionsbeleg parsen, wenn er abgebaut wird?
call()gibt keine Transaktion aus, sodass Sie nicht auf das Mining warten müssen.

Ich schätze, Sie verwenden web3.js, um eine Transaktion zu senden, die Ihre Funktion aufruft. Dies unterstützt keine Rückgabewerte.

Sie können einen Rückgabewert nur erhalten, wenn Sie diese Funktion von einem anderen Vertrag aus oder als aufrufen ctr.payout.call()(beachten Sie, dass die Funktion im letzteren Fall den Vertragsstatus nicht ändern kann).

Weitere Informationen finden Sie in diesen Fragen:

Es ist möglich, Ereignisse zu verwenden, um Rückgabewerte zu verfolgen.


Hier ist der Testvertrag und die Beispielsitzung geth:

x.sol

pragma solidity ^0.4.0;

contract Test {
    bool public projectPaid = false;
    uint public amountRaised = 0;

    function payout() returns (uint) { 
        if (projectPaid) return 3;
        projectPaid = true;
        if (!msg.sender.send(amountRaised)) { 
            projectPaid = false;
            return 4; 
        }
        return 5; 
    }
}

geth-Konsole

var x_sol_testContract = web3.eth.contract([{"constant":false,"inputs":[],"name":"payout","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"amountRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"projectPaid","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"}]);
var x_sol_test = x_sol_testContract.new(
   {
     from: web3.eth.accounts[0], 
     data: '0x60606040526000805460ff19168155600155341561001957fe5b5b61014d806100296000396000f300606060405263ffffffff60e060020a60003504166363bd1d4a81146100375780637b3e5e7b14610059578063c2e39a731461007b575bfe5b341561003f57fe5b61004761009f565b60408051918252519081900360200190f35b341561006157fe5b610047610112565b60408051918252519081900360200190f35b341561008357fe5b61008b610118565b604080519115158252519081900360200190f35b6000805460ff16156100b35750600361010f565b6000805460ff1916600190811782555460405173ffffffffffffffffffffffffffffffffffffffff33169282156108fc02929190818181858888f19350505050151561010b57506000805460ff19169055600461010f565b5060055b90565b60015481565b60005460ff16815600a165627a7a723058205acabc04fdd5e478a5e40215426abb624ec48fea0ef750e4e6a0f14cb328dbe90029', 
     gas: '4700000'
   })

 x_sol_test.payout.call()

Versuchen Sie, dies auszuführen, und prüfen Sie, ob es zurückkehrt 5. Ich mein Fall tut es.

Ich bin mir nicht sicher, was Sie damit meinen, dass web3 keine Rückgabewerte unterstützt. Über Web3 erhalten Frontends Daten von Vertragsfunktionen.
Entschuldigung, ich meine, es ist nicht möglich, einen Rückgabewert zu erhalten, wenn eine Transaktion von web3 gesendet wird. Meine Antwort aktualisiert.
Ok, ich versuche tatsächlich, call () zu verwenden, und es wird 0 zurückgegeben ... Ich habe den web3-Aufruf hinzugefügt
Ich habe eine Beispiel-Geth-Konsolensitzung hinzugefügt. Überprüfen Sie, ob diese projectToFundeine gültige Adresse enthält (oder möglicherweise auf einen veralteten Vertrag hinweist).