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)?
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:
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 uint
Zahl 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.
sunwarr10r
toAscii
ist veraltet. VerwendunghexToAscii
in web3 v1.web3.utils.hexToAscii(0x....)