---------支持作者请转发本文-----------本文主要介绍用web3.js访问以太坊节点的几种方式,主要包括HTTP和Web两种访问方式。1. 什么是Web3.jsWeb3.js是一套用JavaScript实现的API,用于与以太坊节点进行通信,并通过以太坊节点操作以太坊网络。Web3.js内部使用JSON-RPC协议与以太坊节点(geth和其他类型的节点)进行通信。JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。 该协议主要定义了一些数据结构及其相关的处理规则。允许运行在基于Socket、HTTP等诸多不同消息传输环境的同一进程中使用JSON作为数据格式。Web3.js将所有的JSON-RPC API封装成JavaScript API。Web3.js可以与所有种类的、支持JSON-RPC协议的以太坊节点通信。2. 安装Web3.js安装Web3.js之前需要先安装Node.js,读者可以到下面的页面下载Node.js的最新版,下载后直接安装即可,非常简单。Node.js支持Windows、Mac OS X和Linux。

https://nodejs.org

使用下面的命令安装Web3.js的最新版本。

npm install web3

如果想安装Web3.js的特定版本,可以使用下面的命令。

npm install web3@0.20.6

上面的命令安装Web3.js的0.20.6版本。如果读者觉得npm安装比较慢,可以先执行下面的代码安装cnpm,然后使用cnpm安装web3以及其他模块会非常快。cnpm是taobao做的npm国内镜像。

npm install -g cnpm --registry=https://registry.npm.taobao.org

成功安装cnpm后,可以使用下面的命令安装Web3.js 0.20.6。

cnpm install web3@0.20.6

下面验证一下Web3.js是否安装成功。安装完Web3.js后,在终端执行node命令,会进入Node.js的交互环境(REPL),然后输入下下的代码。

require('web3')

执行上面的代码后,如果输出如图1所示的内容,表明Web3.js已经安装成功。

图1  测试Web3.js是否安装成功在Node REPL中输入如下的代码,可以查看Web3.js的版本。> var Web3 = require('web3')undefined> var web3 = new Web3()undefined> web3.version.api'0.20.6'前面代码的执行效果如图2所示。

图2 查看Web3.js的版本号从图2的输出结果可以看出,Web3.js最新的版本号是0.20.6。3连接testrpc节点Web3.js的核心工作就是连接以太坊节点,在连接正式的节点之前,先用测试节点testrpc试一下Web3.js API是否能成功工作。使用Web3.js API之前,需要先导入web3模块,代码如下:

var Web3 = require("web3");

Web3是一个类,接下来需要创建Web3类的实例,Web3类的构造方法可以没有参数,也可以指定HttpProvider或IpcProvider对象,这两个对象用于连接以太坊节点,如果不为Web类的构造方法指定参数,那么Web3对象不会连接任何以太坊节点,因此必须依赖以太坊节点的API将无法使用。创建完Web3对象后,并且连接以太坊节点后,就可以通过Web3对象调用Web3.js中的所有API了。下面的例子创建了两个Web3对象,一个连接了testrpc节点,一个未连接testrpc节点。然后使用web3.eth.accounts属性获取并输出testrpc节点自动生成的10个用于测试的账户的地址,最后使用web3.version.api属性获取并输出当前Web3.js的版本号。

//  导入web3模块var Web3 = require("web3");//  创建第1个Web3对象,并通过HttpProvider对象连接testrpc节点var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));//  获取并输出testrpc中所有的测试账号console.log(web3.eth.accounts);//  获取并输出当前Web3.js的版本号console.log(web3.version.api);//  创建第2个Web3对象,该Web3对象没有连接testrpc节点(没有为Web类的构造方法传递参数值)var myWeb3 = new Web3();//  正常输出Web3.js的版本号console.log(myWeb3.version.api);// 将抛出异常// console.log(myWeb3.eth.accounts);

在运行本例之前,应在终端中执行testrpc命令启动testrpc节点。然后开启另外一个终端,并执行node connect.js命令运行本例,输出结果如图3所示。

图3 连接testrpc节点本例在创建第1个Web3对象时使用了HttpProvider类,该类用于指定以太坊节点的IP和端口号(默认是8545)。由于本例是在同一台PC上运行testrpc和connect.js,所以IP使用localhost即可。accounts和api都是Web3.js中的属性,Web3.js中还有很多属性和方法,细节将在本章后面的部分详细介绍。由于第2个Web3对象(myWeb3)没有通过HttpProvider对象指定testrpc节点的IP和端口号,所以该Web3对象并没有真正连接testrpc节点,所以有部分Web3.js API是无法调用的。例如,调用第2个Web3对象的myWeb3.eth.accounts属性就会抛出异常。而调用myWeb3.version.api属性没有任何问题,因为获取Web3.js的版本号与以太坊节点无关,所以不需要连接以太坊节点。4. 连接geth节点geth是以太坊官方提供的节点,可以使用geth创建私有区块链。本节会利用geth创建一个私有区块链,并通过Web3.js API连接geth节点,然后操作该私有区块链。为了创建私有区块链,首先需要一个区块配置文件,代码如下:block.json

