Web3接口是连接前端应用和以太坊区块链的桥梁,提供了与智能合约交互的API。本文详细介绍Web3.js和ethers.js的使用方法,帮助开发者构建去中心化应用的前端部分。
一、什么是Web3接口
1. 基本概念
Web3接口是JavaScript库,提供了与以太坊区块链交互的API。通过Web3接口,前端应用可以连接以太坊节点,查询区块链数据,发送交易,与智能合约交互。
2. 主要库
Web3.js
- 官方JavaScript库
- 功能完整
- 广泛使用
- 社区支持
ethers.js
- 更现代的库
- 更好的TypeScript支持
- 更小的包体积
- 推荐使用
其他库
- web3.py:Python版本
- web3j:Java版本
- 各种语言实现
二、如何使用Web3.js
1. 安装和配置
1 | |
2. 账户操作
1 | |
查询余额:
// 查询账户余额(返回Wei)
const balance = await web3.eth.getBalance(address);
// 转换为ETH显示
console.log(‘Balance:’, web3.utils.fromWei(balance, ‘ether’), ‘ETH’);
1 | |
};
1 | |
// 监听转账事件
contract.events.Transfer({
filter: { from: userAddress }, // 过滤条件
fromBlock: 0 // 从区块0开始
}, function(error, event) {
console.log(‘Transfer:’, event.returnValues);
})
.on(‘data’, function(event) {
console.log(‘From:’, event.returnValues.from);
console.log(‘To:’, event.returnValues.to);
console.log(‘Value:’, event.returnValues.value);
});
1 | |
安装: npm install ethers 基本使用:
const { ethers } = require(‘ethers’);
// 连接到Provider
const provider = new ethers.providers.JsonRpcProvider(‘http://localhost:8545‘);
// 或连接到Infura
const provider = new ethers.providers.InfuraProvider(‘mainnet’, ‘YOUR-PROJECT-ID’);
// 或连接到MetaMask
const provider = new ethers.providers.Web3Provider(window.ethereum);
2. 账户操作
创建钱包:
// 创建随机钱包
const wallet = ethers.Wallet.createRandom();
console.log(‘Address:’, wallet.address);
console.log(‘Private Key:’, wallet.privateKey);
// 查询账户余额
const balance = await provider.getBalance(address);
// 格式化为ETH显示
console.log(‘Balance:’, ethers.utils.formatEther(balance), ‘ETH’);
// 发送ETH转账
const tx = await wallet.sendTransaction({
value: ethers.utils.parseEther(‘1.0’) // 转换为Wei
});
// 等待交易确认
await tx.wait();
console.log(‘Transaction confirmed’);
1 | |
// 创建合约实例(只读)
const contract = new ethers.Contract(contractAddress, abi, provider);
// 调用view函数
const value = await contract.getValue();
console.log(‘Value:’, value.toString());
// 使用signer调用状态改变函数
const signer = provider.getSigner();
const contractWithSigner = contract.connect(signer);
const tx = await contractWithSigner.setValue(42);
await tx.wait(); // 等待确认
// 监听所有转账事件
contract.on(“Transfer”, (from, to, value, event) => {
console.log(Transfer: ${from} -> ${to}, ${value});
});
// 过滤事件:只监听从特定地址发出的转账
const filter = contract.filters.Transfer(userAddress, null);
contract.on(filter, (from, to, value) => {
console.log(Received from ${from}: ${value});
});
四、应用场景
1. DApp前端
连接钱包:
// 连接MetaMask钱包
async function connectWallet() {
if (window.ethereum) {
// 请求账户访问权限
await window.ethereum.request({ method: ‘eth_requestAccounts’ });
const address = await signer.getAddress();
console.log(‘Connected:’, address);
}
查询数据:
1 | |
2. 区块链浏览器
1 | |
}
查询区块:
// 根据区块号查询区块信息
async function getBlock(blockNumber) {
const block = await provider.getBlock(blockNumber);
return block;
1 | |
3. 监控服务
监听新区块:
// 监听新区块
provider.on(‘block’, (blockNumber) => {
console.log(‘New block:’, blockNumber);
});
// 监听特定事件
contract.on(‘Transfer’, (from, to, value) => {
// 处理转账事件
});
1 | |
处理错误:
try {
const tx = await contract.setValue(42);
} catch (error) {
if (error.code === ‘USER_REJECTED’) {
console.log(‘User rejected transaction’);
} else if (error.code === ‘INSUFFICIENT_FUNDS’) {
console.log(‘Insufficient funds’);
} else {
console.error(‘Error:’, error);
1 | |
2. 性能优化
批量查询:
// 批量查询多个地址的余额
async function batchQuery(addresses) {
const promises = addresses.map(addr => contract.balanceOf(addr));
const balances = await Promise.all(promises);
return balances;
}
缓存数据:
1 | |
3. 用户体验
1 | |
}
1 | |
本文标题: 以太坊Web3接口
发布时间: 2024年03月10日 00:00
最后更新: 2026年09月16日 05:40
原始链接: https://haoxiang.eu.org/37bc219c/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

