从零开始,使用 Web3.js 和 Infura 开发以太坊去中心化应用
随着区块链技术的飞速发展,以太坊作为最流行的智能合约平台,吸引了越来越多的开发者,对于初学者来说,搭建和维护一个以太坊全节点既耗时又耗费资源,幸运的是,通过 Web3.js 库和 Infura 服务,我们可以轻松地与以太坊区块链进行交互,无需自己运行节点,本文将带你一步步了解如何使用这两个强大的工具进行以太坊开发。
核心概念介绍
1 什么是 Web3.js?
Web3.js 是一个 JavaScript 库,它封装了以太坊 JSON-RPC API,允许开发者通过 HTTP、IPC 或 WebSocket 与以太坊区块链进行通信,借助 Web3.js,你可以:
- 查询区块链数据(区块、交易、账户余额等)
- 发送以太币交易
- 部署和调用智能合约
- 监听区块链事件
2 什么是 Infura?
Infura 是 ConsenSys 旗下知名的区块链基础设施服务商,它提供了一套托管的以太坊节点集群,开发者只需通过 Infura 提供的 API 端点(Endpoint),就能访问以太坊主网、测试网(如 Sepolia、Goerli)以及 IPFS 等服务,无需自己搭建和维护节点。
使用 Infura 的优势:
- 无需同步区块链数据,节省大量磁盘空间和时间
- 高可用性和稳定的 API 服务
- 免费套餐足够开发测试使用
- 支持 WebSocket 实时订阅事件
准备工作
1 注册 Infura 账号
- 访问 infura.io 并注册账号
- 登录后创建一个新项目(Create New Project)
- 在项目设置中,你会看到三个关键信息:
- Project ID:项目唯一标识
- Project Secret:项目密钥(建议保密)
- Endpoint:形如
https://mainnet.infura.io/v3/你的ProjectID的 API 地址
2 搭建开发环境
创建项目目录并安装依赖:
mkdir eth-demo && cd eth-demo npm init -y npm install web3 dotenv
建议将敏感信息保存到 .env 文件中:
INFURA_PROJECT_ID=你的ProjectID INFURA_PROJECT_SECRET=你的ProjectSecret PRIVATE_KEY=你的测试账户私钥
连接以太坊网络
1 初始化 Web3 实例
require('dotenv').config();
const Web3 = require('web3');
// 连接 Infura 端点(以主网为例)
const infuraUrl = `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`;
const web3 = new Web3(infuraUrl);
async function main() {
// 验证连接:获取当前区块高度
const blockNumber = await web3.eth.getBlockNumber();
console.log('当前区块高度:', blockNumber);
// 获取网络 ID
const networkId = await web3.eth.net.getId();
console.log('网络 ID:', networkId);
// 获取以太坊价格相关的 gas 价格
const gasPrice = await web3.eth.getGasPrice();
console.log('当前 Gas 价格:', web3.utils.fromWei(gasPrice, 'gwei'), 'Gwei');
}
main().catch(console.error);
如果连接测试网(如 Sepolia),只需将端点中的 mainnet 换成 sepolia 即可。
常用数据查询操作
1 查询账户余额
async function getBalance(address) {
const balanceWei = await web3.eth.getBalance(address);
const balanceEth = web3.utils.fromWei(balanceWei, 'ether');
console.log(`地址 ${address} 的余额: ${balanceEth} ETH`);
return balanceEth;
}
getBalance('0x某个以太坊地址');
2 查询区块和交易信息
async function getBlockInfo(blockNumber) {
const block = await web3.eth.getBlock(blockNumber);
console.log('区块哈希:', block.hash);
console.log('交易数量:', block.transactions.length);
console.log('矿工地址:', block.miner);
console.log('时间戳:', new Date(block.timestamp * 1000).toLocaleString());
return block;
}
async function getTransactionInfo(txHash) {
const tx = await web3.eth.getTransaction(txHash);
console.log('发送方:', tx.from);
console.log('接收方:', tx.to);
console.log('金额:', web3.utils.fromWei(tx.value, 'ether'), 'ETH');
return tx;
}
发送交易
发送交易需要对交易进行签名,Web3.js 支持通过私钥直接签名:
async function sendTransaction() {
const fromAddress = '你的钱包地址';
const toAddress = '接收方地址';
const privateKey = process.env.PRIVATE_KEY;
// 查询 nonce(该账户已发送的交易数)
const nonce = await web3.eth.getTransactionCount(fromAddress);
// 构建交易对象
const txObject = {
from: fromAddress,
to: toAddress,
value: web3.utils.toWei('0.01', 'ether'), // 发送 0.01 ETH
gas: 21000,
nonce: nonce,
};
// 获取当前合理的 gas 价格
const gasPrice = await web3.eth.getGasPrice();
txObject.gasPrice = gasPrice;
// 签名交易
const signedTx = await web3.eth.accounts.signTransaction(
txObject,
privateKey
);
// 发送签名后的交易
const receipt = await web3.eth.sendSignedTransaction(
signedTx.rawTransaction
);
console.log('交易成功!交易哈希:', receipt.transactionHash);
console.log('区块号:', receipt.blockNumber);
return receipt;
}
⚠️ 安全提示:切勿将私钥硬编码在代码中或提交到代码仓库,生产环境建议使用密钥管理服务(如 Vault、AWS KMS)或硬件钱包。
与智能合约交互
1 创建合约实例
假设你已经有一个部署好的 ERC-20 代币合约,需要合约地址和 ABI(应用二进制接口):
const contractABI = [
// 合约的 ABI 数组(可从 Remix 或 Etherscan 获取)
{
"constant": true,
"inputs": [{ "name": "_owner", "type": "address" }],
"name": "balanceOf",
"outputs": [{ "name": "balance", "type": "uint256" }],
"type": "function"
},
// ... 其他 ABI
];
const contractAddress = '0x合约地址';
const contract = new web3.eth.Contract(contractABI, contractAddress);
2 调用只读方法(call)
async function getTokenBalance(walletAddress) {
const balance = await contract.methods
.balanceOf(walletAddress
The End
发布于:2026-10-05,除非注明,否则均为原创文章,转载请注明出处。

