Raw-Transaction

如何使用 Pyethereum 使用數據生成原始交易

  • July 13, 2018

您如何使用Pyethereum生成原始 tx 以發送到區塊鏈?我可以通過沒有數據的事務成功完成此操作,但是當我嘗試使用數據時,它無法正常執行。

為了對此進行擴展,我已將問題歸咎於數據編碼。我可以完美地發送沒有數據的 1 ETH 交易。我可以用一串數據發送相同的事務,比如“0xabcdef”,它將通過相同的處理,除了 etherscan.io 上的“數據”部分沒有讀取“0xabcdef”。我相信這是問題所在,但我不知道如何解決。

舉個例子,我用來創建事務,下面的程式碼有效:

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')

下面的程式碼,也是一樣的,但是有數據,也通過了,但是數據不是我所期望的:

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')

數據輸出(根據 etherscan.io):0x3078616263646566

顯然這不是我想看到的數據。如何傳遞我在 etherscan.io 上看到的相同數據?

0x3078616263646566是字元串的 UTF-8 編碼的十六進製表示"0xabcdef""0"是十六進制 30,"x"是十六進制 78,依此類推。嘗試b'\xab\xcd\xef'作為數據傳入,而不是。

您可以使用以下十六進制生成此字節字元串:

import codecs
raw_bytes = codecs.decode('abcdef', 'hex')
assert raw_bytes == b'\xab\xcd\xef'

還值得查看軟體包和其他有用的ethereum-utils工具eth_utils.decode_hex()

這是我在 python3 中的程式碼

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()

它返回這個

 {'nonce': 8, 'gasprice': 5000000000, 'startgas': 45000, 'to': '0x4d21f3618bc4c50475d4b30993d80cffe78b3650', 'value': 0, 'data': '0x3078393537613065323130303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303337', 'v': 27, 'r': 104827557381449577376519412355902868429829733841563149787296871707166833642558, 's': 29002009444020075645692529433910482836532514345220494513395292371410739844134, 'sender': '0xd1bb5d5c362bb4faf25c23b3c7c42c8ea30dc10d', 'hash': '0x20d1a85cf3e6f4d11655c9ba0f09602ea4881b6abcc192581fca18b24634cd2c'}

引用自:https://ethereum.stackexchange.com/questions/25627