当前位置:   article > 正文

使用 Web3.js 连接以太坊节点并查询区块链数据_前端web怎么调用区块链

前端web怎么调用区块链

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

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

npm install web3


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

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


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

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

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


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

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

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

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

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

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


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

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

  1. const contractABI = [
  2.   {
  3.     "inputs": [],
  4.     "name": "getTimestamp",
  5.     "outputs": [
  6.       {
  7.         "internalType": "uint256",
  8.         "name": "",
  9.         "type": "uint256"
  10.       }
  11.     ],
  12.     "stateMutability": "view",
  13.     "type": "function"
  14.   },
  15.   {
  16.     "inputs": [],
  17.     "stateMutability": "payable",
  18.     "type": "constructor"
  19.   }
  20. ];
  21. const contractBytecode = '0x608060405234801561001057600080fd5b506101c2806100206000396000f3fe60806040526004361061003f5760003560e01c806360fe47b1146100445780636d4ce63c1461007a575b600080fd5b34801561005057600080fd5b506100596100f1565b6040518082815260200191505060405180910390f35b34801561007b57600080fd5b506100846100f1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000809054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561015957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b5b565b005b60006020819052908152604090205481565b6000809054906101000a900460ff168156fea26469706673582212204e4a4c4f6d93a5d8d5f5c8381c2cc34e3cf1c0d2e7b0c491b3f9b78d9dc0f0e64736f6c63430007060033';
  22. const MyContract = new web3.eth.Contract(contractABI);
  23. const accounts = await web3.eth.getAccounts();
  24. const myContractInstance = await MyContract.deploy({
  25.   data: contractBytecode,
  26. }).send({
  27.   from: accounts[0],
  28.   gas: '5000000',
  29. });
  30. console.log('Contract address:', myContractInstance.options.address);


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

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

  1. const contractAddress = '0x123456...';
  2. const contractABI = [
  3.   {
  4.     "inputs": [],
  5.     "name": "getTimestamp",
  6.     "outputs": [
  7.       {
  8.         "internalType": "uint256",
  9.         "name": "",
  10.         "type": "uint256"
  11.       }
  12.     ],
  13.     "stateMutability": "view",
  14.     "type": "function"
  15.   },
  16.   {
  17.     "inputs": [],
  18.     "stateMutability": "payable",
  19.     "type": "constructor"
  20.   }
  21. ];
  22. const MyContract = new web3.eth.Contract(contractABI, contractAddress);
  23. const timestamp = await MyContract.methods.getTimestamp().call();
  24. console.log('Timestamp:', timestamp);


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

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

  1. const contractAddress = '0x123456...';
  2. const contractABI = [
  3.   {
  4.     "anonymous": false,
  5.     "inputs": [
  6.       {
  7.         "indexed": true,
  8.         "internalType": "address",
  9.         "name": "from",
  10.         "type": "address"
  11.       },
  12.       {
  13.         "indexed": true,
  14.         "internalType": "address",
  15.         "name": "to",
  16.         "type": "address"
  17.       },
  18.       {
  19.         "indexed": false,
  20.         "internalType": "uint256",
  21.         "name": "value",
  22.         "type": "uint256"
  23.       }
  24.     ],
  25.     "name": "Transfer",
  26.     "type": "event"
  27.   }
  28. ];
  29. const MyContract = new web3.eth.Contract(contractABI, contractAddress);
  30. MyContract.events.Transfer({ fromBlock: 'latest' }, (error, event) => {
  31.   if (!error) {
  32.     console.log('Transfer:', event.returnValues);
  33.   }
  34. });


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

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

  1. if (window.ethereum) {
  2.   const web3 = new Web3(window.ethereum);
  3.   try {
  4.     await window.ethereum.enable();
  5.   } catch (error) {
  6.     console.error('User denied account access');
  7.   }
  8. } else if (window.web3) {
  9.   const web3 = new Web3(window.web3.currentProvider);
  10. } else {
  11.   console.error('No web3 provider detected');
  12. }


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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/324063
推荐阅读
相关标签
  

闽ICP备14008679号