我正在进行NFT管理控制;我可以看到,在rinkeby上一切都很好,但是当我在mainnet上调用相同的函数时,我在require上会出现许多错误。代码是在混合Ide上编译的;
下面是一个示例:
mapping(address => mapping(uint => uint8) public handledNfts;
mapping(bytes32 => uint8) public usedHashes;
function create(address contractAddress, uint tokenId, bytes32 hash) external
{
uint8 vCheck = usedHashes[hash];
require(vCheck!=1, "Bad hash"); // sometimes it has false-positive
usedHashes[ hash ] = 1;
uint8 vCheck = handledNfts[contractAddress][tokenId];
require(vCheck!=1, "Already created"); // False-positive sometimes also
handledNfts[contractAddress][tokenId] = 1;
//--- DO SOMETHING ....
}所以,当我使用rinkeby时,任何创建电话都会有效。然而,在mainnet上,create函数返回一个“坏哈希”或“已经关闭”,没有真正的原因,但有时在工作中像一种魅力。
所以,我不知道在mainnet上有什么问题,因为一个代码在testnet上运行得很好?
这很奇怪,因为当开始使用handledNftscontractAddress时,==1不应该在这个位置。不管是否可靠,如果哈希已经被使用,或者nft说已经被管理了,当它不是真的时候。有时起作用,有时不起作用。大多数情况下是行不通的。
create函数中使用的散列对于每个调用总是唯一的。
有人能帮我找到解决这种不稳定的办法吗?它似乎映射对象与一个要求,不正常的工作与我。
我直接通过remix编译代码,使用的是https://remix.ethereum.org/#optimize=true&runs=200&evmVersion=null&version=soljson-v0.8.15+commit.e14f2714.js v0.8.15
同样令人吃惊的是,我被迫使用变量来访问映射对象,然后使用该变量;因此,这样的代码在很多时候对我来说都是错误的:
require(usedHashes[hash]!=1, "Hash already used"); <-- buggy on mainnet有什么帮助吗?
发布于 2022-08-10 18:25:30
我知道发生了什么。我被一辆MEV机器人抢在前面。它检测到一个ETH事务是从我的智能合同中发送的,并且比我的要早发送了事务的副本猫。
我已经采取了反击措施来避免它。现在没事了。
https://stackoverflow.com/questions/73043803
复制相似问题