Web3.js 是一个用于连接以太坊网络的 JavaScript 库。在本文中,我们将介绍如何使用 Web3.js 来连接以太坊节点,并且查询以太坊区块链上的数据。

1. 安装 Web3.js
首先,我们需要安装 Web3.js。在命令行中,输入以下命令:

npm install web3

2. 连接以太坊节点
在使用 Web3.js 之前,我们需要先连接到以太坊节点。例如,我们可以使用以下代码来连接到 Infura 提供的以太坊节点:

const Web3 = require('web3');const web3 = new Web3('https://mainnet.infura.io/v3/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx');

其中,’https://mainnet.infura.io/v3/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx’ 是 Infura 提供的以太坊节点地址和 API 密钥。

3. 查询以太坊区块链上的数据
连接到以太坊节点后,我们就可以使用 Web3.js 来查询以太坊区块链上的数据。例如,我们可以使用以下代码来查询指定地址的以太币余额:

const balance = await web3.eth.getBalance('0x123456...');console.log('Balance:', web3.utils.fromWei(balance, 'ether'));

其中,’0x123456…’ 是指定地址的以太坊钱包地址。

除了查询余额外,我们还可以使用 Web3.js 来查询其他的区块链数据,例如交易信息和区块信息。以下是一些常用的查询方法:

// 查询指定交易的信息const tx = await web3.eth.getTransaction('0x123456...');console.log('Transaction:', tx);// 查询指定区块的信息const block = await web3.eth.getBlock(12345);console.log('Block:', block);// 查询最新的区块号const latestBlockNumber = await web3.eth.getBlockNumber();console.log('Latest block number:', latestBlockNumber);

以上代码分别演示了如何查询指定地址的以太币余额、指定交易的信息、指定区块的信息和最新的区块号。

4. 发送交易
除了查询区块链数据外,Web3.js 还可以用于发送交易。例如,我们可以使用以下代码向指定地址转账:

const accounts = await web3.eth.getAccounts();const txHash = await web3.eth.sendTransaction({ from: accounts[0], to: '0x123456...', value: web3.utils.toWei('1', 'ether'),});console.log('Transaction hash:', txHash);

其中,accounts[0] 是发送账户的地址,’0x123456…’ 是接收账户的地址,’1′ 是转账金额(单位为以太),并且使用了 web3.utils.toWei() 方法将以太转换为 wei 单位。

5. 部署智能合约
除了发送交易外,Web3.js 还可以用于部署智能合约。例如,我们可以使用以下代码部署一个简单的智能合约:

const contractABI = [ {"inputs": [],"name": "getTimestamp","outputs": [ {"internalType": "uint256","name": "","type": "uint256" }],"stateMutability": "view","type": "function" }, {"inputs": [],"stateMutability": "payable","type": "constructor" }];const contractBytecode = '0x608060405234801561001057600080fd5b506101c2806100206000396000f3fe60806040526004361061003f5760003560e01c806360fe47b1146100445780636d4ce63c1461007a575b600080fd5b34801561005057600080fd5b506100596100f1565b6040518082815260200191505060405180910390f35b34801561007b57600080fd5b506100846100f1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000809054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561015957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b005b60006020819052908152604090205481565b6000809054906101000a900460ff168156fea26469706673582212204e4a4c4f6d93a5d8d5f5c8381c2cc34e3cf1c0d2e7b0c491b3f9b78d9dc0f0e64736f6c63430007060033';const MyContract = new web3.eth.Contract(contractABI);const accounts = await web3.eth.getAccounts();const myContractInstance = await MyContract.deploy({ data: contractBytecode,}).send({ from: accounts[0], gas: '5000000',});console.log('Contract address:', myContractInstance.options.address);

其中,contractABI 是智能合约的 ABI(Application Binary Interface),contractBytecode 是智能合约的字节码。使用 Web3.js 的 Contract 类可以创建一个智能合约实例,然后使用 deploy() 方法来部署智能合约。

