我有一个从openzeppelins ownable.sol继承的市场合同,我想检查对listNFT函数的访问,只由合同所有者完成。我尝试了onlyOwner修饰符,这个修饰符不起作用,引发了“调用者没有所有者”错误。然后,我试图理解msg.sender和owner()的确切值,并构建自己的事件来跟踪msg.sender和owner的值。您可以在这里看到相关代码。
# Event to keep track of owner and caller
event FunctionCall(
address caller,
address owner
);
// List the NFT on the marketplace
function listNft( uint256 _tokenId, uint256 _price) public payable nonReentrant {
# Emit event to inspect caller and owner
emit FunctionCall(msg.sender ,owner());
require(_price > 100, "Price must be at least 100 wei");
# This line doesn't let me through and evaluates to false
# require(msg.sender == owner(), "Must be owner");
...more code
}当我在不使用require语句的情况下调用合同时,我可以检查聚合扫描上的事件,这提供了以下内容
事件显示msg.sender和所有者是相同的地址,之后的require语句如何计算为false?
我测试了强制转换msg.sender和owner()到address(msg.sender)和address(owner()),但是它没有工作。我遗漏了什么?
发布于 2022-09-18 08:18:10
签名方法有问题。早些时候,我像这样用Web3.py手动签署了事务
transaction = contract.functions.transferFrom(w3.toChecksumAddress(<PublicKey>),w3.toChecksumAddress(to), token_id).buildTransaction({
'from': acct.address,
'nonce': w3.eth.get_transaction_count(acct.address),
})
gas = w3.eth.estimate_gas(transaction)
transaction.update({'gas': int(gas*1.5)})
signed_transaction = w3.eth.account.sign_transaction(transaction, private_key=<PRIVKEY>)
tx_hash = w3.eth.send_raw_transaction(signed_transaction.rawTransaction)
tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash)从web3.py切换到.transact()方法和中间件()之后,一切都正常。我仍然感到困惑,事件给出了正确的msg.sender在多边形扫描,但只要一切正常工作,我不会抱怨:)
https://stackoverflow.com/questions/73756010
复制相似问题