Wie verwenden Sie Pyethereum , um einen Roh-TX zu generieren, der an die Blockchain gesendet wird? Ich kann es erfolgreich mit einer Transaktion ohne Daten machen, aber wenn ich versuche, Daten zu verwenden, funktioniert es nicht richtig.
Um dies zu erweitern, habe ich das Problem auf die Datencodierung eingegrenzt. Ich kann eine 1-ETH-Transaktion ohne Daten perfekt senden. Ich kann dieselbe Transaktion mit einer Datenfolge senden, sagen wir „0xabcdef“, und sie wird dasselbe durchlaufen, außer dass der Abschnitt „Daten“ auf etherscan.io nicht „0xabcdef“ liest. Ich glaube, das ist das Problem, aber ich weiß nicht, wie ich es beheben kann.
Um ein Beispiel zu zeigen, verwende ich dies , um die Transaktion zu erstellen, und der folgende Code funktioniert:
nonce = 100
gas_price = 10000000000
gas_limit = 22000
value = 1000000000000000000
data = ""
privkey = private_key_here
unencoded_tx = rlp.encode(transactions.Transaction(nonce, gas_price, gas_limit, to_address, value, data).sign(privkey))
signedtx = '0x' + codecs.encode(unencoded_tx, 'hex').decode('utf-8')
Der folgende Code, der derselbe ist, aber mit Daten, geht auch durch, aber die Daten sind nicht das, was ich erwarte:
nonce = 100
gas_price = 10000000000
gas_limit = 22000
value = 1000000000000000000
data = "0xabcdef"
privkey = private_key_here
unencoded_tx = rlp.encode(transactions.Transaction(nonce, gas_price, gas_limit, to_address, value, data).sign(privkey))
signedtx = '0x' + codecs.encode(unencoded_tx, 'hex').decode('utf-8')
Datenausgabe (laut etherscan.io):0x3078616263646566
Offensichtlich sind das nicht die Daten, die ich sehen wollte. Wie kann ich dieselben Daten weitergeben, die ich auf etherscan.io sehe?
0x3078616263646566
ist die Hex-Darstellung der UTF-8-Codierung der Zeichenfolge "0xabcdef"
. "0"
ist Hex 30, "x"
ist Hex 78 und so weiter. Versuchen Sie b'\xab\xcd\xef'
stattdessen, die Daten als zu übergeben.
Sie können diesen Bytestring aus Hex generieren mit:
import codecs
raw_bytes = codecs.decode('abcdef', 'hex')
assert raw_bytes == b'\xab\xcd\xef'
Es lohnt sich auch, das Paket ethereum-utils
für eth_utils.decode_hex()
und andere nützliche Tools zu überprüfen.
Dies ist der Code, den ich in Python3 habe
from ethereum import transactions
from ethereum import utils
tx = transactions.Transaction(nonce=8, gasprice=5000000000,
startgas=45000, to=contract_address, value=0,
data="0x957a0e210000000000000000
000000000000000000000000000000000000000000000037").sign(private_key)
tx = tx.to_dict()
Das gibt es zurück
{'nonce': 8, 'gasprice': 5000000000, 'startgas': 45000, 'to': '0x4d21f3618bc4c50475d4b30993d80cffe78b3650', 'value': 0, 'data': '0x3078393537613065323130303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303337', 'v': 27, 'r': 104827557381449577376519412355902868429829733841563149787296871707166833642558, 's': 29002009444020075645692529433910482836532514345220494513395292371410739844134, 'sender': '0xd1bb5d5c362bb4faf25c23b3c7c42c8ea30dc10d', 'hash': '0x20d1a85cf3e6f4d11655c9ba0f09602ea4881b6abcc192581fca18b24634cd2c'}
PyNoob