Raw-Transaction
如何使用 Pyethereum 使用數據生成原始交易
您如何使用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'}