簡體   English   中英

solidity v0.8.15:ETH 主網上的需求和映射問題

[英]solidity v0.8.15 : require & mapping issues on ETH mainnet

我正在制定一份 NFT 管理合同; 我可以看到在 rinkeby 測試網上一切正常,但是當我在主網上調用相同的函數時,我得到了許多錯誤的錯誤錯誤。 代碼在 REMIX 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 時,任何創建調用都會起作用。 但是在主網上,創建 function 會無緣無故地返回“錯誤哈希”或“已關閉”,但有時會像魅力一樣工作。

所以我不知道在測試網中運行良好的代碼在主網上有什么問題?

這很奇怪,因為在開始使用合同時,handledNfts[contractAddress][tokenId] 不應該是 ==1。 然而,solidity 表示 hash 已被使用或 nft 表示已被管理,但事實並非如此。 有時它有效,有時則無效。 大多數時候它不會

在創建 function 中使用的 hash 對於每個調用始終是唯一的。

有人可以幫我找到解決這種不穩定性的方法嗎? 似乎帶有 require 的映射對象不適用於我。

我通過 remix 直接編譯代碼,使用solidity v0.8.15 https://remix.ethereum.org/#optimize=true&runs=200&evmVersion=null&version=soljson-v0.8.15+commit.e14f2714.js

奇怪的是,我被迫使用變量來訪問映射 object 然后使用該變量; 所以像這樣的代碼對我來說是錯誤的:

require(usedHashes[hash]!=1, "Hash already used"); <-- buggy on mainnet

請問有什么幫助嗎?

我明白發生了什么。 我被一個 MEV BOT 搶先一步。 它檢測到我的智能合約發送了一筆 ETH 交易,並比我的更早發送了該交易的副本。

我已經采取了反制措施來避免它。 現在好了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM