:2026-03-25 0:45 点击:2
随着区块链技术的飞速发展,去中心化应用(DApps)正逐渐走进人们的视野,而Node.js,作为一款广受欢迎的JavaScript运行时环境,以其高效、非阻塞I/O模型和丰富的生态系统,成为了构建DApps后端逻辑和服务器的理想选择,要实现Node.js与区块链网络的交互,Web3.js库(或更通称的Web3技术栈)便扮演了至关重要的桥梁角色,本文将详细介绍如何使用Node.js调用Web3,与以太坊等区块链网络进行通信。
在开始之前,确保你的开发环境已经准备好:
node -v 和 npm -v 验证安装是否成功。npm init -y 初始化一个默认的package.json文件。npm install web3
如果你需要使用以太坊的JSON-RPC API,也可以选择安装 web3-core 等更底层的包,但对于大多数应用,web3 已经足够。
使用Node.js调用Web3的第一步是连接到一个以太坊节点,以太坊节点可以是:
这里以连接到Infura的公共节点为例:
const Web3 = require('web3');
// 替换为你的Infura项目ID
const infuraUrl = 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID';
// 创建Web3实例
const web3 = new Web3(infuraUrl);
// 验证连接
web3.eth.getBlockNumber()
.then(console.log)
.catch(console.error);
运行上述代码,如果成功连接并打印出最新的区块号,说明Web3已经成功连接到以太坊网络。
连接成功后,我们就可以利用Web3.js进行各种区块链操作了。
读取数据通常是免费的,不需要用户签名。
获取账户余额:
const address = '0x742d35Cc6634C0532925a3b844Bc9e7595f8d3e1'; // 替换为要查询的地址 web3.eth.getBalance(address) .then(balance => { // 余额是wei,转换为ether console.log(`Balance: ${web3.utils.fromWei(balance, 'ether')} ETH`); }) .catch(console.error);
获取交易详情:
const txHash = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060'; // 替换为交易哈希
web3.eth.getTransaction(txHash)
.then(tx => {
console.log('Transaction Details:', tx);
})
.catch(console.error);
调用智能合约的常量函数(view/pure):
假设我们有一个简单的智能合约,有一个名为 balanceOf 的查询函数:
// 合约地址和ABI(Application Binary Interface)
const contractAddress = '0xYourContractAddress';
const contractABI = [ /* 这里放置合约的ABI数组 */ ];
const contract = new web3.eth.Contract(contractABI, contractAddress);
// 调用合约的balanceOf方法
const userAddress = '0xUserAddress';
contract.methods.balanceOf(userAddress).call()
.then(balance => {
console.log(`Contract balance for ${userAddress}: ${balance}`);
})
.catch(console.error);
发送交易需要消耗Gas,并且需要使用账户的私钥进行签名。注意:私钥安全管理至关重要,切勿泄露!
创建账户并发送ETH:
const account = web3.eth.accounts.privateKeyToAccount('0xYourPrivateKey');
web3.eth.accounts.wallet.add(account);
const toAddress = '0xRecipientAddress';
const amount = web3.utils.toWei('0.1', 'ether');
web3.eth.sendTransaction({
from: account.address,
to: toAddress,
value: amount,
gas: 21000, // 转账ETH的预估Gas Limit
gasPrice: web3.utils.toWei('20', 'gwei') // Gas Price
})
.then(receipt => {
console.log('Transaction receipt:', receipt);
})
.catch(console.error);
调用智能合约的非常量函数(需要支付Gas):
假设我们要调用合约的 transfer 方法:
const recipientAddress = '0xNewRecipientAddress';
const transferAmount = 100; // 假设是某个代币的最小单位
contract.methods.transfer(recipientAddress, transferAmount).send({
from: account.address,
gas: 100000, // 根据合约方法预估Gas Limit
gasPrice: web3.utils.toWei('20', 'gwei')
})
.then(receipt => {
console.log('Transaction receipt:', receipt);
})
.catch(console.error);
Node.js结合Web3.js为开发者提供了一条强大而灵活的路径,用于构建与区块链网络深度交互的应用,从读取链上数据到发送交易、调用智能合约,Web3.js封装了底层的JSON-RPC通信细节,使得开发者可以更专注于业务逻辑的实现,随着Web3生态的不断成熟,掌握Node.js调用Web3的技术,将为你打开通往去中心化世界的大门,希望本文能为你在这条探索之路上提供有益的指引。
本文由用户投稿上传,若侵权请提供版权资料并联系删除!