Python
不支持 Web3 Python 值錯誤事務類型
我正在嘗試通過與智能合約的互動發送已簽名的交易,但在發送原始交易時一切都崩潰了。
我的程式碼如下
import Globalvariables as thg bsc='https://bsc-dataseed.binance.org/' w3=Web3(Web3.HTTPProvider(bsc)) w3.middleware_onion.inject(geth_poa_middleware, layer=0) abi=json.loads(abi_string) contract_object=w3.eth.contract(address=w3.toChecksumAddress(thg.direction_market),abi=abi) nonce=w3.eth.getTransactionCount(w3.toChecksumAddress(thg.my_direction)) #tx={'nonce':nonce,'from':w3.toChecksumAddress(thg.my_direction),'gasPrice':50000000000,'gas':277777} tx={'nonce':nonce,'from':w3.toChecksumAddress(thg.my_direction),'maxFeePerGas':277777,'maxPriorityFeePerGas':30000} input_data={'addresses':[w3.toChecksumAddress(token['owner']),w3.toChecksumAddress(token['nftContract']),w3.toChecksumAddress(thg.contract_wbnb)], 'values':[int(token['tokenId']),int(w3.toWei(token['bnb'],'ether')),int(token['saltNonce'])], 'signature':bytes.fromhex(token['sign'].lstrip('0x')) } purchase=contract_object.functions.matchTransaction(input_data['addresses'],input_data['values'],input_data['signature']).buildTransaction(tx) sign_tx=w3.eth.account.sign_transaction(purchase,thg.metamask) print(sign_tx,type(sign_tx)) print(sign_tx.rawTransaction,type(sign_tx.rawTransaction)) try:raw_final=w3.eth.send_raw_transaction(sign_tx.rawTransaction) except:raw_final=w3.eth.send_raw_transaction(sign_tx)
程式碼在最後兩行都返回錯誤
>>ValueError: {'code': -32000, 'message': 'transaction type not supported'}
為什麼我會收到這個?
在文件中,我認為我沒有任何錯誤地遵循了程式碼。但是,仔細觀察,而在文件中,當您呼叫 sign_tx.rawTransaction 時,它會返回類似這樣的內容
>>> signed_txn.rawTransaction HexBytes('0x02f8b00180843b9aca0084773594008301117094fb6916095ca1df60bb79ce92ce3ea74c37c5d35980b844a9059cbb000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d3590000000000000000000000000000000000000000000000000000000000000001c001a0cec4150e52898cf1295cc4020ac0316cbf186071e7cdc5ec44eeb7cdda05afa2a06b0b3a09c7fb0112123c0bef1fd6334853a9dcf3cb5bab3ccd1f5baae926d449')
我從我的程式碼中看到的是這個
print(signed_txn.rawTransaction,type(signed_txn.rawTransaction)) b'\x02\xf9\x01\xce8"\x82u0\x83.....', <class 'hexbytes.main.HexBytes'>
為什麼我的程式碼返回不同的東西?
順便說一句,在簽署交易的上一步中,我注意到在範例中他們使用這樣的私鑰
private_key = b"\xb2\\}\xb3\x1f\xee\xd9\x12''\xbf\t9\xdcv\x9a\x96VK-\xe4\xc4rm\x03[6\xec\xf
而我的作為字元串傳遞。我需要這樣做
bytes.fromhex(thg.metamask)
嗎?這是錯誤的根源還是完全不同的東西?
我認為您的錯誤與十六進制/二進制轉換無關,因為這主要由 web3 處理。
您可以使用以下命令輕鬆查看 python 中的十六進製版本
.hex()
h = '935479cfcb8d9b53861f4c6c5e8941ed2787710b289100235dcb6ca1182a2f24' b = b"\x93Ty\xcf\xcb\x8d\x9bS\x86\x1fLl^\x89A\xed'\x87q\x0b(\x91\x00#]\xcbl\xa1\x18*/$" print(b.hex()) >>> 935479cfcb8d9b53861f4c6c5e8941ed2787710b289100235dcb6ca1182a2f24 print(b.hex() == h) >>> True
實際錯誤來自程式碼中某處的不良格式。
可能是
,'maxFeePerGas':277777,'maxPriorityFeePerGas':30000
因為這些主要用於乙太坊,如果我將它們包含在其他鏈上可能會失敗。你應該包括
gas
和gasPrice
如果您仍然有問題,請更改
gas
為gasLimit
您似乎還缺少
chainId
交易中的預設值ETH
確保也添加它..
chain_id_binance = 56 # 0x38 in hex tx = { chainId: w3.utils.toHex(chain_id_binance), ... }