从零开始,使用 Web3.js 和 Infura 开发以太坊去中心化应用

博主:neragonerago 2026-10-05 03:11:41 5

随着区块链技术的飞速发展,以太坊作为最流行的智能合约平台,吸引了越来越多的开发者,对于初学者来说,搭建和维护一个以太坊全节点既耗时又耗费资源,幸运的是,通过 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 账号

  1. 访问 infura.io 并注册账号
  2. 登录后创建一个新项目(Create New Project)
  3. 在项目设置中,你会看到三个关键信息:
    • 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,除非注明,否则均为区块链社区- 欧亿APP下载原创文章,转载请注明出处。