{    "config":    {        "chainId":15,        "homesteadBlock":0    },    "difficulty":"20",    "gasLimit":"2100000",}

接下来需要使用geth命令初始化区块链。

geth init block.json --datadir private

这行命令的作用是在当前目录创建一个名为private的子目录,在该目录下还有两个子目录:keystore和geth。其中keystore目录用于存储当前节点创建的账户文件,geth目录用于存储当前节点需要的其他数据。最后需要通过下面的命令启动以太坊节点。

geth --rpc --rpcaddr 0.0.0.0  --rpcport 8545 --datadir private

其中--rpc命令行参数表示允许远程连接geth节点,--rpcaddr命令行参数用于指定可以连接geth节点的IP,这里是0.0.0.0,也就是允许任何IP连接geth节点。--rpcport命令行参数用于指定geth节点的端口号,本例是默认端口号(8545),--datadir命令行参数指定了当前geth节点存储数据的根目录,本例是前面初始化私有链时创建的private目录。下面编写用于连接geth节点的代码这个例子通过Web3.js API连接geth节点,并输出geth节点中的账户。connect_geth.js

var Web3 = require("web3");var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));console.log(web3.eth.accounts);

前面两段代码完全一样,只是前者连接的是用于测试的testrpc节点,后者连接的是geth节点。由于geth节点默认并没有生成任何账户,所以执行第2端代码不会输出任何的账户。现在使用下面的命令创建两个新账户(每执行一次命令建立一个账户)。

geth account new --datadir private

要注意,在创建新账户时,必须使用--datadir指定geth节点用于存储数据的根目录,否则geth命令会将账户文件保存到默认的目录中。在创建账户的过程中需要输入和确认密码,创建账户的过程如图4所示。

图4 创建两个新账户每成功创建一个账户,就会返回该账户的地址。现在执行第2段代码,会输出刚才创建的两个账户的地址,如图5所示。在private/keystore目录中也会多了两个账户文件。

图5 输出两个新创建的账户地址也可以在其他的PC上使用IP访问本机的geth节点,假设本机的IP是192.168.31.8,那么可以使用http://192.168.31.8:8545来连接本机的geth节点。这个例子在另一台机器(Windows)上通过IP连接本机的geth节点,并输出该节点中所有账户的地址。connect_geth_remote.js

var Web3 = require("web3");var web3 = new Web3(new Web3.providers.HttpProvider('http://192.168.31.8:8545'));console.log(web3.eth.accounts);

在执行本例之前,需要将192.168.31.8修改成自己的geth节点所在机器的IP地址。程序的运行结果如图6所示。

图6  远程连接geth节点5. HttpProvider与IpcProviderWeb3.js不仅可以通过HTTP与以太坊节点连接,还可以通过ICP(Inter-Process Communication,进程间通信)方式与以太坊节点连接。HTTP连接方式通过HttpProvider对象指定连接信息,这一点在前面已经讲过,IPC方式需要通过IpcProvider对象指定连接信息。IpcProvider类的构造方法需要一个ipc文件,在启动geth节点后,从日志输出信息中可以找到这个ipc文件,本例是geth.ipc,如图7所示。

图7  geth.ipc文件的路径从图7所示的日志信息看出,geth.ipc文件的路径是/chapter4/private/geth.ipc。所以需要使用下面的代码创建IpcProvider对象。

var net = require('net');new Web3.providers.IpcProvider("/chapter4/private/geth.ipc",net)

下面的例子同时使用HTTP和IPC的方式与geth节点连接,并调用getAccounts函数用异步的方式获取geth节点的账户。connect_http_ipc.js

var Web3 = require("web3");var net = require('net');//  通过HTTP方式连接geth节点var web3 = new Web3(new Web3.providers.HttpProvider('http://192.168.31.8:8545'));//  通过getAccounts函数用异步的方式获取并输出geth节点账户的地址web3.eth.getAccounts(      function(error, response){         console.log(response)    })//  通过IPC方式连接geth节点web3 = new Web3(new Web3.providers.IpcProvider('/chapter4/private/geth.ipc',net));//  通过getAccounts函数用异步的方式获取并输出geth节点账户的地址web3.eth.getAccounts(      function(error, response){         console.log(response)      })

首先启动geth节点。然后使用下面的命令运行本例。

node connect_http_ipc.js

运行本例后,会在终端输出geth节点的账户地址,如图8所示。

图8 用两种方式输出的geth节点账户地址往期回顾:区块链与以太坊实战(1):基础知识区块链与以太坊实战(2):还不知道区块链的用处?那就out了!你的同龄人已经财务自由了,你还在纠结要不要学区块链区块链与以太坊实战(4):部署和运行智能合约对本文感兴趣,可以加李宁老师微信公众号(unitymarvel):

关注  极客起源  公众号,获得更多免费技术视频和文章。

