【问题标题】:Transaction is never mined, using web3.py交易永远不会被挖掘,使用 web3.py
【发布时间】:2019-02-21 19:53:10
【问题描述】:

我正在使用 python 3.6、Django 2.1.1、Solidity 和 web3.py v4 开发一个网站。 我想将交易添加到 ropsten 测试网,但交易从未得到确认。代码如下:

amount_in_wei = w3.toWei(questionEtherValue,'ether')
nonce=w3.eth.getTransactionCount(w3.toChecksumAddress(questionairAddress))+1

txn_dict = {
     'to': contractAddress,
     'value': amount_in_wei,
     'gas': 2000000,
     'gasPrice': w3.toWei('70', 'gwei'),
     'nonce': nonce,
     'chainId': 3
}
signed_txn = account.signTransaction(txn_dict)
txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction)

try:
    txn_receipt = w3.eth.waitForTransactionReceipt(txn_hash, timeout=300)
except Exception:
    return {'status': 'failed', 'error': 'timeout'}
else:
    return {'status': 'success', 'receipt': txn_receipt}

【问题讨论】:

  • 2M gas 很多,目前大约是四分之一个区块。你真的需要所有的气体吗?如果没有,您可能会更幸运地获得包含较低 gas 限制的交易。
  • 我将 gas 限制降低到 30K,但 tx_receipt 仍然是 None!
  • questionairAddress == w3.eth.account.privateKeyToAccount(wallet_private_key).address?
  • 这是一个20字节的MetaMask钱包地址
  • 我在 nonce 计算中删除了 +1,它有效!

标签: django web3


【解决方案1】:

啊,正如@yasaman.h 发现的那样,nonce 中有一个错误:

# original:
nonce = w3.eth.getTransactionCount(w3.toChecksumAddress(questionairAddress)) + 1

# should be:
nonce = w3.eth.getTransactionCount(w3.toChecksumAddress(questionairAddress))

事务的nonce 必须等于先前发送的事务的计数。因此,新帐户发送的第一笔交易的nonce 为零。

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 2022-01-05
    • 2021-03-27
    • 2022-01-04
    • 2018-09-19
    • 2021-04-09
    • 2020-12-21
    • 2016-11-08
    • 2018-11-04
    相关资源
    最近更新 更多