您现在的位置是:首页 >其他 >使用 Web3.js 连接以太坊节点并查询区块链数据网站首页其他

使用 Web3.js 连接以太坊节点并查询区块链数据

风风光_ 2023-06-06 08:00:02
简介使用 Web3.js 连接以太坊节点并查询区块链数据

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 绝对是你不可或缺的工具之一。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。