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
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.