Dekodierungsvertragsausgabe des Web3-Eth-Aufrufs

Ich habe mit sendRawTransaction Daten in einen Vertrag geschrieben und versuche, sie mit web3.eth.call für die Funktion abzurufen:
function checkRecord(uint id, bytes email) constant returns (uint id2, bytes email2, bytes hash) {..}

I create call data as
var callData = contract.checkRecord.getData(id, email)
to get
'0xf1e8a43c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000156d617467656f2e3230303840676d61696c2e636f6d0000000000000000000000'

und Ergebnis als
result abrufen = web3.eth.call({'to': address, 'from': account, 'data': callData})

where result is
'0x0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000156d617467656f2e3230303840676d61696c2e636f6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000'

Wie dekodiere ich das Ergebnis zurück zu (uint, bytes, bytes)?

Antworten (3)

Sie können die integrierte web3-Funktionalität verwenden:

web3.eth.abi.decodeParameters(typesArray, hexString);

siehe Verlinkung

Der einfachste Weg ist die Verwendung von " abi-decoder ". Ich habe das Repository gegabelt und index.html für eine einfache Verwendung erstellt.

Sie können es herunterladen und verwenden von: https://github.com/Muhammad-Altabba/abi-decoder (Sie können es später unter https://github.com/ConsenSys/abi-decoder überprüfen, sobald sie meine Pull-Anforderung akzeptieren )

So laden Sie NPM herunter und führen es aus:

npm install abi-decoder
bower install abi-decoder

Laden Sie dann https://github.com/Muhammad-Altabba/abi-decoder/index.html in dasselbe Verzeichnis herunter . Öffnen Sie dann die Datei "index.html" im Browser.

Sie erhalten:

abi-decoder index.html

Wie die web3-Dokumentation hervorhebt, gibt web3.eth.call ein zurück String, das die zurückgegebenen Daten des Aufrufs sind, z. B. ein Code-Funktionsrückgabewert. In Ihrem Fall enthält die Ergebniszeichenfolge ein uint(ein Alias ​​für uint256) und zwei Byte-Arrays mit dynamischer Größe.

Teilen Sie das Ergebnis in 32-Byte-Blöcke auf und wenden Sie dann eine toAscii(hexString)Funktion auf die Blöcke an.

Mit dieser Methode erhalten Sie, dass die uintZahl 2 mit Nullen aufgefüllt ist, es sieht so aus: 0x0000000000000000000000000000000000000000000000000000000000000002. Das erste Byte-Array ist {96,160,21,matgeo.2008@gmail.com}. Das zweite Byte-Array enthält nur Nullen.

toAsciiist veraltet. Verwendung hexToAsciiin web3 v1.web3.utils.hexToAscii(0x....)