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.
Vertragsfunktionsaufrufe in Truffle-Rückgabeversprechen , sodass Sie einen Rückruf hinzufügen müssen, um die Antwort zu erhalten. Wenn getAge()
entweder als constant
, pure
oder view
im 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())
Rahul Kothari
willjgriff
getName()
entweder mitconstant
,view
, oderpure
nach 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 Sieinstance.getname.call()
stattdessen.Rahul Kothari
instance.getname().then(name => web3.toAscii(name))
. Es hat funktioniert, aber es gab diese Zeichenfolgen\u0000
nach dem Namen aufgefüllt. Irgendwie um das zu entfernen?willjgriff
instance
? Und gibt die Funktion in Solidity einen String zurück, z. B. sieht es ähnlich ausfunction getName() constant returns (string)
?Rahul Kothari
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.willjgriff
bytes32
ist eine Variable mit statischer Größe, sodass Sie keine Zeichenfolge einfügen können, die größer als 32 Byte ist.string
ist 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.Rahul Kothari
instance.getname().then(name => web3.toAscii(name))
. Das funktioniert jetzt gut, bis auf eine kleine Irritation durch die gepolsterteu0000
. Kennen Sie eine Möglichkeit, diese Hex-Ausgabe ohne diese vielleicht wieder in Bytes32 umzuwandelnu0000
?willjgriff
hexValue.replace(/0+$/, "")
sodass alles zusammen so aussehen könnteinstance.getname().then(hexValue => hexValue.replace(/0+$/, "")).then(hexNoTrailingZeros => web3.toAscii(hexNoTrailingZeros))