web3.js:使用eth包

落雷發表於2024-05-12

原文在這裡

簡介

web3-eth包提供了一套強大的功能,可以與以太坊區塊鏈和智慧合約進行互動。在本教程中,我們將指導您如何使用web3.js版本4的web3-eth包的基礎知識。我們將在整個示例中使用TypeScript。

步驟 1:配置環境

在我們開始編寫和部署我們的合約之前,我們需要設定我們的環境。為此,我們需要安裝以下內容:

  1. Ganache - Ganache是一個用於以太坊開發的個人區塊鏈,它允許你看到你的智慧合約在現實世界場景中的功能。你可以從http://truffleframework.com/ganache下載它
  2. Node.js - Node.js是一個JavaScript執行時環境,允許你在伺服器端執行JavaScript。你可以從https://nodejs.org/en/download/下載它
  3. npm - Node Package Manager用於釋出和安裝到公共npm登錄檔或私有npm登錄檔的包。這是如何安裝它的方法https://docs.npmjs.com/downloading-and-installing-node-js-and-npm。(或者,你可以使用yarn代替npm https://classic.yarnpkg.com/lang/en/docs/getting-started/

步驟 2:建立一個新的專案目錄並初始化一個新的Node.js專案

首先,為你的專案建立一個新的專案目錄,並導航到該目錄:

$ mkdir smart-contract-tutorial
$ cd smart-contract-tutorial

然後使用npm初始化專案:

$ npm init -y 

這將在你的專案目錄中建立一個新的package.json檔案。

$ npm i typescript @types/node

這將為我們的專案安裝typescript。

步驟3:設定web3.js並連線到Ganache網路

在這一步,我們將設定web3.js庫並連線到Ganache網路。所以,如果你還沒有執行Ganache,一定要執行。

首先,使用npm安裝web3包:

$ npm i web3

接下來,在你的專案目錄中建立一個名為index.ts的新檔案,並向其中新增以下程式碼:

import { Web3 } from 'web3';

// Set up a connection to the Ganache network
const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545'));
/* NOTE:
instead of using ganache, you can also interact with a testnet/mainnet using another provider
https://app.infura.io/
https://dashboard.alchemy.com/
or use a public provider https://chainlist.org/
*/

// Log the current block number to the console
const block = await web3.eth.getBlockNumber();

console.log('Last block:', block);
// ↳ Last block: 4975299n

這段程式碼建立了與Ganache網路的連線,並將當前的區塊號記錄到控制檯。

執行以下命令來測試連線:

$ npx ts-node index.ts

如果一切正常,你應該能在控制檯看到當前的區塊號。然而,如果你得到了一個錯誤,原因是connect ECONNREFUSED 127.0.0.1:7545,那麼請再次檢查你是否在本地的7545埠上執行Ganache。

步驟4:使用web3.js將智慧合約部署到Ganache網路

在這一步,我們將使用web3.js將智慧合約部署到Ganache網路。

在第一個例子中,我們將傳送一個簡單的交易。建立一個名為transaction.ts的檔案,並用以下程式碼填充它:

import { Web3 } from 'web3';
import fs from 'fs';
import path from 'path';

// Set up a connection to the Ethereum network
const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545'));
web3.eth.Contract.handleRevert = true;

async function interact() {
  //fetch all the available accounts
  const accounts = await web3.eth.getAccounts();
  console.log(accounts);

  let balance1, balance2;
  //The initial balances of the accounts should be 100 Eth (10^18 wei)
  balance1 = await web3.eth.getBalance(accounts[0]);
  balance2 = await web3.eth.getBalance(accounts[1]);

  console.log(balance1, balance2);

  //create a transaction sending 1 Ether from account 0 to account 1
  const transaction = {
    from: accounts[0],
    to: accounts[1],
    // value should be passed in wei. For easier use and to avoid mistakes,
    //	we utilize the auxiliary `toWei` function:
    value: web3.utils.toWei('1', 'ether'),
  };

  //send the actual transaction
  const transactionHash = await web3.eth.sendTransaction(transaction);
  console.log('transactionHash', transactionHash);

  balance1 = await web3.eth.getBalance(accounts[0]);
  balance2 = await web3.eth.getBalance(accounts[1]);

  // see the updated balances
  console.log(balance1, balance2);

  // irrelevant with the actual transaction, just to know the gasPrice
  const gasPrice = await web3.eth.getGasPrice();
  console.log(gasPrice);
}

(async () => {
  await interact();
})();

重要資訊
當使用Ganache執行本地開發區塊鏈時,所有賬戶通常預設解鎖,允許在開發和測試期間輕鬆訪問和執行交易。這意味著可以在不需要私鑰或密碼短語的情況下訪問這些賬戶。這就是為什麼我們在示例中只用from欄位指示賬戶。

執行下面的命令:

$ npx ts-node transaction.ts

如果一切正常,你應該會看到如下內容:

[
  '0xc68863f36C48ec168AD45A86c96347D520eac1Cf',
  '0x80c05939B307f9833d905A685575b45659d3EA70',
  '0xA260Cf742e03B48ea1A2b76b0d20aaCfe6F85E5E',
  '0xf457b8C0CBE41e2a85b6222A97b7b7bC6Df1C0c0',
  '0x32dF9a0B365b6265Fb21893c551b0766084DDE21',
  '0x8a6A2b8b00C1C8135F1B25DcE54f73Ee18bEF43d',
  '0xAFc526Be4a2656f7E02501bdf660AbbaA8fb3d7A',
  '0xc32618116370fF776Ecd18301c801e146A1746b3',
  '0xDCCD49880dCf9603835B0f522c31Fcf0579b46Ff',
  '0x036006084Cb62b7FAf40B979868c0c03672a59B5'
]
100000000000000000000n 100000000000000000000n

transactionHash {
  transactionHash: '0xf685b64ccf5930d3779a33335ca22195b68901dbdc439f79dfc65d87c7ae88b0',
  transactionIndex: 0n,
  blockHash: '0x5bc044ad949cfd32ea4cbb249f0292e7dded44c3b0f599236c6d20ddaa96cc06',
  blockNumber: 1n,
  from: '0xc68863f36c48ec168ad45a86c96347d520eac1cf',
  to: '0x80c05939b307f9833d905a685575b45659d3ea70',
  gasUsed: 21000n,
  cumulativeGasUsed: 21000n,
  logs: [],
  status: 1n,
  logsBloom: '0x......000'
}

98999580000000000000n 101000000000000000000n

20000000000n

注意事項
為了計算實際花費的以太幣,我們需要計算傳送的值加上費用。初始餘額 = (剩餘餘額 + 值 + gasUsed*gasPrice)。在我們的情況下:

98999580000000000000 + 1000000000000000000 + (20000000000*21000) = 100 Ether

在下一個示例中,我們將使用estimateGas函式來檢視合約部署預期的gas。(關於合約的更多資訊,請參閱相應的教程)。建立一個名為estimate.ts的檔案,並用以下程式碼填充它:

import { Web3, ETH_DATA_FORMAT, DEFAULT_RETURN_FORMAT } from 'web3';

async function estimate() {
  // abi of our contract
  const abi = [
    {
      inputs: [{ internalType: 'uint256', name: '_myNumber', type: 'uint256' }],
      stateMutability: 'nonpayable',
      type: 'constructor',
    },
    {
      inputs: [],
      name: 'myNumber',
      outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
      stateMutability: 'view',
      type: 'function',
    },
    {
      inputs: [{ internalType: 'uint256', name: '_myNumber', type: 'uint256' }],
      name: 'setMyNumber',
      outputs: [],
      stateMutability: 'nonpayable',
      type: 'function',
    },
  ];

  const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545'));

  //get the available accounts
  const accounts = await web3.eth.getAccounts();
  let acc = await accounts[0];

  let contract = new web3.eth.Contract(abi);

  const deployment = contract.deploy({
    data: '0x608060405234801561001057600080fd5b506040516101d93803806101d983398181016040528101906100329190610054565b806000819055505061009e565b60008151905061004e81610087565b92915050565b60006020828403121561006657600080fd5b60006100748482850161003f565b91505092915050565b6000819050919050565b6100908161007d565b811461009b57600080fd5b50565b61012c806100ad6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806323fd0e401460375780636ffd773c146051575b600080fd5b603d6069565b6040516048919060bf565b60405180910390f35b6067600480360381019060639190608c565b606f565b005b60005481565b8060008190555050565b60008135905060868160e2565b92915050565b600060208284031215609d57600080fd5b600060a9848285016079565b91505092915050565b60b98160d8565b82525050565b600060208201905060d2600083018460b2565b92915050565b6000819050919050565b60e98160d8565b811460f357600080fd5b5056fea2646970667358221220d28cf161457f7936995800eb9896635a02a559a0561bff6a09a40bfb81cd056564736f6c63430008000033',
    // @ts-expect-error
    arguments: [1],
  });

  let estimatedGas = await deployment.estimateGas({ from: acc }, DEFAULT_RETURN_FORMAT);
  // the returned data will be formatted as a bigint

  console.log('Default format:', estimatedGas);

  estimatedGas = await deployment.estimateGas({ from: acc }, ETH_DATA_FORMAT);
  // the returned data will be formatted as a hexstring

  console.log('Eth format:', estimatedGas);
}

(async () => {
  await estimate();
})();

執行下面的命令:

$ npx ts-node estimate.ts

如果一切正常,你應該會看到如下內容:

Default format: 140648n
Eth format: 0x22568

注意事項
從web3.js返回的數字預設以BigInt格式返回。在這個例子中,我們使用了ETH_DATA_FORMAT引數,它可以在web3.js的大多數方法中傳遞,以便以十六進位制格式化結果。

在下一個示例中,我們將簽署一個交易,並使用sendSignedTransaction來傳送已簽署的交易。建立一個名為sendSigned.ts的檔案,並用以下程式碼填充它:

import { Web3 } from 'web3';
const web3 = new Web3('http://localhost:7545');

//make sure to copy the private key from ganache
const privateKey = '0x0fed6f64e01bc9fac9587b6e7245fd9d056c3c004ad546a17d3d029977f0930a';
const value = web3.utils.toWei('1', 'ether');

async function sendSigned() {
  const accounts = await web3.eth.getAccounts();
  const fromAddress = accounts[0];
  const toAddress = accounts[1];
  // Create a new transaction object
  const tx = {
    from: fromAddress,
    to: toAddress,
    value: value,
    gas: 21000,
    gasPrice: web3.utils.toWei('10', 'gwei'),
    nonce: await web3.eth.getTransactionCount(fromAddress),
  };

  // Sign the transaction with the private key
  const signedTx = await web3.eth.accounts.signTransaction(tx, privateKey);

  // Send the signed transaction to the network
  const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);

  console.log('Transaction receipt:', receipt);
}
(async () => {
  await sendSigned();
})();

執行下面的命令:

$ npx ts-node sendSigned.ts

如果一切正常,你應該會看到如下內容:

Transaction receipt: {
  transactionHash: '0x742df8f1ad4d04f6e5632889109506dbb7cdc8a6a1c80af3dfdfc71a67a04ddc',
  transactionIndex: 0n,
  blockNumber: 1n,
  blockHash: '0xab6678d76499b0ee383f182ab8f848ba27bd787e70e227524255c86b25224ed3',
  from: '0x66ce32a5200aac57b258c4eac26bc1493fefddea',
  to: '0x0afcfc43ac454348d8170c77b1f912b518b4ebe8',
  cumulativeGasUsed: 21000n,
  gasUsed: 21000n,
  logs: [],
  logsBloom: '0x...0000',
  status: 1n,
  effectiveGasPrice: 10000000000n,
  type: 2n
}

步驟5:匯入指定的包

為了利用web3-eth包的功能,你可以選擇直接匯入這個包,而不是依賴全域性的web3包,這將會減小構建大小。

直接匯入web3-eth

例如使用getBalance方法:

import { Web3Eth } from 'web3-eth';

const eth = new Web3Eth('http://localhost:7545');

async function test() {
	const accounts = await eth.getAccounts();
	const currentBalance = await eth.getBalance(accounts[0]);
	console.log('Current balance:', currentBalance);
	// 115792089237316195423570985008687907853269984665640564039437613106102441895127n
}

(async () => {
	await test();
})();

直接將配置設定到web3-eth包中

import { Web3Eth } from 'web3-eth';

const eth = new Web3Eth('http://localhost:8545');

console.log('defaultTransactionType before', eth.config.defaultTransactionType);
// defaultTransactionType before 0x0

eth.setConfig({ defaultTransactionType: '0x1' });

console.log('eth.config.defaultTransactionType after', eth.config.defaultTransactionType);
// defaultTransactionType before 0x1

步驟6:傳送不同型別的交易

傳統交易

在以太坊中,'傳統交易'通常指的是傳統的交易,其中燃氣費由傳送者明確設定,並且可以根據網路需求波動。這些傳統交易在實施以太坊改進提案(EIP) 1559之前在以太坊網路上非常普遍。

傳統交易的主要特點包括:

  1. 燃氣價格:在傳統交易中,傳送者指定他們願意為交易消耗的每單位燃氣支付的燃氣價格(以Gwei計)。燃氣價格可以由傳送者調整,它決定了交易被礦工處理的優先順序。更高的燃氣價格意味著更快的交易確認。
  2. 燃氣限制:傳送者還設定了一個燃氣限制,這是交易可以消耗的最大燃氣量。燃氣是用於在以太坊網路上執行交易和智慧合約的計算燃料。主要設定燃氣限制是為了確保傳送者在處理交易時不會耗盡以太幣。它也可能影響交易的成功或失敗。
  3. 費用不確定性:傳統交易受到基於網路擁堵的燃氣價格波動的影響。在需求高的時期,燃氣價格可能會飆升,導致使用者為他們的交易被及時處理而支付更多的費用。相反,在網路較為安靜的時期,使用者可以支付較低的費用。
  4. 手動費用估算:使用者負責手動估算在他們的傳統交易中包含的適當的燃氣價格,以確保及時處理。這個過程可能很具挑戰性,因為設定的燃氣價格過低可能導致確認慢,而設定的價格過高可能導致過度支付。
  5. 如下所述的EIP-1559引入了對以太坊交易費用系統的改變,使其更加使用者友好和可預測。在EIP-1559中,'基礎費用'的概念取代了手動設定燃氣價格,這減少了與傳統交易相關的一些不確定性。

雖然EIP-1559大大改善了使用者體驗,但傳統交易仍然在以太坊網路上得到支援,使用者如果願意,可以繼續傳送帶有手動指定的燃氣價格和燃氣限制的交易。然而,EIP-1559機制現在是大多數交易的推薦方法,因為它簡化了過程,減少了過度支付費用的可能性。

要傳送傳統交易,請使用下面的程式碼:

import { Web3 } from 'web3';

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

async function test() {
  const privateKey = 'YOUR PRIVATE KEY HERE';
  // add private key to wallet to have auto-signing transactions feature
  const account = web3.eth.accounts.privateKeyToAccount(privateKey);
  web3.eth.accounts.wallet.add(account);

  // create transaction object
  const tx = {
    from: account.address,
    to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
    value: '0x1',
    gas: BigInt(21000),
    gasPrice: await web3.eth.getGasPrice(),
    type: BigInt(0), // <- specify type
  };

  // send transaction
  const receipt = await web3.eth.sendTransaction(tx);

  console.log('Receipt:', receipt);
  // Receipt: {
  //   blockHash: '0xc0f2fea359233b0843fb53255b8a7f42aa7b1aff53da7cbe78c45b5bac187ad4',
  //   blockNumber: 21n,
  //   cumulativeGasUsed: 21000n,
  //   effectiveGasPrice: 2569891347n,
  //   from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e',
  //   gasUsed: 21000n,
  //   logs: [],
  //   logsBloom: '0x0...00000',
  //   status: 1n,
  //   to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
  //   transactionHash: '0x0ffe880776f5631e4b64caf521bd01cd816dd2cc29e533bc56f392211856cf9a',
  //   transactionIndex: 0n,
  //   type: 0n
  // }
}
(async () => {
  await test();
})();

EIP-2930交易

以太坊改進提案2930是對以太坊網路的一項改變提案,該提案作為柏林硬分叉的一部分實施,於2021年4月啟用。EIP-2930引入了一個名為“交易型別和訪問列表”的功能。這項改進提高了某些智慧合約互動的燃氣效率,並在指定誰可以訪問智慧合約內特定資源方面提供了更多的靈活性。以下是EIP-2930的主要組成部分:

  1. 交易型別:EIP-2930引入了一種新的交易型別,稱為“訪問列表交易”。這種交易型別旨在透過允許傳送者指定可能在交易過程中被訪問或修改的地址列表,使與智慧合約的某些互動更加高效。
  2. 訪問列表:訪問列表是與交易一起包含的結構化資料格式。它包含了預期在交易執行過程中被訪問或修改的地址和儲存鍵的列表。這有助於減少這些操作所需的燃氣量,因為礦工可以檢查訪問列表以最佳化執行。
  3. 燃氣節省:EIP-2930旨在顯著降低使用訪問列表功能的交易的燃氣成本。透過指定與交易相關的儲存槽和地址,它允許更有效地使用燃氣,特別是在與具有大狀態的智慧合約的互動中。
  4. 合約互動:這項改進在與具有複雜狀態結構的合約互動時特別有用,因為它最小化了從特定儲存槽讀取或寫入所需的燃氣。這可以為使用者節省成本,並使某些互動更加實用。

EIP-2930是以太坊持續努力提高網路效率和降低交易成本的一部分,使其對去中心化應用和使用者更加可接入和可擴充套件。它對於與依賴特定儲存操作和訪問控制機制的有狀態合約的互動特別有益。

要傳送EIP-2930交易,請使用下面的程式碼:

import {Web3} from 'web3';

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

async function test() {
  const privateKey = 'YOUR PRIVATE KEY HERE';
  // add private key to wallet to have auto-signing transactions feature
  const account = web3.eth.accounts.privateKeyToAccount(privateKey);
  web3.eth.accounts.wallet.add(account);

  // create transaction object
  const tx = {
    from: account.address,
    to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
    value: '0x1',
    gasLimit: BigInt(21000),
    type: BigInt(1), // <- specify type
    // gasPrice - you can specify this property directly or web3js will fill this field automatically
  };

  // send transaction
  const receipt = await web3.eth.sendTransaction(tx);

  console.log('Receipt:', receipt);
  // Receipt: {
  //   blockHash: '0xd8f6a3638112d17b476fd1b7c4369d473bc1a484408b6f39dbf64410df44adf6',
  //   blockNumber: 24n,
  //   cumulativeGasUsed: 21000n,
  //   effectiveGasPrice: 2546893579n,
  //   from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e',
  //   gasUsed: 21000n,
  //   logs: [],
  //   logsBloom: '0x...0000',
  //   status: 1n,
  //   to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
  //   transactionHash: '0xd1d682b6f6467897db5b8f0a99a6be2fb788d32fbc1329b568b8f6b2c15e809a',
  //   transactionIndex: 0n,
  //   type: 1n
  // }
}
(async () => {
  await test();
})();

以下是在交易中使用訪問列表的示例。

注意
你可以在這裡找到Greeter合約的程式碼

import {Web3} from 'web3';

import { GreeterAbi, GreeterBytecode } from './fixture/Greeter';

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

async function test() {
  const privateKey = 'YOUR PRIVATE KEY HERE';
  // add private key to wallet to have auto-signing transactions feature
  const account = web3.eth.accounts.privateKeyToAccount(privateKey);
  web3.eth.accounts.wallet.add(account);

  // deploy contract
  const contract = new web3.eth.Contract(GreeterAbi);
  const deployedContract = await contract
    .deploy({
      data: GreeterBytecode,
      arguments: ['My Greeting'],
    })
    .send({ from: account.address });
  deployedContract.defaultAccount = account.address;

  const transaction = {
    from: account.address,
    to: deployedContract.options.address,
    data: '0xcfae3217', // greet function call data encoded
  };
  const { accessList } = await web3.eth.createAccessList(transaction, 'latest');

  console.log('AccessList:', accessList);
  // AccessList: [
  //   {
  //     address: '0xce1f86f87bd3b8f32f0fb432f88e848f3a957ed7',
  //     storageKeys: [
  //       '0x0000000000000000000000000000000000000000000000000000000000000001'
  //     ]
  //   }
  // ]

  // create transaction object with accessList
  const tx = {
    from: account.address,
    to: deployedContract.options.address,
    gasLimit: BigInt(46000),
    type: BigInt(1), // <- specify type
    accessList,
    data: '0xcfae3217',
    // gasPrice - you can specify this property directly or web3js will fill this field automatically
  };

  // send transaction
  const receipt = await web3.eth.sendTransaction(tx);

  console.log('Receipt:', receipt);
  // Receipt: {
  //   blockHash: '0xc7b9561100c8ff6f1cde7a05916e86b7d037b2fdba86b0870e842d1814046e4b',
  //   blockNumber: 43n,
  //   cumulativeGasUsed: 26795n,
  //   effectiveGasPrice: 2504325716n,
  //   from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e',
  //   gasUsed: 26795n,
  //   logs: [],
  //   logsBloom: '0x...00000000000',
  //   status: 1n,
  //   to: '0xce1f86f87bd3b8f32f0fb432f88e848f3a957ed7',
  //   transactionHash: '0xa49753be1e2bd22c2a8e2530726614c808838bb0ebbed72809bbcb34f178799a',
  //   transactionIndex: 0n,
  //   type: 1n
  // }
}
(async () => {
  await test();
})();

EIP-1559交易

以太坊改進提案1559是對以太坊網路費用市場和交易定價機制的重大升級。它作為以太坊倫敦硬分叉的一部分實施,該硬分叉於2021年8月發生。EIP-1559引入了幾項改變以太坊區塊鏈上交易費用工作方式的變化,其主要目標是改善使用者體驗和網路效率。

以下是EIP-1559引入的一些關鍵特性和變化:

  1. 基礎費用:EIP-1559引入了一個名為“基礎費用”的概念。基礎費用是交易被包含在區塊中所需的最低費用。它由網路透過演算法確定,並根據網路擁堵動態調整。當網路繁忙時,基礎費用增加,當網路擁堵較少時,基礎費用減少。
  2. 包含費用:除基礎費用外,使用者可以自願包含一個“小費”或“包含費用”以激勵礦工將他們的交易包含在下一個區塊中。這允許使用者透過向礦工提供小費來加快他們的交易。
  3. 可預測的費用:有了EIP-1559,使用者有更可預測的方式來估算交易費用。他們可以設定他們願意支付的最高費用,包括基礎費用和小費。這消除了使用者需要猜測適當的燃氣價格的需要。
  4. 銷燬機制:EIP-1559引入了一種機制,透過該機制,基礎費用從流通中“銷燬”,減少了以太幣(ETH)的總供應量。這種通縮機制可以幫助解決一些與ETH供應量增加相關的問題,並可能使其成為更好的價值儲存。
  5. 改進的費用拍賣:在EIP-1559下,費用拍賣更有效。使用者指定他們願意支付的最高費用,協議自動調整小費,以確保交易得到及時處理,而不會過度支付。
  6. 更簡單的交易過程:使用者體驗到一個簡化的交易過程,因為他們不必手動設定燃氣價格。相反,他們指定他們願意支付的最高費用,錢包軟體處理其餘的事情。

EIP-1559因其建立更使用者友好和高效的交易費用系統的潛力而受到好評,使以太坊網路對使用者更加可接入和可預測。它也被視為過渡到以太坊2.0的重要步驟,以太坊2.0旨在解決網路上的可擴充套件性和可持續性挑戰。

要傳送EIP-1559交易,請使用下面的程式碼:

import { Web3 } from 'web3';

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

async function test() {
  const privateKey = 'YOUR PRIVATE KEY HERE';
  // add private key to wallet to have auto-signing transactions feature
  const account = web3.eth.accounts.privateKeyToAccount(privateKey);
  web3.eth.accounts.wallet.add(account);

  // create transaction object
  const tx = {
    from: account.address,
    to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
    value: '0x1',
    gasLimit: BigInt(21000),
    type: BigInt(2), // <- specify type
    // maxFeePerGas - you can specify this property directly or web3js will fill this field automatically
    // maxPriorityFeePerGas - you can specify this property directly or web3js will fill this field automatically
  };

  // send transaction
  const receipt = await web3.eth.sendTransaction(tx);

  console.log('Receipt:', receipt);
  // Receipt: {
  //   blockHash: '0xfe472084d1471720b6887071d32a793f7c4576a489098e7d2a89aef205c977fb',
  //   blockNumber: 23n,
  //   cumulativeGasUsed: 21000n,
  //   effectiveGasPrice: 2546893579n,
  //   from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e',
  //   gasUsed: 21000n,
  //   logs: [],
  //   logsBloom: '0x0000...00000000000',
  //   status: 1n,
  //   to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
  //   transactionHash: '0x5c7a3d2965b426a5776e55f049ee379add44652322fb0b9fc2f7f57b38fafa2a',
  //   transactionIndex: 0n,
  //   type: 2n
  // }
}
(async () => {
  await test();
})();

結論

在這個教程中,我們學習瞭如何使用web3-eth包提供的不同方法。

有了這些知識,你可以開始嘗試使用以太坊區塊鏈。請記住,這只是開始,關於以太坊和web3.js還有很多需要學習的內容。所以繼續探索和建設,玩得開心!

Web3.js 4.x版本為與以太坊網路互動和構建去中心化應用提供了強大且易於使用的介面。並且它已經用TypeScript重寫,但為了簡化這個教程,我們用JavaScript與它互動。

以太坊生態系統正在不斷髮展,總是有更多的東西可以學習和發現。當你繼續發展你的技能和知識時,繼續探索和嘗試新的技術和工具,構建創新和去中心化的解決方案。

提示和最佳實踐

  • 在將智慧合約部署到主網之前,始終在本地網路(如Ganache或Hardhat)上測試你的智慧合約。
  • 使用最新版本的web3.js和Solidity,以利用最新的功能和安全補丁。
  • 保護好你的私鑰,切勿與任何人分享。
  • 謹慎使用燃氣限制和燃氣價格引數,以避免在交易費用上花費過多。
  • 在將交易傳送到網路之前,使用web3.js中的estimateGas函式來估算交易所需的燃氣。
  • 使用事件來通知客戶端應用程式關於智慧合約狀態的更改。
  • 使用像Solhint這樣的linter來檢查常見的Solidity編碼錯誤。

孟斯特

宣告:本作品採用署名-非商業性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0)進行許可,使用時請註明出處。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 戀水無意
騰訊雲開發者社群:孟斯特


相關文章