Python

不支持 Web3 Python 值錯誤事務類型

  • December 22, 2021

我正在嘗試通過與智能合約的互動發送已簽名的交易,但在發送原始交易時一切都崩潰了。

我的程式碼如下

   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因為這些主要用於乙太坊,如果我將它們包含在其他鏈上可能會失敗。

你應該包括gasgasPrice

如果您仍然有問題,請更改gasgasLimit

您似乎還缺少chainId交易中的預設值ETH

確保也添加它..

chain_id_binance = 56 # 0x38 in hex

tx = {
chainId: w3.utils.toHex(chain_id_binance),
...
}

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