6.调用智能合约方法
除了部署智能合约外,Web3.js 还可以用于调用智能合约方法。例如,我们可以使用以下代码来调用一个简单的智能合约中的方法:

const contractAddress = '0x123456...';const contractABI = [ {"inputs": [],"name": "getTimestamp","outputs": [ {"internalType": "uint256","name": "","type": "uint256" }],"stateMutability": "view","type": "function" }, {"inputs": [],"stateMutability": "payable","type": "constructor" }];const MyContract = new web3.eth.Contract(contractABI, contractAddress);const timestamp = await MyContract.methods.getTimestamp().call();console.log('Timestamp:', timestamp);

其中,contractAddress 是智能合约的地址,contractABI 是智能合约的 ABI(Application Binary Interface),MyContract 是智能合约实例,getTimestamp() 是智能合约中的一个方法,使用 call() 方法可以调用该方法并获取返回值。

7. 监听事件
Web3.js 还提供了监听事件的功能。例如,我们可以使用以下代码来监听智能合约中的 Transfer 事件:

const contractAddress = '0x123456...';const contractABI = [ {"anonymous": false,"inputs": [ {"indexed": true,"internalType": "address","name": "from","type": "address" }, {"indexed": true,"internalType": "address","name": "to","type": "address" }, {"indexed": false,"internalType": "uint256","name": "value","type": "uint256" }],"name": "Transfer","type": "event" }];const MyContract = new web3.eth.Contract(contractABI, contractAddress);MyContract.events.Transfer({ fromBlock: 'latest' }, (error, event) => { if (!error) {console.log('Transfer:', event.returnValues); }});

其中,contractAddress 是智能合约的地址,contractABI 是智能合约的 ABI(Application Binary Interface),MyContract 是智能合约实例,Transfer 是智能合约中的一个事件,使用 events 属性可以监听该事件。

8. 使用 MetaMask
除了连接 Infura 提供的以太坊节点或本地的 Geth 节点外,Web3.js 还可以与 MetaMask 集成,从而在浏览器中轻松地进行以太坊交互。例如,我们可以使用以下代码来连接到 MetaMask 提供的以太坊节点:

if (window.ethereum) { const web3 = new Web3(window.ethereum); try {await window.ethereum.enable(); } catch (error) {console.error('User denied account access'); }} else if (window.web3) { const web3 = new Web3(window.web3.currentProvider);} else { console.error('No web3 provider detected');}

其中,window.ethereum 是 MetaMask 提供的以太坊节点,window.web3.currentProvider 是旧版 MetaMask 提供的以太坊节点。使用 Web3.js 的构造函数可以连接到这些节点,并在用户授权后进行交互。

总结

Web3.js 是一个用于连接以太坊网络的 JavaScript 库,它可以帮助我们查询以太坊区块链上的数据、发送交易和部署智能合约等。在本文中,我们介绍了如何使用 Web3.js 来连接 Infura 提供的以太坊节点或本地的 Geth 节点,并且演示了如何查询以太坊区块链上的数据、发送交易和部署智能合约。

除了以上提到的功能外,Web3.js 还提供了许多其他的功能,例如监听事件、调用智能合约方法、使用 MetaMask 等。其中,监听事件可以帮助我们实时获取区块链上的数据变化;调用智能合约方法可以帮助我们与智能合约进行交互,例如调用 ERC20 代币合约的 transfer() 方法转账;使用 MetaMask 可以帮助我们在浏览器中轻松地进行以太坊交互。

总之,Web3.js 是一个非常强大的 JavaScript 库,它为开发者提供了方便快捷的方式来与以太坊网络进行交互。除了以上提到的功能外,Web3.js 还提供了许多其他的功能,例如调用智能合约方法、监听事件、使用 MetaMask 等。如果你正在开发以太坊 DApp 或者想要学习以太坊开发,那么 Web3.js 绝对是你不可或缺的工具之一。