在这篇文章中,咱们聊聊如何用 Node.js 调用 Web

          时间:2026-06-08 17:38:47

          主页 > 区块链 >

                              什么是 Web3?

                              Web3 是指去中心化的互联网,它利用区块链技术,实现用户与应用之间无需中介的直接联系。换句话说,Web3 让我们可以在不依赖第三方的情况之下,自由地进行数字资产的交易和交流。对了,你可能会问:“跟我有什么关系?”其实,只要你对加密货币、NFT、或者是智能合约感兴趣,这部分知识对你来说必定很有用。

                              Node.js 简介

                              Node.js 是一种能够让你在服务端用 JavaScript 来编写应用程序的运行时环境,它因其高性能和非阻塞 I/O 模型,非常适合构建高并发和实时的应用。简而言之,使用 Node.js,你可以用你熟悉的 JavaScript 来处理后端逻辑,这样开发会更加顺手。

                              环境准备

                              在正式动手之前,我们得先准备好工作环境。首先,你需要安装 Node.js。可以直接去 [Node.js 官网](https://nodejs.org/) 下载并安装。安装完成后,你可以在终端输入以下命令来检查安装情况:

                              node -v

                              如果一切顺利,你会看到 Node.js 的版本号。接下来,我们需要一个包管理工具,npm 是 Node.js 自带的,使用以下命令确认是不是已安装:

                              npm -v

                              确认一切正常后,咱们就可以开始安装 Web3.js 了。

                              安装 Web3.js

                              打开你的终端或命令行工具,进入你想建项目的文件夹,输入以下命令:

                              npm install web3

                              这条命令会下载和安装 Web3.js 到你的项目中。等个几分钟,它就好了。安装完成之后,咱们就可以开始写代码了。

                              连接到以太坊网络

                              Web3.js 支持多种以太坊节点的连接,常见的有本地节点和 Infura 提供的节点。这里我们用 Infura,因为它简单,适合初学者。首先,你得去 [Infura.io](https://infura.io/) 注册一个账户并创建一个项目。创建完成后,你会得到一个 URL,类似这样的:

                              https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID

                              这里需要将 `YOUR_INFURA_PROJECT_ID` 替换成你自己的项目 ID。

                              接下来,我们在 Node.js 脚本中连接到该以太坊网络。可以创建一个 `index.js` 文件,写入以下代码:

                              
                              const Web3 = require('web3');
                              
                              // 连接到 Infura 节点
                              const web3 = new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID'));
                              
                              console.log('成功连接到以太坊网络!');
                              

                              运行这段代码,如果没有报错,说明你已经成功连接到了以太坊网络。可以在终端输入:

                              node index.js

                              基本操作:查询账户余额

                              既然已经连接上了,我们可以进行一些基本操作了,比如查询以太坊账户的余额。以太坊的余额是以 wei 为单位的,1 ether = 10^18 wei。

                              在 `index.js` 文件中加入以下代码:

                              
                              const account = '0x你的以太坊地址'; //填写你自己的以太坊地址
                              
                              web3.eth.getBalance(account)
                                  .then(balance => {
                                      console.log('账户余额(wei):', balance);
                                      console.log('账户余额(ether):', web3.utils.fromWei(balance, 'ether'));
                                  })
                                  .catch(err => {
                                      console.error('查询余额失败:', err);
                                  });
                              

                              再次运行脚本,就能看到你指定账户的以太坊余额了。大概的意思就是,调用 `getBalance` 方法,传入你账户地址,然后添加 `.then` 来处理成功的返回值,可以看到余额从 wei 转换为 ether 显示。

                              发送交易

                              动手操作的欲望是不是更强了?接下来,我们来尝试发送一笔交易。这个部分稍微麻烦一些,因为需要管理密钥,但我会尽可能简单地给你解释清楚。

                              你需要在以太坊网络上有一些 ETH,确保你的钱包地址中有足够的余额。然后在代码中加入发送交易的逻辑。这里的 `privateKey` 是你自己以太坊钱包的私钥,注意不要把它泄露给别人!

                              
                              const accountFrom = '0x你的发送地址';
                              const privateKey = '你的私钥'; // 绝对不能外泄的内容
                              const accountTo = '0x接收地址';
                              const amount = web3.utils.toWei('0.01', 'ether'); // 转账 0.01 ether
                              
                              const createTransaction = async () => {
                                  const nonce = await web3.eth.getTransactionCount(accountFrom);
                                  const tx = {
                                      from: accountFrom,
                                      to: accountTo,
                                      value: amount,
                                      gas: 30000,
                                      nonce: nonce
                                  };
                              
                                  const signedTx = await web3.eth.accounts.signTransaction(tx, privateKey);
                                  
                                  web3.eth.sendSignedTransaction(signedTx.rawTransaction)
                                      .on('transactionHash', hash => {
                                          console.log('交易哈希:', hash);
                                      })
                                      .on('receipt', receipt => {
                                          console.log('交易收据:', receipt);
                                      })
                                      .on('error', err => {
                                          console.error('交易错误:', err);
                                      });
                              };
                              
                              createTransaction();
                              

                              粘贴完整代码后,运行脚本。注意,交易可能需要一点时间被打包进区块,不用太着急。

                              调试和异常处理

                              在代码执行时,难免会遭遇一些错误,比如网络连接问题、余额不足、gas 限额等,做好错误处理显得特别重要。使用 `.on('error', ...)` 这个事件可以捕捉到发送交易时的任何错误,这样能让你更好地定位问题。

                              最后的小技巧

                              用 Web3.js 的时候,了解 JSON-RPC 的基本原理会额外加分,还有,社区里有很多现成的工具,比如 Web3Modal,能让你更快速地集成不同的钱包,比如 MetaMask。如果想构建完整的 DApp,可以考虑使用框架如 Truffle 或者 Hardhat。

                              这段时间我在学习这些,也遇到了很多坑,感觉自己的理解逐渐加深。在这里分享一下,希望能帮到跟我一样刚入门的小伙伴们。如果有任何问题,欢迎留言讨论!

                              最后,建议多多动手练习,写代码的时候,通过调试器观察变量的变化,你会发现很多原本在书本上看不出来的细节,提升会更快哦。加油!

                              这样你就能快速上手使用 Node.js 调用 Web3,有任何疑问随时交流哦!
                                <font lang="hsiueu"></font><em dir="w0qefr"></em><legend draggable="31zi16"></legend><b dir="gvjrh2"></b><map dropzone="5hpkpu"></map><i date-time="onjn6y"></i><font id="crywow"></font><time id="ztwzzq"></time><strong lang="9vty2j"></strong><font date-time="rep1sc"></font><pre date-time="gjcrcw"></pre><ul lang="ssvs6s"></ul><noframes id="f0e37h">