Web3 是指去中心化的互联网,它利用区块链技术,实现用户与应用之间无需中介的直接联系。换句话说,Web3 让我们可以在不依赖第三方的情况之下,自由地进行数字资产的交易和交流。对了,你可能会问:“跟我有什么关系?”其实,只要你对加密货币、NFT、或者是智能合约感兴趣,这部分知识对你来说必定很有用。
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 了。
打开你的终端或命令行工具,进入你想建项目的文件夹,输入以下命令:
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,有任何疑问随时交流哦!