连接区块链节点的 JavaScript 库 web3.js

news2024/11/24 1:02:22

文章目录

  • 前言
  • web3.js 介绍
  • web3.js安装
  • web3.js库模块介绍
  • 连接区块链节点
  • 向区块链网络发送数据
  • 查询区块链网络数据

前言

通过前面的文章我们可以知道基于区块链开发一个DApp,而DApp结合了智能合约和用户界面(客户端),那客户端是如何与区块链进行连接交互的、如何调用智能合约的、如何发送一个交易到区块链、如何获取区块链上的数据,这就是本文要介绍的 web3.js。

web3.js 介绍

如下图,区块链网络中的每个节点都会得到一份区块链上所有数据的副本,它们互相通信,实现对公共账本状态的共识。如果要与整个区块链对话,需要连接任意一个节点地址加入该网络,而 web3.js 就是连接节点与区块链对话的一个 js 库,可以与任何暴露了RPC接口、ws 协议的区块链节点(本地或远程节点)连接交互,同时可以结合一些前端技术(如 react),使用户通过页面与区块链交互。

在这里插入图片描述
与 web3.js 相同作用的还有 ethers.js ,web3.js 由基金会开发和维护,因此,有更多的开发人员使用它。

web3.js安装

前置条件:安装 nodejs 环境
node -v
vXX.xx

查看node版本,npm版本:

admin@MacBook-Pro-2 test % node -v
v18.16.1
admin@MacBook-Pro-2 test % npm -v
9.5.1

安装web3.js库:

admin@MacBook-Pro-2 test % npm install web3

added 88 packages in 53s

35 packages are looking for funding
  run `npm fund` for details
npm notice 
npm notice New minor version of npm available! 9.5.1 -> 9.8.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.8.0
npm notice Run npm install -g npm@9.8.0 to update!
npm notice 

web3.js库模块介绍

web3.js库是包含生态系统功能的模块集合。

  • web3-eth:用于区块链和智能合约的交互。
  • web3-shh: 是用于whisper协议,用于p2p和广播通信。
  • web3-bzz: 针对swarm协议的去中心化文件存储。
  • web3-utils:包含对Dapp开发人员有用的帮助函数。

具体使用参考web3.js

连接区块链节点

web3.js库安装好后就可以连接节点了,可以在本地安装一个区块链进行连接,也可以连接主网节点以及测试节点。

  • 本地区块链:ganache,是一个区块链的个人开发环境,可以在上面部署合约、开发程序和进行测试,目的是为了节省大量开发时间。ganache详细的安装教程可以参考这篇博文。
  • 以太测试/主网络:通过 Infura 可以获取连接区块链网络的端点,使用这些端点来与区块链网络交互。

获取到连接节点后就可以通过web3建立连接了,代码如下:

const Web3 = require('web3')
//下面为主网端点,测试端点为'https://ropsten.infura.io/YOUR_INFURA_API_KEY'
const rpcURL = "https://mainnet.infura.io/YOUR_INFURA_API_KEY" 
const web3 = new Web3(rpcURL)

向区块链网络发送数据

区块链中,交易操作是指把数据写入区块链,改变区块链状态的操作。例如,转账、调用写数据的智能合约函数,以及部署智能合约,这些操作都会被看作是交易。

根据区块链工作原理,会使用私钥签名交易数据然后向网络广播。为了签署交易,我们使用 JavaScript 库 ethereumjs-tx 在本地签署交易。

npm install ethereumjs-tx

下面展示一个发送数据的代码示例:

var Tx     = require('ethereumjs-tx').Transaction
const Web3 = require('web3')
const web3 = new Web3('https://ropsten.infura.io/v3/YOUR_INFURA_API_KEY')

