Truffle CMD BigNummer zu Nummer; Hex zu Zeichenfolge

Eine Funktion in meinem Vertrag, wenn sie in der Truffle-Development-Befehlszeile aufgerufen wird, gibt eine Ausgabe im BigNumber-Format aus. Hier ist, was ich in die Befehlszeile geschrieben habe:

instance = contract.at('deployed address')

instance.getAge()

Ich habe es mit instance.getAge().toNumber() versucht, aber das gibt einen Fehler aus, der besagt, dass toNumber nicht definiert ist. Ich habe überprüft , wie man BigNumber im Truffle-Framework in Number umwandelt. aber das scheint nicht auf der Kommandozeile zu funktionieren.

Ähnliche Ausgaben von Funktionen, die bytes32 zurückgeben, sind in hex. Ich habe die Web3-Return-Bytes32-Zeichenfolge überprüft , web3.utils.toAscii(x) {x is any variable}wirft aber einen Fehler aus

"Eigenschaft kann nicht in Ascii von undefined gelesen werden"

Ich habe den dazugehörigen Stack gelesen und das hat auch nicht geholfen.

Antworten (1)

Vertragsfunktionsaufrufe in Truffle-Rückgabeversprechen , sodass Sie einen Rückruf hinzufügen müssen, um die Antwort zu erhalten. Wenn getAge()entweder als constant, pureoder viewim Solidity-Vertrag deklariert ist, können Sie dies tun, instance.getAge().then(age => age.toNumber())wenn es keinen dieser Modifikatoren enthält, müssen Sie dies tuninstance.getAge.call().then(age => age.toNumber())

Vielen Dank! Ich hatte in ähnlicher Weise eine Funktion getname(), die eine Zeichenfolge zurückgeben sollte, aber Hex als Ausgabe liefert. Also sollte ich dafür Folgendes eingeben: instance.getname().then(name => web3.toAscii(name)) ?
Keine Sorge! Außerdem sollten Sie den String-Rückgabewert einer Funktion nicht von Hex konvertieren müssen. Wird wie oben vorgeschlagen getName()entweder mit constant, view, oder purenach dem Funktionsnamen deklariert? Wenn dies nicht der Fall ist, sollten Sie es hinzufügen. Wenn Sie es aus irgendeinem Grund nicht hinzufügen können, verwenden Sie instance.getname.call()stattdessen.
Ja, es ist konstant. Also habe ich es getan instance.getname().then(name => web3.toAscii(name)). Es hat funktioniert, aber es gab diese Zeichenfolgen \u0000nach dem Namen aufgefüllt. Irgendwie um das zu entfernen?
Woher hast du die instance? Und gibt die Funktion in Solidity einen String zurück, z. B. sieht es ähnlich aus function getName() constant returns (string)?
pragma solidity ^0.4.17; contract MyFirst { bytes32 name; function set(bytes32 newName) public { name = newName; } function get() public constant returns (bytes32){ return name; } }Ich verwende Bytes32, nicht String, weil Solidität mit Strings nicht gut funktioniert. Es wirft seltsame Fehler.
bytes32ist eine Variable mit statischer Größe, sodass Sie keine Zeichenfolge einfügen können, die größer als 32 Byte ist. stringist eine Variable mit dynamischer Größe, sodass Sie eine beliebig große Zeichenfolge darin einfügen können. Leider gibt es derzeit Einschränkungen beim Übergeben von Variablen mit dynamischer Größe, wie z. B. Zeichenfolgen, zwischen Verträgen und möglicherweise zwischen Speicher und Arbeitsspeicher, die wahrscheinlich die Quelle der seltsamen Fehler sind. Einige dieser Einschränkungen sollten jedoch in den nächsten Monaten behoben werden, sodass Sie hoffentlich weniger seltsame Fehler bei der Verwendung von Zeichenfolgen erhalten.
Sorry das war alles etwas verwirrend. Diese Funktion getname sollte also bytes32 zurückgeben. Es gibt jedoch stattdessen hex zurück. Also tat ich es instance.getname().then(name => web3.toAscii(name)). Das funktioniert jetzt gut, bis auf eine kleine Irritation durch die gepolsterte u0000. Kennen Sie eine Möglichkeit, diese Hex-Ausgabe ohne diese vielleicht wieder in Bytes32 umzuwandeln u0000?
Sie können die nachgestellten Nullen mit einer Regex entfernen, bevor Sie sie in Ascii konvertieren, was damit gemacht werden könnte, hexValue.replace(/0+$/, "")sodass alles zusammen so aussehen könnteinstance.getname().then(hexValue => hexValue.replace(/0+$/, "")).then(hexNoTrailingZeros => web3.toAscii(hexNoTrailingZeros))