【问题标题】:Web3.givenProvider returns nullWeb3.givenProvider 返回 null
【发布时间】:2019-04-15 01:03:54
【问题描述】:

我正在创建一个 react-app,它与在 rpcport 8545 上运行 geth 的以太坊私有区块链交互。

因此,我使用 web3.js 在我的区块链上获取数据,这是我的代码:

var Web3 = require('web3');
var web3 = new Web3("http://localhost:8545");

在 render() 方法中:

console.log(web3.eth.blockNumber);
console.log(Web3.givenProvider);

它应该在浏览器控制台中显示我当前的 blockNumber 和我正在监听的端口,但是我得到 undefined 和 null,这似乎意味着我没有连接到我正在运行的区块链。

顺便说一句,我的区块链正在使用这条线运行:

geth --datadir ./noeud2 --networkid 100 --port 30301 --rpcport 8545

你知道为什么这不起作用吗?

我一直在关注这个教程:

https://www.codeooze.com/blockchain/ethereum-block-explorer-react-02/

但这对我也不起作用。

【问题讨论】:

    标签: reactjs blockchain ethereum web3 geth


    【解决方案1】:

    在直接调试你的 react 代码之前,最好先从一个简单的基于 html 的应用程序开始,然后尝试查询你的私有以太坊链。为此,请按照以下步骤操作

    1. 创建以下 index.html 文件

    index.html

    <!DOCTYPE html>
    <html lang=”en”>
    <head>
         <meta charset=”UTF-8">
         <meta name=”viewport” content=”width=device-width, initial-scale=1.0">
         <meta http-equiv=”X-UA-Compatible” content=”ie=edge”>
         <title>Document</title>
         //provide the location of web3 file
         <script src=”./node_modules/web3/dist/web3.min.js”></script>
    
    </head>
    <body>
        <div class=”container”>
             <h1>Given below Ethereum address</h1>
             <div id=”AccountAddress”></div>
    
    <script src=”https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
    <script>
    
    
      if (typeof web3 !== ‘undefined’) 
    {
     web3 = new Web3(web3.currentProvider);
     } 
    else 
    {
     // set the provider you want from Web3.providers
    web3 = new Web3(new Web3.providers.HttpProvider(“http://localhost:8545”));
     }
    
     $(“#AccountAddress”).html(web3.eth.accounts[0]);
    
     </script>
    </body>
    </html>
    
    1. 当您在浏览器中打开 index.html 文件时,如果未显示第一个帐户地址,则表示您在连接到刚刚拆分的 geth 以太坊区块链时出现问题。

    使用 Geth,您可以尝试使用以下配置来启动您的以太坊

    geth --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --nodiscover --networkid "$NETWORKID" --datadir ~/.ethereum_experiment --genesis ~/genesis_block.json
    

    或者,您也可以尝试使用 Ganache CLI (TestRPC) 而不是 Geth

    Ganache CLI 可以使用以下命令安装

    npm install -g ganache-cli
    

    完成后,运行以下命令启动它:

    ganache-cli 
    

    如果你觉得没有web3也可以试试下面的方法

    使用以下命令安装 web3.js

    npm install ethereum/web3.js — save
    

    现在您可以尝试先使用 Remix IDE 连接到刚启动的 Ganache CLI。

    打开http://remix.ethereum.org,点击运行选项卡,然后将环境下拉菜单从Javascript VM更改为Web3 Provider。

    点击“OK”,然后指定 testrpc/ganache-cli localhost 地址(默认为http://localhost:8545

    现在,我们不再在 Remix 中的 Javascript VM 中进行部署和测试,而是在您的计算机上使用 Ganache CLI 客户端。

    先尝试上述步骤,然后对您的输出进行评论。

    【讨论】:

    • 嗨!我已尝试使用您的 html 代码,即使您的配置开始,它也不起作用。事实上,我必须使用 Geth 来实现我的代码,这是我项目的一部分。
    • 无论如何,非常感谢,我想我设法绕过了这个问题,首先使用一个与我的区块链通信的 python 脚本,然后使用套接字将一些数据发送到一个 js 程序,对于它实际上在做什么,但对于第一个版本来说会很好!再次感谢您!
    【解决方案2】:

    web3的初始化应该是这样的: var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));

    【讨论】:

    • 您确定您的代码在浏览器中执行吗?文档指出它将设置为in an Ethereum compatible browser。还是根本没有初始化?在这种情况下,您可以尝试调试它以确定会发生什么。
    • 我不是反应专家,所以我真的不知道代码是否在浏览器中执行,我会听从你的建议并调试它!谢谢
    • 尽量不要在render函数中。如果您希望它在浏览器中执行,请将代码放在单独的脚本文件中,然后将其包含到您的 html 中。
    猜你喜欢
    • 2019-06-26
    • 2022-06-28
    • 1970-01-01
    • 2019-09-13
    • 2018-04-25
    • 2018-02-19
    • 2018-11-04
    • 2018-01-07
    • 1970-01-01
    相关资源
    最近更新 更多