📜  使用 Web3js 与以太坊智能合约交互(1)

📅  最后修改于: 2023-12-03 15:06:51.752000             🧑  作者: Mango

使用 Web3js 与以太坊智能合约交互

介绍

Web3js 是 Ethereum JavaScript API 的一部分,是以太坊上智能合约应用的重要工具之一。通过 Web3js,我们可以方便地与以太坊智能合约进行交互。

智能合约是一种自执行的计算机程序,部署在以太坊区块链上。智能合约可以设置规则和条件,执行指定的操作,甚至可以代替传统法律条款。通过智能合约可以完成不同场景下的复杂业务逻辑,如数字资产的注册、转移和管理等。

在实际开发过程中,我们可以使用 Web3js 库来创建以太坊钱包、管理账户、交付数字货币、发送以太坊交易、以及与智能合约进行交互等操作。

Web3js 库的安装

你可以通过以下步骤来安装 Web3js 库:

  1. 首先需要安装 Node.js,您可以从 https://nodejs.org/en/download/ 下载(或是通过包管理工具)安装 Node.js。
  2. 确认 Node.js 安装成功后,打开命令行工具,输入 npm install web3 命令,即可安装 Web3js 库。
Web3js 库的基础使用

在使用 Web3js 库之前,我们需要准备一个 Web3 实例来连接以太坊网络。你可以通过以下代码片段来创建一个新的 Web3 实例:

const Web3 = require('web3');
const web3 = new Web3('http://localhost:8545');

在上面的代码中,我们通过 Web3js 创建了一个名为 web3 的实例,该实例与本地的以太坊节点进行通信。

创建钱包

使用 Web3js,我们可以轻松地创建一个以太坊钱包。通常情况下,一个钱包对应着一个以太坊账户。下面是创建钱包的示例代码:

const account = web3.eth.accounts.create();
console.log(account);

上述代码将创建一个随机的以太坊账户,并将私钥和地址输出到控制台。你可以使用私钥来签名以太坊交易。

使用 `web3.eth.accounts.create()` 函数可以创建一个新的以太坊账户,该函数可以接受一个参数作为该账户的随机种子。
交付以太币

在以太坊区块链上,每一笔交易都需要一定数量的以太币作为手续费。为了发送交易,我们需要为发起者的账户上充值足够的以太币。

以下示例代码演示了发送以太币到指定账户的方法:

const toAddress = '0x9A7C8c841Aa5267C12eaEDE71b1F8b15E6D46299'; 
const fromAddress = '0x8cecb75204246B9612CF0946e312Dd8C02e443a4'; 
const value = web3.utils.toWei('1', 'ether');
const gasPrice = await web3.eth.getGasPrice();
const gasLimit = '21000';
const transaction = {
  to: toAddress,
  from: fromAddress,
  value: value,
  gasPrice: gasPrice,
  gas: gasLimit
};
const signedTx = await web3.eth.accounts.signTransaction(transaction, privateKey);
const txReceipt = await web3.eth.sendSignedTransaction(signedTx.serialized);
console.log(txReceipt);

上述代码将从本地账户发送指定数量的以太币到指定的以太坊账户。

- `value`: 以“ether”为单位指定交易的值。
- `gasPrice`: 表示向矿工支付的 Gas 费用的价格(wei/Gas)。
- `gasLimit`: 代表这笔交易的最大 Gas 限制。
发送普通交易

我们可以使用 Web3js 发送以太坊普通交易,以下代码演示了如何使用 Web3js 发送以太坊普通交易:

const toAddress = '0x9A7C8c841Aa5267C12eaEDE71b1F8b15E6D46299'; 
const fromAddress = '0x8cecb75204246B9612CF0946e312Dd8C02e443a4'; 
const value = web3.utils.toWei('1', 'ether');
const gasPrice = await web3.eth.getGasPrice();
const gasLimit = '21000';
const data = '';
  
const transaction = {
  to: toAddress,
  from: fromAddress,
  value: value,
  gasPrice: gasPrice,
  gas: gasLimit,
  data: data
};

const signedTx = await web3.eth.accounts.signTransaction(transaction, privateKey);
const txReceipt = await web3.eth.sendSignedTransaction(signedTx.serialized);
console.log(txReceipt);

上述代码将从指定的账户发送指定数量的以太币到指定的以太坊账户,其过程与上一节的交付以太币过程类似。

调用合约

使用 Web3js 我们可以轻松地向智能合约中写入数据或读取数据。以下代码演示了如何使用 Web3js 与智能合约进行交互:

const contractAddress = '0x7f6Fe4c6C5d648f45F6E5eED8445b1e7d9AeBc23';
const contractABI = [
  {
    "inputs": [],
    "name": "sayHello",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "string",
        "name": "_greeting",
        "type": "string"
      }
    ],
    "name": "setGreeting",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  }
];

const contract = new web3.eth.Contract(contractABI, contractAddress);

//读取合约数据
const greeting = await contract.methods.sayHello().call();
console.log(greeting);

//写入合约数据
const greeting = 'Hello, Ethereum!';
const privateKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const data = contract.methods.setGreeting(greeting).encodeABI();
const nonce = await web3.eth.getTransactionCount(fromAddress);
const gasPrice = await web3.eth.getGasPrice();
const gasLimit = '1000000';

const transaction = {
  to: contractAddress,
  from: fromAddress,
  nonce: nonce,
  gasPrice: gasPrice,
  gas: gasLimit,
  data: data
};

const signedTx = await web3.eth.accounts.signTransaction(transaction, privateKey);
const txReceipt = await web3.eth.sendSignedTransaction(signedTx.serialized);
console.log(txReceipt);

在上述示例代码中,我们使用了 web3.eth.Contract 函数来创建了一个合约实例,contractABI 含有合约的接口信息,contractAddress 为合约的地址。通过 contract.methods.sayHello() 读取合约数据,通过 contract.methods.setGreeting(greeting).encodeABI() 向合约写入数据。

- `contractAddress`: 合约的地址。
- `contractABI`: 合约的接口信息,ABI 的作用是描述合约的基本信息,如接口、函数、变量等。
- `call()`: 用于读取智能合约数据。
- `encodeABI()`: 将指定的函数和参数编码为智能合约可读取的字节码。
总结

在本文中,我们介绍了 Web3js 库与以太坊智能合约的交互方式,包括创建钱包、交付以太币、发送普通交易以及调用合约等。 在实际的开发过程中,开发者可以根据实际需求,使用 Web3js 库来开发更加复杂的智能合约应用。