web3.js: использование пакета eth
web3.js: использование пакета eth

Введение

web3-ethПакет предоставляет мощный набор функций.,Может взаимодействовать с блокчейном Ethereum и смарт-контрактами. В этом уроке,Мы подскажем вам, как использоватьweb3.jsВерсия4изweb3-ethСумкаизбазовые знания。В примерах мы будем использоватьTypeScript。

Шаг 1. Настройте среду

Прежде чем мы начнем писать и развертывать наш контракт, нам необходимо настроить нашу среду. Для этого нам необходимо установить следующее:

  1. Ganache — Ganache — это персональный блокчейн для разработки Ethereum.,это позволяет тебе видеть тебяиз Смарт-контракты в реальных сценарияхсерединаиз Функция。ты можешь начать с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.

Сначала создайте новый каталог проекта для вашего проекта и перейдите к нему:

Язык кода:bash
копировать
$ mkdir smart-contract-tutorial
$ cd smart-contract-tutorial

а затем использоватьnpmПроект инициализации:

Язык кода:bash
копировать
$ npm init -y 

это будет в твоемиз Каталог проектасерединасоздать новыйизpackage.jsonдокумент。

Язык кода:bash
копировать
$ npm i typescript @types/node

Это установит машинопись для нашего проекта.

Шаг 3. Настройте web3.js и подключитесь к сети Ganache.

На этом этапе мы настроим библиотеку web3.js и подключимся к сети Ganache. Итак, если у вас еще не запущен Ganache, обязательно сделайте это.

первый,использоватьnpmУстановитьweb3Сумка:

Язык кода:bash
копировать
$ npm i web3

Следующий,над вамииз Каталог проектасередина Создайте файл с именемindex.tsизновыйдокумент,и добавьте в него следующий код:

Язык кода:typescript
копировать
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 и записывает текущий номер блока на консоль.

Запустите следующую команду, чтобы проверить соединение:

Язык кода:bash
копировать
$ npx ts-node index.ts

если все в порядке,Вы должны увидеть текущий номер блока в консоли. Однако,Если вы получили ошибку,Причина в томconnect ECONNREFUSED 127.0.0.1:7545,Затем, пожалуйста, проверьте еще раз, если вы местныйиз7545запустить в портуGanache。

Шаг 4. Разверните смарт-контракт в сети Ganache с помощью web3.js.

На этом этапе мы развернем смарт-контракт в сети Ganache с помощью web3.js.

В первом примере,Мы отправим простойизторговля。Создайте файл с именемtransaction.tsиздокумент,и заполните его следующим кодом:

Язык кода:typescript
копировать
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Поле указывает аккаунт。

Выполните следующую команду:

Язык кода:bash
копировать
$ npx ts-node transaction.ts

Если все в порядке, вы должны увидеть что-то вроде этого:

Язык кода:typescript
копировать
[
  '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издокумент,и заполните его следующим кодом:

Язык кода:typescript
копировать
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();
})();

Выполните следующую команду:

Язык кода:bash
копировать
$ npx ts-node estimate.ts

Если все в порядке, вы должны увидеть что-то вроде этого:

Язык кода:typescript
копировать
Default format: 140648n
Eth format: 0x22568

На что следует обратить внимание отweb3.jsвозвращатьсяиз Числа по умолчаниюBigIntвозврат формата。В этом примере,насиспользовать ПонятноETH_DATA_FORMATпараметр,Его можно передать в большинство методов web3.js.,чтобы отформатировать результат в шестнадцатеричном формате.

В следующем примере,мы подпишем сделку,ииспользоватьsendSignedTransactionотправить подписанныйизторговля。Создайте файл с именемsendSigned.tsиздокумент,и заполните его следующим кодом:

Язык кода:typescript
копировать
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();
})();

Выполните следующую команду:

Язык кода:bash
копировать
$ npx ts-node sendSigned.ts

Если все в порядке, вы должны увидеть что-то вроде этого:

Язык кода:typescript
копировать
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метод:

Язык кода:typescript
копировать
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.

Язык кода:typescript
копировать
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. Отправляйте различные типы транзакций

традиционная торговля

В Эфириуме «традиционная «Торговля» обычно относится к традиционной транзакции, в которой плата за газ явно устанавливается отправителем и может меняться в зависимости от спроса в сети. Эти традиционные торговля реализует Предложение по улучшению Ethereum (EIP) До 1559 года это было очень распространено в сети Ethereum.

