【问题标题】:web3.py: sending ether to a smart contractweb3.py:将以太币发送到智能合约
【发布时间】:2019-10-03 11:59:46
【问题描述】:

我正在使用web3.py 与私有以太坊区块链进行交互。我想在智能合约中调用以下函数:

    uint256 public cookiePrice;

    function feed(string memory message) public payable {
        require(cookiePrice <= msg.value);
        applyFeeding(msg.sender, message);
    }

我想这样称呼它:

    price = contract.functions.cookiePrice().call()
    txn = contract.functions.feed("my message").buildTransaction({
      'chainId': 13999911119,
      'gas': 70000,
      'value': price,
      'gasPrice': w3.toWei('8', 'gwei'),
      'nonce': int(time.time())
    })
    signed_txn = w3.eth.account.sign_transaction(txn, private_key=private_key)
    w3.eth.sendRawTransaction(signed_txn.rawTransaction)

这似乎成功了,sendRawTransaction 返回事务的哈希值(如the docs 中所述)。但是我可以在链上看到调用并没有真正生效。

上面的代码有什么明显的缺失吗?还有,我怎样才能得到sendRawTransaction的返回帮助我调试呢?

【问题讨论】:

    标签: python ethereum web3


    【解决方案1】:

    您的交易可能从未被挖掘,因为您的 nonce 太高了。一个账户的 nonce 从 0 开始,每发送一个交易就增加 1。

    您可以使用w3.eth.getTransactionCount 为您正在使用的帐户获取正确的随机数。

    【讨论】:

    • 谢谢!我已将nonce 更新为w3.eth.getTransactionCount(public_key),但仍然没有任何反应。你知道是否有办法对signed_txn 的内容进行解码以验证它的外观是否正确?
    • 作为更新:交易确实看起来很成功,因为我可以通过 geth 的 getTransactionByHash 看到它们。
    【解决方案2】:

    即使您的代码可能失败,也会生成交易。您必须为执行可能修改区块链的代码向矿工付费,如果执行过程中发生故障,剩余的 gas 可能会返还给您,但无论如何都会创建交易,因此它的哈希会返回给您。

    所以,applyFeeding 内部的执行可能会失败。为了以防万一,我会检查该通话中的一些内容:

    • price 的类型是什么?如果是int 我们很好。
    • 您没有指定from,因此使用默认帐户。确保这是您想要的,并且该帐户有足够的资金,并且它的私钥是您用来签名的那个。
    • 检查applyFeeding 内部的潜在问题,特别是与谁是发件人有关,因为它是该函数的参数。
    • 检查您使用的燃气量是否足够,并且您没有用完燃气。

    仅供参考,如果我没记错的话,web3 对几个参数(如 gas 价格、gas 和 nonce)有很好的默认值,这些参数是每次调用动态计算/估计的。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多