Edit: gelöst, nach unten scrollen.
Ein Vertrag gibt dieses Ereignis aus
event Send(address from, address to, uint value)
Mit ethjsonrpc
und eth_getFilterChanges
erhalte 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.
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)
0x00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be1000000000000000000000000157fb756013257b2705833f12d9897de8600b91f000000000000000000000000000000000000000000000000000000000000002a
194
00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be1000000000000000000000000157fb756013257b2705833f12d9897de8600b91f000000000000000000000000000000000000000000000000000000000000002a
192
C�i�<@������=��{��V2W�pX3�-��ކ�*
96
['43bc6919fd3c40dce81fb4b00bd7e33db68b7be1',
'157fb756013257b2705833f12d9897de8600b91f',
42]
Danke an @hack.augusto
Tags: Python, Vertragsprotokolle, Pyethereum, Ethjsonrpc, Dekodierung
Der JSONRPC gibt das Datenfeld hexadezimal codiert zurück und die decode_abi
Funktion 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)
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)
0x00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be1000000000000000000000000157fb756013257b2705833f12d9897de8600b91f000000000000000000000000000000000000000000000000000000000000002a
194
00000000000000000000000043bc6919fd3c40dce81fb4b00bd7e33db68b7be1000000000000000000000000157fb756013257b2705833f12d9897de8600b91f000000000000000000000000000000000000000000000000000000000000002a
192
C�i�<@������=��{��V2W�pX3�-��ކ�*
96
['43bc6919fd3c40dce81fb4b00bd7e33db68b7be1',
'157fb756013257b2705833f12d9897de8600b91f',
42]
Danke an @hack.augusto für den Hinweis mit den Binärdaten.
q9f