微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MetaMask 合约交互永远排队

如何解决MetaMask 合约交互永远排队

我在 Matic Mumbai 测试网上部署了一个智能合约,我正在尝试使用 Web3 从 React Web 应用程序与其交互。我的智能合约中有一个名为 buySucc(多肉植物的缩写)的应付函数。当我使用 Web3 从我的 React Web 应用程序调用函数时,MetaMask 会弹出我能够确认的交易。之后,我在元掩码中看到一个待处理的发送交易和一个排队的合约交互。几秒钟后,我在前端得到 Error: Receipt missing or blockHash null,合约交互在 MetaMask 中永远排队。 我还使用 ganache-cli 将智能合约部署到了孟买测试网的本地分支。使用本质上相同的函数调用运行一个简单的 Node.js 脚本可以完美运行,这让我感到非常困惑。
在查看 https://ethereum.stackexchange.com/questions/43691/metamask-issue-with-payable-transactions-using-truffle-and-web3 后,我尝试将 gas 限制提高到 2000000,但这没有用。

这是我的代码
智能合约:SuccOwnership.sol

...

function _createSucc(
        uint256 _parent1Id,uint256 _parent2Id,uint256 _genes,address _owner
    ) internal returns (uint256) {
        uint256 watersNeededindex = 0;
        if (_parent1Id != 0) {
            watersNeededindex = succs[_parent1Id].watersNeededindex / 2;
        } else if (_parent2Id != 0) {
            watersNeededindex = succs[_parent2Id].watersNeededindex / 2;
        }
        succs.push(
            Succ(
                _genes,uint64(block.timestamp),uint8(watersNeededindex),false
            )
        );
        uint256 _newSuccIndex = succs.length - 1;
        _safeMint(_owner,_newSuccIndex);
        emit newSucc(_owner,_newSuccIndex,_parent1Id,_parent2Id,_genes);
        return _newSuccIndex;
        // return 0;
    }

    function buySucc(uint256 _genes,uint256 _price)
        external
        payable
        returns (uint256)
    {
        require(msg.value == _price,"Wrong price paid for succulent");
        return _createSucc(0,_genes,msg.sender);
    }

...

(作为旁注,我知道价格是外部 buySucc 函数的参数并不安全和奇怪,但我还没有开始实施价格确定:')) App.js:

import {
    getAccount,getSuccContract,buySucc,getpotContract,getpotAdmin,getSuccIds,} from './backend/backend.js'
/* more imports */

export default function App() {
    const web3 = new Web3(Web3.givenProvider || "https://rpc-mumbai.matic.today/")

    const default_plants = new Array(12).fill(null);

    const [plants,setPlants] = useState(default_plants);
    const [pots,setpots] = useState();
    const [account,setAccount] = useState();
    const [succContract,setSuccContract] = useState();

    async function setupBlockchain() {
        const account = await getAccount(web3)
        setAccount(account);
        const succContract = await getSuccContract(web3);
        setSuccContract(succContract);
        const potContract = await getpotContract(web3);
        const admin = await getpotAdmin(potContract);
        console.log(admin)
    }
    
    //Works
    async function getPlants() {
        if(!account || !succContract) {
            console.log('connect account first')
        }
        const plantIds = await getSuccIds(web3,account,succContract);
        console.log(plantIds)
    }
    
    //Doesn't work
    async function buyPlant() {
        if(!account || !succContract) {
            console.log('connect account first')
        }
        buySucc(web3,succContract,0)
    }

    return (...);

后端.js:

import {
    SUCC_OWNERSHIP_ADDRESS,SUCC_OWNERSHIP_ABI,POT_OWNERSHIP_ADDRESS,POT_OWNERSHIP_ABI
} from "../config.js"

export async function getAccount(web3) {
    const accounts = await web3.eth.getAccounts();
    return accounts[0];
}

export async function getSuccContract(web3) {
    return new web3.eth.Contract(SUCC_OWNERSHIP_ABI,SUCC_OWNERSHIP_ADDRESS);
}

//This works
export async function getSuccIds(web3,contract) {
    const succIds = await contract.methods.succsOfOwner(account).call();
    return succIds
}

//This doesn't work
export async function buySucc(web3,contract,dna,price) {
    const newSucc = await contract.methods.buySucc(0,web3.utils.toWei('1')).send({
        from: account,value: web3.utils.toWei('1')
    });
    return newSucc
}

具有排队合约交互的 MetaMask 屏幕截图

Screenshot

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?