以太坊的JavaScript API —— web3.js

4,778 阅读5分钟

这是我参与「掘金日新计划 · 4 月更文挑战」的第 10 天,点击查看活动详情


介绍

在这篇文章中,我们将讨论如何开始使用 Web3.js。web3.js 是以太坊的JavaScript API集合。它允许我们使用 HTTP、IPC 或 WebSocket 与本地或远程的以太坊节点关联。

Web3.js能够使我们开发与以太坊区块链交互的客户端。它是一个库的集合,能够我们进行这些操作:

  • 直接以太从一个帐户到另一个帐户

  • 从智能合约中交付和写入数据

  • 制定智能合约

  • 更多其他工作

描述

web3.js库是一个开源的JavaScript库。由以太坊基金会开发,包括通过JavaScript对象表示远程过程调用(JSON-RPC)协议与以太坊节点连接的功能。它是一个JavaScript库,允许开发人员与以太坊区块链进行交互。Web3.js目前的版本是1.2.9。它由四个模块组成。

模块是什么?

JavaScript中的模块是在更大的程序中具有精确功能的代码。模块将是自包含的。因此,如果我们从一个库、程序或应用程序中删除一个模块,那么整个库、程序或应用程序不会停止工作。

模块组成了web3.js

web3. js有一个名为web3的类。库的大多数功能都源于这个类。以下是构成web3js的五个模块:

web3-eth

web3-eth模块拥有允许web3.js用户与以太坊区块链交互的功能。这些功能是智能的交互:

  • 智能合约

  • Externally-owned账户

  • 节点

  • 开采区块

下面给出了三个解释实例:

  • eth.getBalance 使我们能够成为给定块上一个地址的ETH余额。

  • eth.signTransaction 允许我们在交易中签名。

  • eth.sendSignedTransaction 允许我们将签名交易定向到以太坊区块链。

web3-shh

web3-shh 模块允许我们使用 Whisper 协议。Whisper是一种消息传递协议。它被设计为简单地广播消息和用于低级异步通信。下面是它的两个方法:

  • shh.post 在网络上发布一条消息

  • shh.subscribe 订阅消息

web3-bzz

web3-bzz 模块使我们能够与 Swarm 进行交互。Swarm 是一个去中心化的存储平台。它也是一种内容分发服务。它可以作为为我们的去中心化应用程序存储文件,例如图像或视频。下面是它的两个方法:

  • bzz.upload 允许我们上传文件和文件夹到 Swarm

  • bzz.download 使我们能够从 Swarm 下载文件和文件夹

web3-net

web3-net模块允许我们与以太坊节点的网络属性相互连接。使用 web3-net 可以让我们找到有关节点的信息。下面是它的两个方法:

  • net.getID 获取网络ID

  • net.getpeercount 获取与执行节点关联的对等点的数量

web3-utils

web3-utils 模块为我们提供了一组实用函数。我们可以在以太坊 Dapp 中与其他 web3.js 模块一起使用。web-utils 是高阶函数,它可以使代码编写起来很简单,这在JavaScript和其他编程语言中很常见。Web3-utils包含一些实用的函数。它改变数字,确认某个值是否在特定条件下发生,并搜索数据集。下面是三个示例:

  • utils.toWei 将Ether改为Wei。

  • utils.hexToNumberString 将十六进制值修改为字符串。

  • utils.address 如果提供的字符串是有效的以太坊地址,则会形成address表单。

安装

我们可以用npm在我们的终端中安装 web3.js:

$ npm install web3

Infura RPC URL

为了在主网上使用 JSON RPC 连接到以太坊节点,我们需要访问以太坊节点。我们有一些方法可以做到这一点。首先,我们可以使用 Geth 或 Parity 运行我们自己的以太坊节点。尽管如此,但这需要我们从区块链下载大量数据并将其同步。如果我们以前尝试过这样做就知道这样非常麻烦。

我们可以使用 Infura 访问以太坊节点,而不需要手动运行一个节点,主要是为了适用性。Infura 是一个免费提供远程以太坊节点的设施。我们需要做的是注册,获得一个 API 密钥和我们想要连接到的网络的 RPC URL。

注册以后,我们得到的 Infura RPC URL 应该看起来像这样:

mainnet.infura.io/YOUR_INFURA…

使用Web3.js从智能合约读取数据

我们可以通过 web3.eth.Contract() 函数实现以太坊智能合约的JavaScript表示。这个函数需要两个参数:

  • 一个用于智能合约ABI

  • 一个是智能合约地址

智能合约 ABI 是一个 JSON 数组。它定义了一个精确的智能合约如何工作。下面是 ABI 的一个实例:

const abi = [{"constant":true,"inputs":[],"name":"mintingFini}]

如何使用Web3.js部署智能合约

我们可以通过多种方式将智能合约部署到以太坊区块链。在 web3.js 有成熟的方式进行部署。我们将使用 app.js 文件,并像这样设置:

var Tx = require('ethereumjs-tx')

const Web3 = require('web3')

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

const account1 = '' // Your account address 1

const privateKey1 = Buffer.from('YOUR_PRIVATE_KEY_1', 'hex')


这个例子包括以下三个基本步骤:

  • 构建事务对象

  • 标志的事务

  • 发送交易

到目前为止,我们构建了一个交易,并将它发送到了网络上。唯一的缺少的是事务参数。

接下来,我们将像这样构建事务对象:

const txObject = {

  nonce:    web3.utils.toHex(txCount),

  gasLimit: web3.utils.toHex(1000000), // Raise the gas limit to a much higher amount

  gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')),

  data: data

}

data参数是用十六进制表示的智能合约的编译字节码。为了获得这个值,我们首先需要一个智能合约。然后我们需要编译它。可以使用任何我们喜欢的智能合约。不过,我们将在 web3.js 中使用 ERC-20 令牌智能合约。一旦我们编译好合同,我们可以将数据值赋给一个变量。

现在我们也可以通过获取事务计数来给 nonce 赋值:

web3.eth.getTransactionCount(account1, (err, txCount) => {

  const data = '' // Your data value goes here...

  const txObject = {

    nonce:    web3.utils.toHex(txCount),

    gasLimit: web3.utils.toHex(1000000),

    gasPrice: web3.utils.toHex(web3.utils.toWei('10', 'gwei')),

    data: data

  }

})