我有以下合同方法:
function setTokenURI(uint256 tokenid, string memory uri) public {
require(bytes(uri).length != 0, "Cannot set an empty URI");
_setTokenURI(tokenid, uri);
}当我从我的web3py脚本调用它时:
contract.functions.setTokenURI(token, "https://gateway.pinata.cloud/ipfs/2jh2kl3j4h23jk4h2").call()我没有收到任何错误,但是URI没有设置。我根据与web3py接口的约定运行其他函数,它们都按预期工作。
为什么这个调用不更新NFT tokenURI?
发布于 2021-07-11 08:42:56
tl;dr:而不是使用contract.functions.setURI(...).call(),而是使用contract.functions.setURI.transact()
web3库调用只读函数的方式与调用状态变化函数的方式有很大不同。对于前者,不需要发送值,也不需要用私钥签名。但是,当状态被更改时,就会进行事务处理。改变状态需要通过网络发送以太来支付天然气,这需要形成一个由私钥签名的交易。
这两种与链交互的方式反映在与web3.py:call()和transact()可以使用的两个不同后缀上。call()用于从链中读取数据(view或pure函数),而transact()用于状态更改函数。
根据您的web3.py设置,您可能需要向您的transact()调用添加详细信息。transact()可以将一个对象作为参数,在该参数中您可以指定tx应该来自什么地址、发送的以太数量等等。transact()的文档是这里,而您可以在对象arg中放置的文档是这里 (对象遵循transaction对象的格式,这里概述了这个格式)。
希望这能帮上忙!
https://ethereum.stackexchange.com/questions/103298
复制相似问题