这是我参与「掘金日新计划 · 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
}
})