Truffle-Test schlägt aufgrund eines anderen Datentyps als erwartet fehl

Ich verwende Trüffel und Ganache, um eine Token-Demo für mich selbst zu erstellen. Ich folge dieser Anleitung und nehme dann meine eigenen Änderungen gemäß meinem Projekt vor.

Wenn ich versuche, Tests durchzuführen, um zu überprüfen, ob mein Vertrag ordnungsgemäß läuft, wird mir eine interessante Rückgabe von Daten präsentiert, die ich nicht erwartet hatte.

Wenn ich einen Token mit diesem Test präge:

describe("mint", () => {
    it("Created token with specified attributes", async () => {
        let instance = await Token.deployed();
        let owner = await instance.owner();

        let tokenId = await instance.mint(5, 2, 5, 10, 5);

        describe("Expected output: ", tokenId);

        let attributes = await instance.getToken(0);
        assert.equal(attributes, [5, 2, 5, 10, 5]);
    });
});

Ich hatte erwartet, dass diese Funktion [5, 2, 5, 10, 5] zurückgibt:

function getToken( uint _TokenId ) public view returns(
    uint256 value1,
    uint256 value2,
    uint256 value3,
    uint256 value4,
    uint16 value5
    ){
    Token memory _token = tokens[_TokenId];
    value1 = _token.value1;
    value2 = _token.value2;
    value3 = _token.value3;
    value4 = _token.value4;
    value5 = _token.value5;
}

Aber stattdessen geben die Variablenattribute Berichten zufolge diese seltsame Datenstruktur zurück, die ein Array von 5 mit 3 Zuordnungen der Zeichen "c", "e", "s" zu einer Variablen zu sein scheint. "c" enthält den erhofften Wert:

{"c" : [5]  "e" : 0 "s" : 1}
{"c" : [2]  "e" : 0 "s" : 1}
{"c" : [5]  "e" : 0 "s" : 1}
{"c" : [10] "e" : 1 "s" : 1}
{"c" : [5]  "e" : 0 "s" : 1}

Meine Frage ist, warum erhalte ich diese Datenstruktur? Sollte ich nicht meine erwarteten Ergebnisse erhalten? Ich glaube, die Zuordnung des "e" ist die Anzahl der Ziffern - 1, aber ich weiß nicht, was "s" darstellt. Ich könnte durchgehen und ein Array mit jeder der "c" -Zuordnungen erstellen, aber ich weiß nicht, ob dies der beste Weg ist, damit umzugehen.

Antworten (1)

TLDR; verwendentokenId.toString()

Das Array, das Sie erhalten, ist eine Darstellung der BigNumber, die von der Blockchain zurückgegeben wird. Oder tatsächlich gibt die Blockchain ein uint256(oder wie viele Bits Sie auch verwenden) zurück und es wird dann in eine BigNumber umgewandelt.

Das "Problem" mit BigNumber ist, dass Sie seinen Wert nicht so anzeigen können. Ich bin mir nicht ganz sicher, was die Array-Werte darstellen, aber die Bibliothek selbst ist https://github.com/MikeMcl/bignumber.js/ , glaube ich.

Wie auch immer, um eine benutzerfreundliche Version der Nummer anzuzeigen, können Sie einfach verwenden value.toString().