//账户地址
const account1 = '0x...' 
const account2 = '0x...' 
// 私钥
const privateKey1 = Buffer.from("", 'hex'

// getTransactionCount 获取从此地址发送的事务数。
web3.eth.getTransactionCount(account1, (err, txCount) => {
  // 创建对象
  const txObject = {
    nonce:    web3.utils.toHex(txCount),
    to:       account2,
    value:    web3.utils.toHex(web3.utils.toWei('1', 'ether')),
    gasLimit: web3.utils.toHex(21000),
    gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei'))
  }

  // 签署
  const tx = new Tx(txObject, { chain: 'ropsten'})
  tx.sign(privateKey1)

  const serializedTx = tx.serialize()
  const raw = '0x' + serializedTx.toString('hex')

  // 广播
  web3.eth.sendSignedTransaction(raw, (err, txHash) => {
    console.log('txHash:', txHash)
    // 可以去ropsten.etherscan.io查看交易详情,如果连接的主网节点,那么可以通过etherscan.io查看
  })
})

更多web3.js使用参考web3.js

查询区块链网络数据

const Web3 = require('web3')
const web3 = new Web3('https://ropsten.infura.io/v3/YOUR_INFURA_API_KEY')

// 查询最新区块
web3.eth.getBlock('latest').then(console.log)
// 查询指定哈希值的区块
web3.eth.getBlock('0x...').then(console.log)
// 查询指定序号区块
web3.eth.getBlock(0).then(console.log)
// 查询某个区块中的指定信息
web3.eth.getTransactionFromBlock('0x...', 2).then(console.log)
// 查询Gas费
web3.eth.getGasPrice().then((result) => {
    console.log("wei: " + result)
    console.log("ether: " + web3.utils.fromWei(result, 'ether'))
})

更多web3.js使用参考web3.js

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP三次握手、数据传输与四次挥手

一、建立TCP连接 —— 三次握手 (1)客户端向服务端发送一个携带初始序列号的SYN包。 (2)服务端收到后将其加入到半连接队列,然后向客户端回复携带初始序列号的SYNACK包。 (3)客户端收到后再向服…

ModelAttribute用法详解

目录 官方解释 例子 使用场景1 使用场景2 场景3 官方解释 首先看一下官方文档上该注解的解释: 可以看到ModelAttribute可以用在参数上,也可以用在方法上: Can be used to expose command objects to a web view, using specific attribu…

ceph--cephFS的使用

ceph分布式存储—cephFS的使用 1、cephfs的概念 ceph FS 即 ceph filesystem,可以实现文件系统共享功能,客户端通过 ceph 协议挂载并使 用 ceph 集群作为数据存储服务器。 Ceph FS 需要运行 Meta Data Services(MDS)服务,其守护进程为 ceph-mds&#x…

【Unity面试篇】Unity 面试题总结甄选 |Unity渲染Shader相关 | ❤️持续更新❤️

前言 关于Unity面试题相关的所有知识点:🐱‍🏍2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理了新…

怎样优雅地增删查改(六):按任意字段关键字查询

文章目录 实现应用测试 实现 定义按任意字段关键字查询过滤器(IKeywordOrientedFilter)接口,查询实体列表Dto若实现该接口,将筛选指定的目标字段(TargetFields)包含指定的关键字(Keyword&#…

软件开发的六大设计原则

我们常说软件开发要尽量具有良好的可扩展性,做到高内聚低耦合。那么究竟该如何实现呢?在面向对象软件设计领域有一系列大家所认可的设计原则,依据这些原则来设计软件,就可以让软件有很好的可扩展性,其中最重要的一条原…

发起投票平台投票吧网络投票平台网络投票平台

小程序投票活动如何做?很多企业在运营当中,都会通过投票活动来进行推广,从而达到吸粉、增加用户粘度等效果。而此类投票活动,通过小程序就可以实现,操作简单。 我们现在要以“青春大不同”为主题进行一次投票活动&…

扩展欧几里得 证明及应用代码(超详细,附带例题)

应用方面: 1.求解乘法逆元 2.求解(ax)%bc 即 a个x 模上b后得到c,其中满足条件的x的最小整数。[也可表示为axc(mod b)] 3.求解直线上的整点数 模板代码: 代码1: ll exgcd(ll a,ll b,ll &x,ll &a…

jeecgboot:vue3版本打包失败的解决过程

根据jeecgboot vue3的文档,把本地node升级到16,在本地运行都正常,打包后一直提示内存不足。 首先怀疑是代码配置问题,找到提示对应的地方,修改了package.json,把默认的NODE_OPTIONS--max-old-space-size81…

【批量将视频转为图像序列】

批量将视频转为图像序列 代码如下,代码中带有解释: # 导入所需要的库 import cv2 import os import numpy as np# 多个视频所在的路径 datasets_path ["/home/y/Code/数据集/1/007f.mp4","/home/y/Code/数据集/1/05f.mp4","/…

Python 打印文件执行路径和行号

文章目录 前言代码部分演示意外惊喜,文件位置跳转 前言 我最近在学Python,但是我感觉动态语言如果不打印文件路径和行号,到时候如果出问题Debug,除非你对业务特别熟悉,不然找不到问题的位置。 反正打印了也不亏 代码…

合宙Air001开发板系列教程—01环境搭建与点灯(基于Keil-MDK的开发)

近日合宙出品了一款: TSSOP20封装、ARMCortex-M0内核,内置32K Flash4K RAM、集成多路USART、IIC、SPI等通讯外设,5个16bit定时器以及1路12bit ADC和2路比较器的国产MCU10块钱一个开发板10个芯片,性价比还是很高的,加其…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升技术

空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化:地图符号与注记 2.4 研究区…

ndk编译jni错误LOCAL_MAKEFILE is not defined,分析解决

概述 我们用ndk编译jni的时候,通常会写一个Android.mk脚本文件。但是有些情况,我们脚本文件名字不叫Android.mk,比如我的分别改成AndroidSo.mk,AndroidA.mk 这时候就会报错:LOCAL_MAKEFILE is not defined 软件环境 …

单片机数码管

LED数码管(LED Segment Displays)是由8个发光二极管构成,并按照一定的图形及排列封转在一起的显示器件。其中7个LED构成7笔字形,1个LED构成小数点(固有时成为八段数码管)。 LED数码管有两大类&#xff0c…

从新手到高阶,企业培训直播玩法全攻略

首先,把握培训直播的整体规划。 管理端:直播内容管理纳入企业内部学习资源的建设,让企业内部的知识积累、沉淀形成体系。学员端:方便学员精准、快速定位到课程资源,方便快捷检索内容,学习体验简单易用。 其…

CP AUTOSAR中的EThTrcv

环境 EthTrcv驱动实际上是要实现EthIf指出的接口,包括如下API函数,描述在一个结构体里面 /** \brief type used in EthIf_EthTrcvDrvApi */ typedef struct sEthIf_EthTrcvDrvApiType { EthIf_EthTrcvCheckWakeupFctPtrType CheckWakeupOfEthTrcvDrvApi; /**< Et…

2023 JAVA 面试太难, 吃透这份 JAVA 架构面试笔记后, 成功涨到 30K

前阵子跟一位高级架构师的前辈聊天时&#xff0c;聊到今年的面试。有两个感受&#xff0c;一个是今年面邀的次数比往年要低不少&#xff0c;再一个就是很多面试者准备明显不足。不少候选人能力其实不差&#xff0c;进入团队干活后达到期望不难&#xff0c;但由于没准备或不会表…

Python从入门到精通:一步步掌握Python编程

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言Python入门条件和循…

使用Django数据库模型中的ForeignKey()形成数据表记录的父子层次结构

可以把ForeignKey()的第1个参数设置为值 “self” 实际形成数据表记录的父子层次结构。 下面是一个简单的实例&#xff1a; 在文件 E:\Python_project\P_001\myshop-test\myshop\app1\models.py 中写入下面的代码&#xff1a; from django.db import models# Create your mod…