So erhalten Sie den Rückgabewert der Funktion für den Soliditätsvertrag

Ich möchte den Rückgabewert einer Funktion für einen Soliditätsvertrag erhalten. Ich habe bereitgestellt, indem ich den Solidity-Browser im Testnet verwende. Ich verwende den nodejs-Client und er verwendet geth für den Web3-Anbieter. Hier sind die Details

Vertrag (aus Soliditätsbeispiel)

contract ShapeCalculator{
    function rectangle(uint w, uint h) returns (uint s, uint p) {
        s = w * h;
        p = 2 * (w + h);
    }
} 

Kundencode ::

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); 
web3.eth.defaultAccount=web3.eth.accounts[0];
var abi = '[{"constant":false,"inputs":[{"name":"w","type":"uint256"},{"name":"h","type":"uint256"}],"name":"rectangle","outputs":[{"name":"s","type":"uint256"},{"name":"p","type":"uint256"}],"payable":false,"type":"function"}]';
var address = "address which I received after deployment";
var shapeCalculatorContract = web3.eth.contract( JSON.parse(abi)).at(address);
var holdReturnValue = shapeCalculatorContract.rectangle(10,20);
console.log(holdReturnValue);

Auf der Konsole bekomme ich "0x83ddb750b799c62f73013c34f89295e3ff2af5cc98755a51e41e00a13c389735", ich hatte die Fläche und den Umfang erwartet. Schätzen Sie jede Hilfe.

Deklarieren Sie eine solche Funktion als konstant
Ich bin neu in der Solidität. Ich möchte den Wert von w und h in der Rechteckfunktion drucken. wie kann ich das machen? Vertrag ShapeCalculator{Funktion Rechteck(uint w, uint h) gibt zurück (uint s, uint p) { //Druckwert von w und hs = w * h; p = 2 * (b + h); } }
Bitte keine Fragen als Antworten posten. Sie haben Ihre Frage bereits gestellt, setzen Sie die Diskussion dort fort
Wenn Sie eine neue Frage haben, stellen Sie diese bitte, indem Sie auf die Schaltfläche „ Frage stellen“ klicken . Fügen Sie einen Link zu dieser Frage hinzu, wenn dies hilfreich ist, um den Kontext bereitzustellen. - Aus Bewertung
Damit ist die Frage nicht beantwortet. Sobald Sie über einen ausreichenden Ruf verfügen , können Sie jeden Beitrag kommentieren . Geben Sie stattdessen Antworten an, die keine Klärung durch den Fragesteller erfordern . - Aus Bewertung

Antworten (1)

Wenn Sie eine Vertragsfunktion mit ihrem Namen aufrufen, wie Sie es dort getan haben, generieren Sie eine Transaktion, und Sie können den zurückgegebenen Wert außerhalb des Vertrags nicht sehen (was Sie erhalten, ist die Transaktionsquittung). Wenn Ihre Funktion den Zustand in der Blockchain ändern muss, dann sind Transaktionen der richtige Weg, und um Zugriff auf Rückgabewerte zu erhalten, sollten Sie sich mit der Verwendung von Events befassen. Wenn Sie wie in diesem Fall mit Ihrer Funktion keinen Wert in der Blockchain ändern, können Sie stattdessen einen Funktionsaufruf verwenden und die zurückgegebenen Werte direkt in Ihrem Javascript-Code abrufen. In Ihrem Fall wäre das (z. B. mit Versprechen)

shapeCalculatorContract.rectangle.call(10,20).then(function(s,p){
    console.log("s=%d, p=%d", s, p);
}); // insert catch error block here

Für ein besseres Verständnis von Transaktionen und Aufrufen und deren Unterschied siehe diese Antwort oder die Dokumentation von web3.

Hallo @manuhalo, was empfohlen wird, wenn Sie ein Ereignis verwenden oder über einen Anruf aufrufen, schätzen Sie Ihre Ansicht
@ user1687711 Wie oben erwähnt, hängt es davon ab, was Sie erreichen möchten. Für diese spezielle Funktion sieht es so aus, als wäre ein Aufruf vollkommen in Ordnung, da Sie keine Variablen in Ihrem Vertrag ändern, sondern nur die Eingabeargumente verwenden, um eine Ausgabe zu generieren, die nicht gespeichert wird. Wenn Sie jedoch aus irgendeinem Grund die berechnete Fläche für ein privates Mitglied Ihres Vertrags speichern möchten, müssen Sie Transaktionen und Ereignisse verwenden. Siehe truffleframework.com/docs/getting_started/… für eine bessere Erklärung dazu.