js 文件不让通过地址访问_区块链与以太坊实战(5):访问以太坊节点的N中方式...相关推荐

  1. java计步器算法_区块链+计步运动项目,主要采用以太坊、智能合约、springboot以及小程序等技术...

    runlife_api 项目介绍 区块链+计步运动项目,主要采用以太坊.智能合约.springboot以及小程序等技术 兑换步数算法 按照每总量剩余一半的时候兑换难度增加一倍,如目前按照平均步数511 ...

  2. 如何使用区块链币收款地址找合约地址?_区块链技术学习指引

    本文原文链接 本文为博客文章索引,小白必看.有新文章时会更新本文,建议大家加入收藏夹中,如果你觉得本站不错,欢迎你转发给朋友. 引言 给迷失在如何学习区块链技术的同学一个指引,区块链技术是随比特币诞生 ...

  3. 如何查区块链项目的服务器地址,怎么查区块链服务器地址

    怎么查区块链服务器地址 内容精选 换一换 区块链服务状态为"异常".•排查项一:区块链依赖的集群.服务器.存储等资源是否正常.•排查项二:云服务器节点资源规格不足.排查项一:区块链 ...

  4. 问道区块链_区块链学习_v1.0.0_持续更新。。。

    本系列内容参考图 创建 共识网络 调用 部署 挖矿 消耗 编写 超级链组件 节点 多节点 账号 智能合约 合约账号 燃料耗品代币 开发者 区块 尊重原创,转载请注明出处https://blog.csd ...

  5. gossip 区块链_区块链中的P2P

    区块链中P2P介绍 p2p是什么 为什么区块链需要P2P 比特币.以太坊.超级账本和EOS的P2P对比 P2P是什么 P2P作为区块链网络中去中心化的标识 P2P全称对等式网络(peer-to-pee ...

  6. 区块链开发指南_区块链软件开发详解

    开发业务层区块链应用 Hyperledger fabric目前支持java,nodejs,go和python语言的sdk,供用户选择用不同的语言开发上层应用,使用相应的sdk调用部署在区块链上的链码. ...

  7. 人工智能区块链智能合约_区块链和人工智能正在彻底改变这10个行业

    人工智能区块链智能合约 by Mariya Yao 姚iya(Mariya Yao) 区块链和人工智能正在彻底改变这10个行业 (Blockchain and AI are revolutionizi ...

  8. 区块链组织架构_区块链可以加速开放组织的5种方式

    区块链组织架构 在研究开放的组织原则 (透明度,包容性,适应性,协作性,社区性)以及我们实践这些原则的原因(例如建立致力于目标的人际网络并共享相同的道德标准)之后,我开始想知道这些原则如何会受到越来越 ...

  9. sdk版本过低怎么办_区块链中的“块”是什么?区块链网络拥堵怎么办?-Gemini双子新约...

    区块链中的"块"是什么? 比特币是基于区块链的,这一点大家都知道.但是这个区块链是什么呢?更准确地说,区块链的各个组成部分是什么呢? 区块链是一个数据块.每个块可以看作是分类帐中的 ...

最新文章

  1. 为什么链接库的顺序有时会导致GCC错误?
  2. python介绍和用途-Python --- Python的简介
  3. VTK:选定的顶点和边用法实战
  4. 风险评估资产重要性识别_如何有效的进行风险评估?
  5. ASIHTTPRequest详解 [经典3]
  6. 湖南工大11级C语言网上作业,湖南工大11级C语言网上作业之《最简单的程序设计》.docx...
  7. OSChina 周四乱弹 ——巴叔是雾霾治理小先锋
  8. Hudson:一款持续构建工具
  9. ajax切换明星头像!
  10. ASP.NET Core Web读取appsettings.json中的配置
  11. 易筋SpringBoot 2.1 | 第八篇:Mybatis访问MySQL
  12. 【Maven使用】IDEA使用Maven进行文件打包+命令含义+错误分析
  13. 深入NXP蓝牙SDK开发(x)---深挖BLE蓝牙协议栈配对过程(3)_密钥分发
  14. Codeforces 1110D Jongmah dp
  15. ORA-00054 锁表
  16. yii ajax验证失败返回提示,Yii使用ajax验证显示错误messagebox的解决方法
  17. acm国家集训队论文(1999-2009)
  18. Revit API: Dimension 尺寸标注
  19. rk3568can设置异常
  20. (P24)管道:管道的读写规则

热门文章

  1. 3Blue1Brown:“线性代数的本质”完整笔记
  2. 计算机网络(本科)形成性,《计算机组网技术》作业形考网考形成性考核-国家开放大学电大本科...
  3. 目标检测- YOLO v1--You Only Look Once
  4. LeetCode 1114. Print in Order--Java解法--并发问题
  5. 德国虚拟主机 linux,细说Linux虚拟主机的搭建及配置
  6. RabbitMQ(七):RabbitMQ 消费端限流、TTL、死信队列是什么?
  7. AFNetworking 源代码分析
  8. xml提示无法连接到远程服务器,异步调用WebService时,如何捕捉“无法连接远程服务器”异常...
  9. php虚拟内存设置,虚拟内存有什么用
  10. 数控机床编程用c语言,基于C语言数控机床智能后置处理程序的制作-(1).pdf