So generieren Sie mit Pyethereum eine Rohtransaktion mit Daten

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?

Ich habe ein ähnliches Problem (Signieren von Token-Transaktionen mit Pyethereum) und dachte, das Problem ähnlich wie im obigen Beitrag gelöst zu haben. Eth geht es gut, Token funktionieren nicht. Ich habe bemerkt, dass die Rückgabe, die Sie erhalten (wie das Beispiel auch zeigt), eine lange Sequenz von 03030303 enthält. Und nicht unerwartet akzeptiert das Ethereum-Netzwerk die Transaktion nicht. Könnte mir jemand helfen?

Antworten (2)

0x3078616263646566ist 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-utilsfü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'}