Web3.js API 中文文档

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/

点赞(52) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部