Node.js 连接本地以太坊全节点,完整指南

网络 阅读: 2026-02-27 01:51:10

区块链开发和智能合约测试过程中,连接到本地运行的以太坊全节点是一项常见需求,本文将详细介绍如何使用 Node.js 通过 HTTP 或 WebSocket 协议连接到本地以太坊全节点(如 Geth 或 Parity),并提供实用的代码示例和最佳实践。

准备工作

在开始之前,确保你已经完成了以下准备工作:

  1. 安装以太坊客户端:选择并安装一个以太坊全节点客户端,如 Geth 或 Parity。

    • Geth 安装:https://geth.ethereum.org/downloads/
    • Parity 安装:https://www.parity.io/developers/
  2. 启动本地节点:运行客户端并启用 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
  3. 安装 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();

最佳实践

  1. 错误处理:始终使用 try-catch 或 Promise.catch() 处理可能的错误。
  2. 连接管理:实现重连机制,以防节点临时断开。
  3. 敏感信息保护:不要将私钥或 RPC 接口凭据硬编码在代码中,使用环境变量管理。
  4. Gas 优化:合理设置 gas 价格和限制,避免不必要的交易成本。
  5. 事件监听:对于需要实时更新的应用,优先使用 WebSocket 连接。

常见问题解决

  1. 连接被拒绝:确保节点已启动并启用了 RPC 接口,检查防火墙设置。
  2. 权限不足:某些 RPC 方法可能需要解锁账户或启用相应 API。
  3. 超时问题:增加请求超时时间或优化节点性能。

通过 Web3.js 连接到本地以太坊全节点是区块链开发的基础技能,本文介绍了 HTTP 和 WebSocket 两种连接方式,并提供了从简单查询到交易发送的完整示例,掌握这些技能后,你就可以开始构建更复杂的以太坊应用了,随着对以太坊生态的深入了解,你还可以探索合约交互、事件监听等更高级的主题。

本文 原创,转载保留链接!网址:https://licai.bangqike.com/bixun/1379082.html

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

扫一扫关注我们,了解最新精彩内容

搜索