我正在使用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
的返回值来帮助我进行调试?
答案 0 :(得分:0)
您的交易可能从未被挖出,因为您的现时价值太高了。帐户的随机数从0开始,并且每次发送的交易正好增加1。
您可以使用w3.eth.getTransactionCount
来获取所使用帐户的正确随机数。
答案 1 :(得分:0)
即使您的代码可能失败,也会生成事务。您必须向矿工支付执行可能会修改区块链的代码的费用,并且在执行过程中发生故障的情况下,可能会向您返还剩余的天然气,但是无论如何都会创建交易,因此其哈希值会返还给您。>
因此,在applyFeeding
内部执行可能会失败。它会检查该调用中的一些内容,以防万一:
price
是什么类型?如果是int
,就可以了。from
,因此使用默认帐户。确保这就是您想要的,并且该帐户具有足够的资金,并且其私钥是您用来签名的私钥。applyFeeding
内部的潜在问题,特别是与谁是发件人有关,因为它是该函数的参数。仅供参考,如果我没记错的话,web3
会很好地使用多个参数,例如天然气价格,天然气和随机数,这些参数是根据每次通话动态计算/估算的。
希望对您有帮助!