[英]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.