我正在使用Hardhat黑客马拉松模板并调用我的智能合约(地址1c0,为了清晰起见缩短地址)函数MyContract#addProduct
问题:我在调用addProduct函数之前和之后看到一堆奇怪的函数调用。执行这些奇怪调用的帐户(266)是HH在启动时生成的第一个地址。MyContract被部署在1c0。
下面是来自Hardhat节点终端的日志和我在//
后面的注释这些呼叫是什么,它们起源于哪里?
更新:我朋友的建议是,可以是MetaMask出于任何目的查询智能合约。还是要调查一下。
// I don't know who's calling it
eth_call
Contract call: MyContract#<unrecognized-selector>
From: 266
To: 1c0
// My fallback is logging
console.log:
MyContract: Fallback called
// I don't know who's calling it
eth_call
Contract call: MyContract#symbol
From: 266
To: 1c0
// I don't know who's calling it
eth_blockNumber
eth_getBalance (3)
eth_call
WARNING: Calling an account which is not a contract
From: 266
To: e86
// This is what I call from UI
eth_getTransactionCount
eth_blockNumber
eth_sendRawTransaction
Contract call: MyContract#addProduct
Transaction: 740
From: 5ab
To: 1c0
Value: 0 ETH
Gas used: 414218 of 414218
Block #23: 925
console.log:
MyContract:addProduct()
eth_getTransactionReceipt
eth_blockNumber
eth_getTransactionReceipt
eth_blockNumber
eth_getBlockByHash
// I don't know who's calling it
eth_call
Contract call: MyContract#<unrecognized-selector>
From: 266
To: 1c0
console.log:
MyContract: Fallback called
// I don't know who's calling it
eth_call
Contract call: MyContract#<unrecognized-selector>
From: 266
To: 1c0
console.log:
MyContract: Fallback called
经过进一步调查,我认为元掩码会自动调用EIP165 "supportsInterface"函数。
我在我的合约中添加了一些console.log,发现它们匹配了我的合约支持ERC721接口,ERC721元数据接口和ERC1155接口的检查。
在我的本地hardhat开发中,这些未处理的调用非常烦人,有点令人不安,我完全不明白为什么metamask需要制作它们。
添加
receive() external payable {} // to support receiving ETH by default
fallback() external payable {}
将使那些日志消失。
在你的情况下,或者在一般情况下,任何人都可以调用你没有定义的函数的契约,fallback
将捕获它们。
如果调用者想调用一个不可用的函数,则执行fallback
函数。您还可以使用它的输入参数来查看正在调用的内容,然后采取特定的操作。文档:
https://docs.soliditylang.org/en/v0.8.12/contracts.html fallback-function
Hardhat黑客马拉松样板
前端应用程序定义了一个定期检查-查询令牌余额每秒。
假设你的合约没有实现balanceOf(address)
函数,调用重定向到fallback()
函数。