Web3.js 是以太坊官方提供的 JavaScript 库,用于与以太坊区块链交互。Web3.js 提供了一系列 API,开发者可以使用这些 API 实现以太坊 DApp 的开发。本篇文章介绍了 Web3.js 的常用 API 及其使用方法,并提供了一些案例说明,希望能对读者有所帮助。
一、Web3.js 基础知识介绍
Web3.js 是一个用于与以太坊进行交互的 JavaScript 库。它可以帮助开发者通过 JavaScript 编写智能合约、向以太坊节点发送交易、查询以太坊状态等等。
Web3.js 的 API 主要分为以下几类:
1. Web3 对象:提供了基本的连接和信息处理功能。
2. Eth 对象:提供了与以太坊网络通信的相关 API,如查询信息,发送交易等。
3. Contract 对象:提供了智能合约的封装和调用功能。
4. Utils 对象:提供了一系列工具方法,如加密解密、格式转换等。
二、Web3.js 基础使用方法
1. 连接以太坊链
在使用 Web3.js 之前,需要先连接以太坊网络。Web3.js 提供了如下几种连接方式:
(1)连接本地节点
```javascript
const Web3 = require('web3');
// 与本地节点建立 Web3 连接
const web3 = new Web3('http://localhost:8545');
```
(2)连接 Infura
Infura 是一个以太坊节点服务提供商,开发者可以通过 Infura 提供的 API 访问以太坊网络。连接 Infura 可以直接使用 Infura 提供的节点 URL。
```javascript
const Web3 = require('web3');
// 通过 Infura 建立 Web3 连接
const web3 = new Web3('https://mainnet.infura.io/v3/xxxxxxxxxxxx');
```
(3)连接 MetaMask
MetaMask 是一个以太坊钱包,web3.js 可以通过 MetaMask 提供的 web3.js 对象连接以太坊网络。
```javascript
// MetaMask 会注入 window.web3 对象,可以直接使用
const web3 = new Web3(window.web3.currentProvider);
```
2. 获取以太坊区块链状态
连接以太坊网络之后,可以使用 web3.eth 对象查询以太坊区块链状态。
(1)获取当前区块高度
```javascript
web3.eth.getBlockNumber()
.then(number => console.log(number))
.catch(error => console.error(error));
```
(2)获取指定区块的详细信息
```javascript
web3.eth.getBlock(1000)
.then(block => console.log(block))
.catch(error => console.error(error));
```
(3)获取指定地址的余额
```javascript
web3.eth.getBalance('0x9D8B649dD33E0bE6BDB310f5c903d9A564043dc2')
.then(balance => console.log(web3.utils.fromWei(balance, 'ether')))
.catch(error => console.error(error));
```
3. 发送以太坊交易
Web3.js 提供了一系列发送以太坊交易的 API,可以用于转账、执行智能合约等操作。
(1)发送以太坊转账交易
```javascript
// 构造待发送的交易对象
const txObject = {
from: '0x9D8B649dD33E0bE6BDB310f5c903d9A564043dc2',
to: '0x3C2B8Be99c50593081EAA2A724F0B8285F5aba8f',
value: web3.utils.toWei('0.1', 'ether'),
gas: 21000,
gasPrice: web3.utils.toWei('10', 'gwei')
};
// 将交易对象封装成原始交易
web3.eth.accounts.signTransaction(txObject, 'privateKey')
.then(({ rawTransaction }) => {
// 发送原始交易
web3.eth.sendSignedTransaction(rawTransaction)
.on('transactionHash', hash => console.log('Transaction hash:', hash))
.catch(error => console.error('Error:', error));
})
.catch(error => console.error('Error:', error));
```
(2)调用智能合约方法
```javascript
// 加载智能合约 ABI 和地址
const contract = new web3.eth.Contract(ABI, contractAddress);
// 构造调用智能合约方法的数据
const data = contract.methods.methodName(param1, param2).encodeABI();
// 构造待发送的交易对象
const txObject = {
from: '0x9D8B649dD33E0bE6BDB310f5c903d9A564043dc2',
to: contractAddress,
data,
gas: 150000,
gasPrice: web3.utils.toWei('10', 'gwei')
};
// 将交易对象封装成原始交易
web3.eth.accounts.signTransaction(txObject, 'privateKey')
.then(({ rawTransaction }) => {
// 发送原始交易
web3.eth.sendSignedTransaction(rawTransaction)
.on('transactionHash', hash => console.log('Transaction hash:', hash))
.catch(error => console.error('Error:', error));
})
.catch(error => console.error('Error:', error));
```
4. 与以太坊智能合约交互
可以使用 web3.eth.Contract 对象加载智能合约 ABI 和地址,然后调用智能合约方法。
(1)加载智能合约
```javascript
const contract = new web3.eth.Contract(ABI, contractAddress);
```
(2)读取智能合约属性
```javascript
contract.methods.propertyName().call()
.then(value => console.log(value))
.catch(error => console.error(error));
```
(3)调用智能合约方法
```javascript
contract.methods.methodName(param1, param2).send({ from, gas })
.then(receipt => console.log(receipt))
.catch(error => console.error(error));
```
三、Web3.js 的高级功能
1. Web3 对象扩展方法
Web3.js 提供了扩展方法,便于开发者使用。
(1)将以太坊单位转换为原始单位
```javascript
web3.utils.fromWei('21000', 'gwei') // => '0.000021'
```
(2)将原始单位转换为以太坊单位
```javascript
web3.utils.toWei('0.1', 'ether') // => '100000000000000000'
```
(3)生成随机的 256 位私钥
```javascript
web3.eth.accounts.create().privateKey // => '0xb1e5bb4bdef...3f3fd13c'
```
2. Contract 对象扩展方法
Contract 对象提供了扩展方法,便于开发者使用。
(1)使用事件进行数据监听
```javascript
contract.events.eventName()
.on('data', event => console.log(event))
.on('error', error => console.error(error));
```
(2)调用智能合约方法并返回结果
```javascript
contract.methods.methodName(param1, param2).call()
.then(result => console.log(result))
.catch(error => console.error(error));
```
3. Eth 对象扩展方法
Eth 对象提供了扩展方法,便于开发者使用。
(1)手动设置 GasPrice
Web3.js 会自动计算 GasPrice,但是有时候计算得到的 GasPrice 过低,导致交易无法被矿工打包,可以手动设置 GasPrice。
```javascript
web3.eth.getGasPrice()
.then(gasPrice => {
const customGasPrice = gasPrice * 2; // 设置为当前 GasPrice 的两倍
const txObject = {
from: '0x9D8B649dD33E0bE6BDB310f5c903d9A564043dc2',
to: '0x3C2B8Be99c50593081EAA2A724F0B8285F5aba8f',
value: web3.utils.toWei('0.1', 'ether'),
gas: 21000,
gasPrice: customGasPrice
};
web3.eth.accounts.signTransaction(txObject, privateKey)
.then(({ rawTransaction }) => {
web3.eth.sendSignedTransaction(rawTransaction)
.on('transactionHash', hash => console.log(hash))
.catch(error => console.error(error));
})
.catch(error => console.error(error));
})
.catch(error => console.error(error));
```
(2)手动设置 GasLimit
Web3.js 会自动计算 GasLimit,但是有时候计算得到的 GasLimit 过低,导致交易无法被矿工打包,可以手动设置 GasLimit。
```javascript
contract.methods.methodName(param1, param2).estimateGas(({ from, value }) => {
web3.eth.getGasPrice()
.then(gasPrice => {
const customGasLimit = 150000; // 自定义 GasLimit 值
const txObject = {
from,
to: contractAddress,
value,
data: data,
gas: customGasLimit,
gasPrice: gasPrice
};
web3.eth.accounts.signTransaction(txObject, privateKey)
.then(({ rawTransaction }) => {
web3.eth.sendSignedTransaction(rawTransaction)
.on('transactionHash', hash => console.log(hash))
.catch(error => console.error(error));
})
.catch(error => console.error(error));
})
.catch(error => console.error(error));
});
```
四、Web3.js 的案例说明
1. 以太坊转账交易
```javascript
const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/xxxxxxxxxxxx'); // Infura 的节点 URL
// 构造待发送的交易对象
const txObject = {
from: '0x9D8B649dD33E0bE6BDB310f5c903d9A564043dc2', // 转出地址
to: '0x3C2B8Be99c50593081EAA2A724F0B8285F5aba8f', // 转入地址
value: web3.utils.toWei('0.1', 'ether'), // 转账金额,单位为 ether
gas: 21000,
gasPrice: web3.utils.toWei('10', 'gwei') // GasPrice,单位为 gwei
};
// 将交易对象封装成原始交易
web3.eth.accounts.signTransaction(txObject, 'privateKey')
.then(({ rawTransaction }) => {
// 发送原始交易
web3.eth.sendSignedTransaction(rawTransaction)
.on('transactionHash', hash => console.log('Transaction hash:', hash))
.catch(error => console.error('Error:', error));
})
.catch(error => console.error('Error:', error));
```
2. 查询以太坊余额
```javascript
const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/xxxxxxxxxxxx'); // Infura 的节点 URL
web3.eth.getBalance('0x9D8B649dD33E0bE6BDB310f5c903d9A564043dc2')
.then(balance => console.log(web3.utils.fromWei(balance, 'ether')))
.catch(error => console.error(error));
```
3. 加载以太坊智能合约
```javascript
const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/xxxxxxxxxxxx'); // Infura 的节点 URL
const ABI = [...] // 智能合约 ABI
const contractAddress = '0x3C2B8Be99c50593081EAA2A724F0B8285F5aba8f';
const contract = new web3.eth.Contract(ABI, contractAddress);
```
4. 调用以太坊智能合约方法
```javascript
const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/xxxxxxxxxxxx'); // Infura 的节点 URL
const ABI = [...] // 智能合约 ABI
const contractAddress = '0x3C2B8Be99c50593081EAA2A724F0B8285F5aba8f';
const contract = new web3.eth.Contract(ABI, contractAddress);
contract.methods.methodName(param1, param2).send({ from, gas })
.then(receipt => console.log(receipt))
.catch(error => console.error(error));
```
五、总结
Web3.js 是与以太坊进行交互的重要工具之一,它提供了一系列 API,可以帮助开发者实现以太坊 DApp 的开发。本文介绍了 Web3.js 的基础使用方法,包括连接以太坊节点、查询状态、发送交易、调用智能合约等。同时还介绍了 Web3.js 的高级功能,例如手动设置 GasPrice 和 GasLimit,使用事件进行数据监听,调用智能合约方法并返回结果等。最后,本文提供了一些 Web3.js 的案例说明,希望对读者有所帮助。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复