繁体   English   中英

web3.py:将以太币发送到智能合约

[英]web3.py: sending ether to a smart contract

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

    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返回交易的 hash (如文档中所述)。 但是我可以在链上看到调用实际上并没有生效。

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

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

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

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

因此,在applyFeeding中执行可能会失败。 为了以防万一,我会在那个电话中检查一些事情:

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

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

我希望它有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM