(Python) eth_getFilterChanges --> Daten --> wie entschlüsseln?

Edit: gelöst, nach unten scrollen.

Wie entschlüsselt man Filterergebnisse?

Ein Vertrag gibt dieses Ereignis aus

event Send(address from, address to, uint value)

Mit ethjsonrpcund eth_getFilterChangeserhalte ich dieses Filterlog:

filterChanges=[{u'address': u'0x3673d5b436089c9aa3f59df5062c7431c86c21d7',
  u'blockHash': u'0x4bf30aba20336f634cfb638dab2bc72b06f79ae21072466102d3bde1247a016c',
  u'blockNumber': u'0xb5bed',
  u'data': u'0x000000000000000000000000157fb756013257b2705833f12d9897de8600b91f00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be10000000000000000000000000000000000000000000000000000000000000002',
  u'logIndex': u'0x0',
  u'topics': [u'0x93eb3c629eb575edaf0252e4f9fc0c5ccada50496f8c1d32f0f93a65a8257eb5'],
  u'transactionHash': u'0x76b0bf4e5cdaee03725c97710ee3d3f218971664231c7e3259935d3d1b210443',
  u'transactionIndex': u'0x0'}]

Jetzt versuche ich, das 'data'-Element zu entschlüsseln, das eindeutig ist (Adresse, Adresse, Betrag).

Aber wie transformiert man es mit den Python-Bibliotheken?

data = filterChanges[0]["data"]
print data
print len(data)

import ethereum.abi
data_dec = ethereum.abi.decode_abi(["address", "address", "uint256"], data)
pprint (data_dec)

ergibt sich

0x000000000000000000000000157fb756013257b2705833f12d9897de8600b91f00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be10000000000000000000000000000000000000000000000000000000000000002
194
['3030303030303030303030303030313537666237',
 '3538333366313264393839376465383630306239',
  22343880564164347692490066462159793276992634768622606872680301975360839562809L]

Irgendwelche Hinweise? Danke.


Bearbeiten: Gelöst

Die Funktion decode_abi erwartet binäre Daten

filterChanges=[{u'address': u'0x3673d5b436089c9aa3f59df5062c7431c86c21d7',
  u'blockHash': u'0xabbaaefe73c34ddfce9c3656ede6a754d105f1a2b43fbcf28baad633703d095c',
  u'blockNumber': u'0xb914d',
  u'data': u'0x00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be1000000000000000000000000157fb756013257b2705833f12d9897de8600b91f000000000000000000000000000000000000000000000000000000000000002a',
  u'logIndex': u'0x0',
  u'topics': [u'0x93eb3c629eb575edaf0252e4f9fc0c5ccada50496f8c1d32f0f93a65a8257eb5'],
  u'transactionHash': u'0x89247c65380bf66a194a72b01a750356ee4cb8e3ce336dbaaba89b527c21de47',
  u'transactionIndex': u'0x0'}]

logdata_hex = filterChanges[0]["data"]
print; print logdata_hex; print len(logdata_hex)

logdata_hex_wo_0x =  logdata_hex[2:]
print; print logdata_hex_wo_0x; print len(logdata_hex_wo_0x)

logdata = logdata_hex_wo_0x.decode('hex')
print; print logdata; print len(logdata)

import ethereum.abi
data_dec = ethereum.abi.decode_abi(["address", "address", "uint256"], logdata)
print; pprint (data_dec)

ergibt:

0x00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be1000000000000000000000000157fb756013257b2705833f12d9897de8600b91f000000000000000000000000000000000000000000000000000000000000002a
194

00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be1000000000000000000000000157fb756013257b2705833f12d9897de8600b91f000000000000000000000000000000000000000000000000000000000000002a
192

C�i�<@������=��{��V2W�pX3�-��ކ�*
96

['43bc6919fd3c40dce81fb4b00bd7e33db68b7be1',
 '157fb756013257b2705833f12d9897de8600b91f',
 42]

Danke an @hack.augusto


Tags: Python, Vertragsprotokolle, Pyethereum, Ethjsonrpc, Dekodierung

Sie können Ihre eigene Frage beantworten, indem Sie Ihre Ergebnisse unten posten. Dies hilft anderen Benutzern, die Lösung schneller zu finden und hilfreiche Inhalte zu bewerten. Vielen Dank!

Antworten (2)

Der JSONRPC gibt das Datenfeld hexadezimal codiert zurück und die decode_abiFunktion erwartet binäre Daten, daher müssen Sie das Datenfeld decodieren, bevor Sie aufrufen decode_abi.

import ethereum.abi
logdata_hex = filterChanges[0]['data']
logdata = logdata_hex.decode('hex')
# the addresses will be hex-encoded
data = ethereum.abi.decode_abi(['address', 'address', 'uint256'], logdata)
fast. Ich musste das "0x" entfernen, dann hat es funktioniert. Ich habe meine OP bearbeitet. Vielen Dank @hack.augusto

Gelöst

Die Funktion decode_abi erwartet binäre Daten

filterChanges=[{u'address': u'0x3673d5b436089c9aa3f59df5062c7431c86c21d7',
  u'blockHash': u'0xabbaaefe73c34ddfce9c3656ede6a754d105f1a2b43fbcf28baad633703d095c',
  u'blockNumber': u'0xb914d',
  u'data': u'0x00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be1000000000000000000000000157fb756013257b2705833f12d9897de8600b91f000000000000000000000000000000000000000000000000000000000000002a',
  u'logIndex': u'0x0',
  u'topics': [u'0x93eb3c629eb575edaf0252e4f9fc0c5ccada50496f8c1d32f0f93a65a8257eb5'],
  u'transactionHash': u'0x89247c65380bf66a194a72b01a750356ee4cb8e3ce336dbaaba89b527c21de47',
  u'transactionIndex': u'0x0'}]

logdata_hex = filterChanges[0]["data"]
print; print logdata_hex; print len(logdata_hex)

logdata_hex_wo_0x =  logdata_hex[2:]
print; print logdata_hex_wo_0x; print len(logdata_hex_wo_0x)

logdata = logdata_hex_wo_0x.decode('hex')
print; print logdata; print len(logdata)

import ethereum.abi
data_dec = ethereum.abi.decode_abi(["address", "address", "uint256"], logdata)
print; pprint (data_dec)

ergibt:

0x00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be1000000000000000000000000157fb756013257b2705833f12d9897de8600b91f000000000000000000000000000000000000000000000000000000000000002a
194

00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be1000000000000000000000000157fb756013257b2705833f12d9897de8600b91f000000000000000000000000000000000000000000000000000000000000002a
192

C�i�<@������=��{��V2W�pX3�-��ކ�*
96

['43bc6919fd3c40dce81fb4b00bd7e33db68b7be1',
 '157fb756013257b2705833f12d9897de8600b91f',
 42]

Danke an @hack.augusto für den Hinweis mit den Binärdaten.

hier gepostet, weil 5chdn mich darum gebeten hat
Vielen Dank. Sie können es auch als akzeptiert markieren, indem Sie auf das Häkchen unter der Bewertungspunktzahl klicken.
Fertig. Du bist großartig!