Web3 - 提供者未设置或无效

Posted

技术标签:

【中文标题】Web3 - 提供者未设置或无效【英文标题】:Web3 - Provider not set or invalid 【发布时间】:2022-01-05 15:27:27 【问题描述】:

我正在尝试将我的前端 (Nextjs) 与我在 Rinkeby 网络 (token on etherscan) 上的合同连接起来。我是加密领域的新手,所以我不确定它在说什么提供者......我认为连接是通过 useWeb3 钩子建立的,一切都由 Infura 处理。我还想指出,我可以使用此设置连接到以太坊网络,但不能连接到以太坊网络上的令牌。

我的前端有这个设置:

./src/pages/index.tsx:

import type  NextPage  from "next";
import React,  useEffect, useState  from "react";
import  useWeb3  from "@openzeppelin/network/react";
import  createContract  from "../lib/herbie";

const Index: NextPage<IndexProps> = () => 
  const  networkId, networkName, providerName, accounts, lib  = useWeb3(
    `wss://rinkeby.infura.io/ws/v3/$process.env.INFURA_PROJECT_ID`
  );

  useEffect(() => 
    const fetchContract = async (): Promise<any> => 
      if (networkId === 4 && accounts.length > 0) 
        const contract = await createContract();

        console.log( contract );

        console.log(contract.methods.balanceOf(accounts[0]).call()); // ERROR HERE
      
    ;

    fetchContract();
  , [accounts, networkId]);

  return (
    <div>
      <p>
        JSON.stringify(
          networkId,
          networkName,
          providerName,
          accounts,
        )
      </p>
    </div>
  );
;

export default Index;

./src/lib/herbie.ts:

import Web3 from "web3";

const getAbi = async (): Promise<string> => 
  const abi = await (await fetch("/abi.json")).json();

  return abi;
;

const createContract = async (): Promise<any> => 
  const herbieContract = new Web3().eth.Contract;

  return new herbieContract(
    (await getAbi()) as any,
    "0xe71c56d861f90bf96c9f006d25ce91da97ddb238"
  );
;

export  getAbi, createContract ;

我收到以下错误:

我的元掩码:

谢谢

【问题讨论】:

你为什么这么抽象?你创建了一堆不必要的函数。只需内联它。看看你为了展示你的问题而不得不发布的代码量...... 我知道,因为就像我说的,我是 web3/crypto 领域的新手,我不确定这个错误来自哪里。另外,我是抽象的,因为我是一名前端开发人员,我喜欢让我的逻辑远离我的 UI。 您应该将逻辑提取到钩子中。您的抽象使推理代码变得更加困难。这是不必要的。 哦,是的,我只是在胡闹试图进入这些东西。 【参考方案1】:

您需要按照documentation 中的说明将提供程序传递到合同实例中

const contract = new Web3().eth.Contract(abi, address);
Contract.setProvider(`wss://rinkeby.infura.io/ws/v3/$process.env.INFURA_PROJECT_ID`);

几乎所有生产代码都使用 ethersjs 而不是 web3js 顺便说一句。

它看起来像这样:

const contract = new Contract(address, abi, library);

【讨论】:

好的,我试一试。什么是图书馆?这和useWeb3钩子返回的一样吗? 没错——库是从 web3 钩子返回的。另外,考虑使用 useDapp 库。它包含来自 useWeb3 库的进一步抽象,并且更加用户友好。

以上是关于Web3 - 提供者未设置或无效的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的错误:无效地址 web3.currentProvider MetaMask

iframe、跨域 cookie、p3p 策略和 safari 错误:未提供所需的防伪令牌或无效

401 - 未授权: 由于凭据无效,访问被拒绝。 您无权使用所提供的凭据查看此目录或页面。

提供了无效的请求 URI。请求 URI 必须是绝对 URI 或必须设置 BaseAddress

如何将 BSC wesocket 提供程序与 Web3J 或 Web3js 连接

metamask/web3 连接问题