Node.js 连接本地以太坊全节点,完整指南
在区块链开发和智能合约测试过程中,连接到本地运行的以太坊全节点是一项常见需求,本文将详细介绍如何使用 Node.js 通过 HTTP 或 WebSocket 协议连接到本地以太坊全节点(如 Geth 或 Parity),并提供实用的代码示例和最佳实践。
准备工作
在开始之前,确保你已经完成了以下准备工作:

-
安装以太坊客户端:选择并安装一个以太坊全节点客户端,如 Geth 或 Parity。
- Geth 安装:
https://geth.ethereum.org/downloads/ - Parity 安装:
https://www.parity.io/developers/
- Geth 安装:
-
启动本地节点:运行客户端并启用 HTTP 或 WebSocket RPC 接口。

- 对于 Geth:
geth --http --http.addr "0.0.0.0" --http.port "8545" --http.api "eth,net,web3,personal"
- 对于 Parity:
parity --jsonrpc-interface=all --jsonrpc-port=8545 --jsonrpc-api=all
- 对于 Geth:
-
安装 Node.js 依赖:创建项目并安装必要的 npm 包。
mkdir eth-connection && cd eth-connection npm init -y npm install web3
使用 Web3.js 连接本地节点
Web3.js 是最流行的以太坊交互库之一,它提供了与以太坊节点交互的完整 API。
通过 HTTP 连接
const Web3 = require('web3');
// 创建 Web3 实例,连接到本地节点
const web3 = new Web3('http://localhost:8545');
// 检查连接状态
web3.eth.isNodeConnected().then(isConnected => {
console.log('Node connected:', isConnected);
}).catch(err => {
console.error('Connection error:', err);
});
// 获取最新区块号
web3.eth.getBlockNumber().then(blockNumber => {
console.log('Latest block number:', blockNumber);
}).catch(err => {
console.error('Error getting block number:', err);
});
通过 WebSocket 连接(推荐)
WebSocket 提供了更高效的实时通信方式,适合需要监听事件的场景。
const Web3 = require('web3');
// 创建 Web3 实例,使用 WebSocket 协议
const web3 = new Web3('ws://localhost:8545');
// 监听连接状态
web3.eth.isNodeConnected().then(isConnected => {
console.log('Node connected:', isConnected);
}).catch(err => {
console.error('Connection error:', err);
});
// 监听新区块事件
web3.eth.subscribe('newBlockHeaders', (error, blockHeader) => {
if (error) {
console.error('Error subscribing to new blocks:', error);
} else {
console.log('New block received:', blockHeader.number);
}
});
// 获取账户列表
web3.eth.getAccounts().then(accounts => {
console.log('Available accounts:', accounts);
}).catch(err => {
console.error('Error getting accounts:', err);
});
完整示例:账户管理和交易发送
下面是一个更完整的示例,展示如何连接节点、获取账户、发送交易等操作:
const Web3 = require('web3');
// 初始化 Web3 实例
const web3 = new Web3('http://localhost:8545');
async function main() {
try {
// 检查连接
const isConnected = await web3.eth.isNodeConnected();
console.log('Node connected:', isConnected);
// 获取账户
const accounts = await web3.eth.getAccounts();
console.log('Accounts:', accounts);
if (accounts.length < 2) {
console.error('Need at least 2 accounts for this example');
return;
}
const sender = accounts[0];
const receiver = accounts[1];
// 获取账户余额
const senderBalance = await web3.eth.getBalance(sender);
const receiverBalance = await web3.eth.getBalance(receiver);
console.log(`Sender balance: ${web3.utils.fromWei(senderBalance, 'ether')} ETH`);
console.log(`Receiver balance: ${web3.utils.fromWei(receiverBalance, 'ether')} ETH`);
// 发送交易
const amount = web3.utils.toWei('0.1', 'ether');
const gasPrice = await web3.eth.getGasPrice();
const gasLimit = 21000;
const tx = {
from: sender,
to: receiver,
value: amount,
gas: gasLimit,
gasPrice: gasPrice
};
const txHash = await web3.eth.sendTransaction(tx);
console.log('Transaction hash:', txHash);
// 等待交易确认
const receipt = await web3.eth.getTransactionReceipt(txHash);
console.log('Transaction receipt:', receipt);
// 更新余额
const newSenderBalance = await web3.eth.getBalance(sender);
const newReceiverBalance = await web3.eth.getBalance(receiver);
console.log(`New sender balance: ${web3.utils.fromWei(newSenderBalance, 'ether')} ETH`);
console.log(`New receiver balance: ${web3.utils.fromWei(newReceiverBalance, 'ether')} ETH`);
} catch (error) {
console.error('Error:', error);
}
}
main();
最佳实践
- 错误处理:始终使用 try-catch 或 Promise.catch() 处理可能的错误。
- 连接管理:实现重连机制,以防节点临时断开。
- 敏感信息保护:不要将私钥或 RPC 接口凭据硬编码在代码中,使用环境变量管理。
- Gas 优化:合理设置 gas 价格和限制,避免不必要的交易成本。
- 事件监听:对于需要实时更新的应用,优先使用 WebSocket 连接。
常见问题解决
- 连接被拒绝:确保节点已启动并启用了 RPC 接口,检查防火墙设置。
- 权限不足:某些 RPC 方法可能需要解锁账户或启用相应 API。
- 超时问题:增加请求超时时间或优化节点性能。
通过 Web3.js 连接到本地以太坊全节点是区块链开发的基础技能,本文介绍了 HTTP 和 WebSocket 两种连接方式,并提供了从简单查询到交易发送的完整示例,掌握这些技能后,你就可以开始构建更复杂的以太坊应用了,随着对以太坊生态的深入了解,你还可以探索合约交互、事件监听等更高级的主题。
本文 原创,转载保留链接!网址:https://licai.bangqike.com/bixun/1379082.html
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。