К основным особенностям традиционной торговли относятся:

  1. Цены на газ: в традиционной торговлясередина,Отправитель указывает цену газа (в гвэях), которую он готов заплатить за единицу газа, потребленного в рамках транзакции. Цены на газ могут быть скорректированы отправителем.,Он определяет приоритет транзакций, обрабатываемых майнерами. Более высокие цены на газ означают более быстрое подтверждение транзакций.
  2. Лимит газа: Отправитель также устанавливает лимит газа, который представляет собой максимальное количество газа, которое может потреблять транзакция. Газ — это вычислительное топливо, используемое для выполнения транзакций и смарт-контрактов в сети Ethereum. Лимит газа в первую очередь установлен для того, чтобы отправители не исчерпали эфир во время обработки транзакций. Это также может повлиять на успех или неудачу транзакции.
  3. Неопределенность стоимости: традиционная торговляв зависимости от перегрузки сетиизколебания цен на газиз Влияние。Пользуется высоким спросомизпериод,Цены на газ могут взлететь,В результате пользователи платят больше за оперативную обработку своих транзакций. Напротив,В периоды затишья в Интернете,Пользователи могут платить более низкие комиссии.
  4. Оценка затрат вручную. Пользователи несут ответственность за оценку затрат вручную в своих традиционных торговлясередина Сумка Содержитизсоответствующийизцена на газ,для обеспечения своевременной обработки. Процесс может быть сложным,Поскольку установленная цена на газ слишком низкая, это может привести к медленному подтверждению.,А установление слишком высоких цен может привести к переплате.
  5. EIP-1559, описанный ниже, вносит изменения в систему комиссий за транзакции Ethereum.,Сделайте его более удобным и предсказуемым. в ЭИП-1559,Концепция «базовой платы» заменяет ручное установление цен на газ,Это уменьшается с помощью традиционной Некоторые неопределенности, связанные с торговлей.

Хотя EIP-1559 значительно улучшает взаимодействие с пользователем.,Но традиционная торговля по-прежнему поддерживается в сети Ethereum.,Если пользователь желает,Транзакции могут продолжать отправляться с указанием вручную цен на газ и лимитов газа. Однако,Механизм EIP-1559 теперь является рекомендуемым методом для большинства транзакций.,потому что это упрощает процесс,Уменьшает возможность переплаты за комиссионные.

отправитьтрадиционная торговля, пожалуйста, используйте следующий код:

Язык кода:typescript
копировать
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

Предложение по улучшению Ethereum 2930 — это предлагаемое изменение сети Ethereum, которое было реализовано в рамках хард-форка Berlin, активированного в апреле 2021 года. В EIP-2930 появилась функция под названием «Типы транзакций и списки доступа». Это улучшение повышает эффективность использования газа при определенных взаимодействиях смарт-контрактов и обеспечивает большую гибкость при указании того, кто может получить доступ к определенным ресурсам в смарт-контракте. Ниже приведены основные компоненты EIP-2930:

  1. Тип транзакции: EIP-2930 представляет новый тип транзакции, называемый «Транзакция списка доступа». Этот тип транзакции предназначен для повышения эффективности определенных взаимодействий со смарт-контрактами, позволяя отправителю указать список адресов, к которым можно получить доступ или изменить их во время транзакции.
  2. Список доступа. Список доступа — это формат структурированных данных, включенный в транзакцию. Он содержит список адресов и ключей хранения, к которым ожидается доступ или изменение во время выполнения транзакции. Это помогает уменьшить количество газа, необходимое для этих операций, поскольку майнеры могут проверять списки доступа для оптимизации выполнения.
  3. Экономия газа: EIP-2930 предназначен для значительного снижения затрат на газ для транзакций, использующих функцию списка доступа. Указывая слоты хранения и адреса, связанные с транзакциями, это позволяет более эффективно использовать газ, особенно при взаимодействии смарт-контрактов с крупными государствами.
  4. Взаимодействие с контрактами: это улучшение особенно полезно при взаимодействии с контрактами со сложными структурами состояния, поскольку оно сводит к минимуму газ, необходимый для чтения или записи из определенного слота хранилища. Это может сэкономить затраты для пользователей и сделать определенные взаимодействия более практичными.

EIP-2930 является частью постоянных усилий Ethereum по повышению эффективности сети и снижению транзакционных издержек, что делает ее более доступной и масштабируемой для децентрализованных приложений и пользователей. Это особенно полезно для взаимодействия с контрактами с отслеживанием состояния, которые полагаются на определенные операции хранения и механизмы контроля доступа.

Отправить Транзакцию EIP-2930, используйте код ниже:

Язык кода:typescript
копировать
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договоризкод

Язык кода:typescript
копировать
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

