Solidity-Funktion kehrt nicht zurück - sendet weiterhin TX-Quittung zurück

Ich versuche, meine Solidity-Funktion aufzurufen:

function getVehicleDetails(string _vin) returns (string _vln, uint _year, string _make, string _model, string _colour) {
    Vehicle vehicle = vehicles[_vin];
    if (vehicle.year == 0)
        throw;

     _vln = vehicle.vln;
    _year = vehicle.year;
    _make = vehicle.make;
    _model = vehicle.model;
    _colour = vehicle.colour;
}

Hier ist der geth-Befehl:

instance.getVehicleDetails("vin_101",{from:web3.eth.accounts[1]})

kehrt zurück"0x6cf98ab5b77bfa0397ee6eaa046f85a133c5a3ef636c59a56b4308dc73fb20fd"

dh es gibt immer eine tx-Quittung zurück!

So erstelle ich ein Fahrzeug:

function setVehicleDetails(string _vin, string _vln, uint _year, string _make, string _model, string _colour) owneronly {
    Vehicle vehicle = vehicles[_vin];
    if (vehicle.year == 0)
        throw;
    vehicle.vln = _vln;
    vehicle.year = _year;
    vehicle.make = _make;
    vehicle.model = _model;
    vehicle.colour = _colour;
}

Ich nenne dies in geth mit:

instance.registerVehicle("vin_101","vln_101",2004,"ferrari","convertible","black",{from:web3.eth.accounts[0],gas:4000000})

Was mache ich falsch?

Ich möchte nur die Rückgabewerte auslesen getVehicleDetailsund es weigert sich einfach!

Ich bin dran testrpc.

Antworten (3)

Da dies eine nicht kostenpflichtige Funktion ist. Rufen Sie diese Funktionen immer mit dem Schlüsselwort call auf und nicht nur mit dem Funktionsnamen. Nur Aufrufe geben Werte zurück.

Format des Aufrufs: Contract.getVehicleDetails.call(params)

Die Funktionen in Solidity geben immer Transaktionshash zurück. Sie können konstante Funktionen verwenden , um Werte zurückzugeben. Der constant functionskann den Vertragszustand nicht ändern.

Wenn Sie den Vertragsstatus in einer Funktion ändern müssen und auch einen gewissen Wert zurückgeben möchten, sind Events die bestmögliche Lösung AFAIK.

Sie können Ereignisse verwenden , um Werte aus einer nicht konstanten Funktion zu erhalten.

Ich verstehe das. Danke für das Aufklären. Da jemand anderes Solidity geschrieben hat, konnte ich das constantSchlüsselwort nicht hinzufügen. Also habe ich stattdessen "Anruf" verwendet. instance.getVehicleDetails.call("vin_101",{from:web3.eth.accounts[0]})Ich finde das auf die harte Tour!!!
Die Verwendung callwird Ihnen nicht helfen. Callist ähnlich wie, sendes erstellt nur keine Transaktion und veröffentlicht sie in der Blockchain. Es gibt keinen Unterschied in der Art und Weise, wie call und send die Funktion aufrufen.
Ich bin nicht einverstanden. Auf der Blockchain (im Gegensatz zu In-Browser-Solidity-Compilern wie browser-solidity) gibt es einen deutlichen Unterschied zwischen der Verwendung von „call“ und der Nichtverwendung. Ohne "call" werden keine Rückgabeparameter zurückgegeben - nur eine TX-Quittung. Mit "call" bekommt man die Parameter zurück. Eine Sache, die Sie tun könnten, ist einfach das Schlüsselwort "constant" in Ihrer Solidity-Funktion zu verwenden. Wenn Sie verwenden browser-solidity, brauchen Sie sich um diese Nuance keine Gedanken zu machen. Obwohl ich das sehr verwirrend fand - Code funktionierte gut in Browser-Solidity, aber nicht auf einer echten Blockchain ...

Sie müssen eine konstante Funktion verwenden, um Werte aus der Solidity-Funktion zurückzugeben. Die Konstantenfunktion hat eine Einschränkung, dass Sie den Vertragszustand (der Wert einer Zustandsvariablen kann nicht geändert werden) in der Konstantenfunktion nicht ändern können.

Hier ist das Beispiel einer konstanten Funktion und des Aufrufs einer konstanten Funktion von JS.

contract MyNumber{

    uint public num1 = 1;

    function getNumber() constant returns (uint){
        return num1 ;
    }

}

Um diese Funktion aufzurufen, verwenden Sie call() anstelle von sendTransaction(), hier ist das Beispiel

var contract = web3.eth.contract(abi).at(contractAddress);    
contract.getNumber.call();

Nochmals, wenn Sie die Werte von der Funktion erhalten möchten, die den Vertragszustand ändern, können Sie Ereignisse und Ereignisrückrufe verwenden. Weitere Informationen zur Verwendung von Ereignissen und Ereignisrückrufen finden Sie im Code in dieser FRAGE