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

web3.py: sending ether to a smart contract

我正在使用 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 return 是交易的哈希值(如 the docs 中所述)。但是我在链上看到调用实际上并没有生效

上面的代码是否明显遗漏了什么?另外,如何获取sendRawTransaction的return来帮助我调试?

您的交易可能从未被开采过,因为您的随机数太高了。帐户的随机数从 0 开始,每发送一笔交易就加 1。

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

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

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

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

仅供参考,如果我没记错的话 web3 对 gas 价格、gas 和 nonce 等几个参数有很好的默认值,每次调用动态 calculated/estimated。

希望对您有所帮助!