Предложение по улучшению Ethereum 1559 — это серьезное обновление рынка комиссий сети Ethereum и механизма ценообразования за транзакции. Он был реализован в рамках хардфорка Ethereum London, который состоялся в августе 2021 года. EIP-1559 вносит несколько изменений в способ работы комиссий за транзакции в блокчейне Ethereum, основная цель которых — улучшить взаимодействие с пользователем и эффективность сети.

Вот некоторые ключевые функции и изменения, представленные EIP-1559:

  1. Базовая плата: EIP-1559 вводит понятие «базовая плата». Базовая комиссия — это минимальная комиссия, необходимая для включения транзакции в блок. Оно алгоритмически определяется сетью и динамически корректируется в зависимости от перегрузки сети. Когда сеть занята, базовая плата увеличивается, а когда сеть менее перегружена, базовая плата уменьшается.
  2. Плата за включение: в дополнение к базовой комиссии пользователи могут добровольно включать «чаевые» или «плату за включение», чтобы стимулировать майнеров включать свои транзакции в следующий блок. Это позволяет пользователям ускорять свои транзакции, оставляя чаевые майнерам.
  3. Предсказуемые комиссии. Благодаря EIP-1559 пользователи имеют более предсказуемый способ оценки комиссий за транзакции. Они могут установить максимальную сумму, которую готовы заплатить, включая базовую плату и чаевые. Это избавляет пользователей от необходимости угадывать соответствующую цену на газ.
  4. Механизм сжигания: EIP-1559 представляет механизм, с помощью которого базовые комиссии «сжигаются» из обращения, сокращая общее количество Эфириума (ETH). Этот дефляционный механизм может помочь решить некоторые проблемы, связанные с увеличением предложения ETH, и потенциально сделать его лучшим средством сбережения.
  5. Улучшенные аукционы комиссий. В соответствии с EIP-1559 аукционы комиссий более эффективны. Пользователи указывают максимальную комиссию, которую они готовы заплатить, и протокол автоматически корректирует чаевые, чтобы обеспечить быструю обработку транзакций без переплаты.
  6. Упрощенный процесс транзакций. Пользователи испытывают упрощенный процесс транзакций, поскольку им не нужно вручную устанавливать цены на газ. Вместо этого они указывают максимальную комиссию, которую готовы заплатить, а остальное берет на себя программное обеспечение кошелька.

EIP-1559 получил высокую оценку за его потенциал создания более удобной и эффективной системы комиссий за транзакции, что делает сеть Ethereum более доступной и предсказуемой для пользователей. Это также рассматривается как важный шаг в переходе на Ethereum 2.0, целью которого является решение проблем масштабируемости и устойчивости сети.

Отправить Транзакцию EIP-1559, используйте код ниже:

Язык кода:typescript
копировать
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Сумкапоставлятьиздругойметод。

Вооружившись этими знаниями, вы можете начать экспериментировать с блокчейном Ethereum. Помните, это только начало, вам еще многое предстоит узнать об Ethereum и web3.js. Так что продолжайте исследовать, строить и получайте удовольствие!

Web3.js версии 4.x предоставляет мощный и простой в использовании интерфейс для взаимодействия с сетью Ethereum и создания децентрализованных приложений. Он был переписан на TypeScript, но для упрощения этого руководства мы взаимодействуем с ним на JavaScript.

Экосистема Ethereum постоянно развивается, и всегда есть чему поучиться и открыть. Продолжая развивать свои навыки и знания, продолжайте исследовать и пробовать новые технологии и инструменты для создания инновационных и децентрализованных решений.

Советы и рекомендации

  • Всегда проверяйте свои смарт-контракты в локальной сети, например Ganache или Hardhat, прежде чем развертывать их в основной сети.
  • Используйте последние версии web3.js и Solidity, чтобы воспользоваться новейшими функциями и исправлениями безопасности.
  • Защитите свой закрытый ключ и никогда никому его не передавайте.
  • Используйте лимиты газа и параметры цены газа с осторожностью, чтобы не тратить слишком много на комиссии за транзакции.
  • Перед отправкой транзакции в сеть,использоватьweb3.jsсерединаизestimateGas函数来估算торговля所需изгаз。
  • Используйте события для уведомления клиентских приложений об изменениях состояния смарт-контракта.
  • Используйте линтер, такой как Solhint, для проверки распространенных ошибок кодирования Solidity.

заявление:Эта работа принимаетС указанием авторства-Некоммерческая-ShareAlike 4.0 интернациональность (CC BY-NC-SA 4.0)Дать разрешение,При использовании указывайте источник.

blog: mengbin

Github: mengbin92

cnblogs: Влюбиться в воду невольно

Сообщество разработчиков облачных технологий Tencent:Мюнстер


boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose