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

时间:2019-10-03 11:59:46

标签: python ethereum web3

我正在使用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的返回值来帮助我进行调试?

2 个答案:

答案 0 :(得分:0)

您的交易可能从未被挖出,因为您的现时价值太高了。帐户的随机数从0开始,并且每次发送的交易正好增加1。

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

答案 1 :(得分:0)

即使您的代码可能失败,也会生成事务。您必须向矿工支付执行可能会修改区块链的代码的费用,并且在执行过程中发生故障的情况下,可能会向您返还剩余的天然气,但是无论如何都会创建交易,因此其哈希值会返还给您。

因此,在applyFeeding内部执行可能会失败。它会检查该调用中的一些内容,以防万一:

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

仅供参考,如果我没记错的话,web3会很好地使用多个参数,例如天然气价格,天然气和随机数,这些参数是根据每次通话动态计算/估算的。

希望对您有帮助!