---
title: "Надсилання транзакцій за допомогою Web3"
description: "Це посібник для початківців щодо надсилання транзакцій Етеріуму за допомогою Web3. Щоб надіслати транзакцію до блокчейну Етеріуму, потрібно виконати три основні кроки: створити, підписати та транслювати. Ми розглянемо всі три."
author: "Елан Гальперн"
tags: ["транзакції", "web3.js", "Alchemy"]
skill: beginner
breadcrumb: "Надсилання транзакцій"
lang: uk
published: 2020-11-04
source: Alchemy docs
sourceUrl: https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum
---

Це посібник для початківців щодо надсилання транзакцій Етеріуму за допомогою Web3. Щоб надіслати транзакцію до блокчейну Етеріуму, потрібно виконати три основні кроки: створити, підписати та транслювати. Ми розглянемо всі три, і сподіваємося, що відповімо на будь-які ваші запитання! У цьому посібнику ми будемо використовувати [Alchemy](https://www.alchemy.com/) для надсилання наших транзакцій до ланцюга Етеріуму. Ви можете [створити безкоштовний акаунт Alchemy тут](https://auth.alchemy.com/signup).

**ПРИМІТКА:** Цей посібник призначений для підписання транзакцій на _бекенді_ вашого застосунку. Якщо ви хочете інтегрувати підписання транзакцій на фронтенді, перегляньте статтю про інтеграцію [Web3 з браузерним провайдером](https://docs.alchemy.com/reference/api-overview#with-a-browser-provider).

## Основи {#the-basics}

Як і більшість розробників блокчейну на початку свого шляху, ви, можливо, шукали інформацію про те, як надіслати транзакцію (щось, що має бути досить простим), і натрапили на безліч посібників, кожен з яких говорить різні речі, залишаючи вас трохи спантеличеними та розгубленими. Якщо ви опинилися в такій ситуації, не хвилюйтеся; ми всі колись там були! Отже, перш ніж ми почнемо, давайте з'ясуємо кілька речей:

### 1\. Alchemy не зберігає ваші приватні ключі {#alchemy-does-not-store-your-private-keys}

- Це означає, що Alchemy не може підписувати та надсилати транзакції від вашого імені. Причиною цього є міркування безпеки. Alchemy ніколи не попросить вас поділитися своїм приватним ключем, і ви ніколи не повинні ділитися своїм приватним ключем з розміщеним вузлом (або з будь-ким іншим).
- Ви можете зчитувати дані з блокчейну за допомогою основного API Alchemy, але щоб записувати в нього, вам знадобиться щось інше для підписання транзакцій перед їх надсиланням через Alchemy (це стосується будь-якого іншого [сервісу вузлів](/developers/docs/nodes-and-clients/nodes-as-a-service/)).

### 2\. Що таке «підписувач» (signer)? {#what-is-a-signer}

- Підписувачі підписуватимуть транзакції для вас, використовуючи ваш приватний ключ. У цьому посібнику ми будемо використовувати [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) для підписання нашої транзакції, але ви також можете використовувати будь-яку іншу бібліотеку Web3.
- На фронтенді хорошим прикладом підписувача є [МетаМаск](https://metamask.io/), який підписуватиме та надсилатиме транзакції від вашого імені.
### 3\. Навіщо мені підписувати свої транзакції? {#why-do-i-need-to-sign-my-transactions}

- Кожен користувач, який хоче надіслати транзакцію в мережі Етеріум, повинен підписати транзакцію (використовуючи свій приватний ключ), щоб підтвердити, що джерелом транзакції є той, за кого він себе видає.
- Надзвичайно важливо захистити цей приватний ключ, оскільки доступ до нього надає повний контроль над вашим акаунтом Етеріуму, дозволяючи вам (або будь-кому, хто має доступ) здійснювати транзакції від вашого імені.

### 4\. Як мені захистити свій приватний ключ? {#how-do-i-protect-my-private-key}

- Існує багато способів захистити свій приватний ключ і використовувати його для надсилання транзакцій. У цьому посібнику ми будемо використовувати файл `.env`. Однак ви також можете використовувати окремого провайдера, який зберігає приватні ключі, використовувати файл сховища ключів або інші варіанти.

### 5\. Яка різниця між `eth_sendTransaction` та `eth_sendRawTransaction`? {#difference-between-send-and-send-raw}

`eth_sendTransaction` та `eth_sendRawTransaction` — це функції API Етеріуму, які транслюють транзакцію в мережу Етеріум, щоб її було додано до майбутнього блоку. Вони відрізняються тим, як обробляють підписання транзакцій.

- [`eth_sendTransaction`](https://docs.web3js.org/api/web3-eth/function/sendTransaction) використовується для надсилання _непідписаних_ транзакцій, що означає, що вузол, на який ви надсилаєте, повинен керувати вашим приватним ключем, щоб він міг підписати транзакцію перед її трансляцією в ланцюг. Оскільки Alchemy не зберігає приватні ключі користувачів, вони не підтримують цей метод.
- [`eth_sendRawTransaction`](https://www.alchemy.com/docs/chains/ethereum/ethereum-api-endpoints/eth-send-raw-transaction) використовується для трансляції транзакцій, які вже були підписані. Це означає, що спочатку вам потрібно використати [`signTransaction(tx, private_key)`](https://docs.web3js.org/api/web3-eth-accounts/function/signTransaction), а потім передати результат у `eth_sendRawTransaction`.

При використанні Web3 доступ до `eth_sendRawTransaction` здійснюється шляхом виклику функції [web3.eth.sendSignedTransaction](https://docs.web3js.org/api/web3-eth/function/sendSignedTransaction).

Саме це ми будемо використовувати в цьому посібнику.

### 6\. Що таке бібліотека Web3? {#what-is-the-web3-library}

- Web3.js — це бібліотека-обгортка навколо стандартних викликів JSON-RPC, яку досить часто використовують у розробці для Етеріуму.
- Існує багато бібліотек Web3 для різних мов. У цьому посібнику ми будемо використовувати [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3), яка написана на JavaScript. Ви можете переглянути інші варіанти [тут](/developers/docs/apis/javascript/), наприклад [Ethers.js](https://docs.ethers.org/v5/).

Гаразд, тепер, коли ми розібралися з деякими з цих питань, давайте перейдемо до посібника. Не соромтеся ставити запитання в будь-який час у [Discord](https://discord.gg/gWuC7zB) Alchemy!

### 7\. Як надсилати безпечні, оптимізовані за газом та приватні транзакції? {#how-to-send-secure-gas-optimized-and-private-transactions}

- [Alchemy має набір ресурсів для транзакцій](https://www.alchemy.com/docs/sending-transactions). Ви можете використовувати їх для надсилання транзакцій, симуляції транзакцій до їх виконання, надсилання приватних транзакцій та надсилання транзакцій, оптимізованих за газом.
- Ви також можете використовувати [вебхуки Alchemy](https://www.alchemy.com/docs/reference/webhooks-overview), щоб отримувати сповіщення, коли ваша транзакція вилучається з мемпулу та додається до ланцюга.

**ПРИМІТКА:** Цей посібник вимагає наявності акаунта Alchemy, адреси Етеріуму або гаманця МетаМаск, а також встановлених Node.js та npm. Якщо у вас їх немає, виконайте наступні кроки:

1.  [Створіть безкоштовний акаунт Alchemy](https://auth.alchemy.com/signup)
2.  [Створіть акаунт МетаМаск](https://metamask.io/) (або отримайте адресу Етеріуму)
3.  [Встановіть Node.js та npm](https://nodejs.org/en/download/)
## Кроки для надсилання вашої транзакції {#steps-to-sending-your-transaction}

### 1\. Створіть застосунок Alchemy в тестовій мережі Sepolia {#create-an-alchemy-app-on-the-sepolia-testnet}

Перейдіть до вашої [панелі керування Alchemy](https://dashboard.alchemy.com/) та створіть новий застосунок, вибравши Sepolia (або будь-яку іншу тестову мережу) як вашу мережу.

### 2\. Запросіть ETH з крана Sepolia {#request-eth-from-sepolia-faucet}

Дотримуйтесь інструкцій на [крані Sepolia від Alchemy](https://www.sepoliafaucet.com/), щоб отримати ETH. Переконайтеся, що ви вказали свою адресу Етеріуму в мережі **Sepolia** (з МетаМаск), а не в іншій мережі. Після виконання інструкцій ще раз перевірте, чи отримали ви ETH на свій гаманець.

### 3\. Створіть нову директорію проєкту та перейдіть до неї за допомогою `cd` {#create-a-new-project-direction}

Створіть нову директорію проєкту з командного рядка (терміналу для Mac) і перейдіть до неї:

```
mkdir sendtx-example
cd sendtx-example
```

### 4\. Встановіть Alchemy Web3 (або будь-яку бібліотеку Web3) {#install-alchemy-web3}

Виконайте наступну команду у директорії вашого проєкту, щоб встановити [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3):

Зверніть увагу, якщо ви хочете використовувати бібліотеку Ethers.js, [дотримуйтесь інструкцій тут](https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum).

```
npm install @alch/alchemy-web3
```

### 5\. Встановіть dotenv {#install-dotenv}

Ми будемо використовувати файл `.env` для безпечного зберігання нашого ключа API та приватного ключа.

```
npm install dotenv --save
```

### 6\. Створіть файл `.env` {#create-the-dotenv-file}

Створіть файл `.env` у директорії вашого проєкту та додайте наступне (замінивши «`your-api-url`» та «`your-private-key`»):

- Щоб знайти URL-адресу вашого API Alchemy, перейдіть на сторінку деталей щойно створеного застосунку на вашій панелі керування, натисніть «View Key» (Переглянути ключ) у верхньому правому куті та скопіюйте HTTP URL.
- Щоб знайти свій приватний ключ за допомогою МетаМаск, перегляньте цей [посібник](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key).

```
API_URL = "ваш-api-url"
PRIVATE_KEY = "ваш-приватний-ключ"
```

<Alert variant="warning">
<AlertContent>
<AlertDescription>
Не робіть коміт файлу <code>.env</code>! Будь ласка, ніколи не діліться і не розкривайте свій файл <code>.env</code> нікому, оскільки цим ви ставите під загрозу свої секретні дані. Якщо ви використовуєте систему контролю версій, додайте свій <code>.env</code> до файлу <a href="https://git-scm.com/docs/gitignore">gitignore</a>.
</AlertDescription>
</AlertContent>
</Alert>

### 7\. Створіть файл `sendTx.js` {#create-sendtx-js}

Чудово, тепер, коли наші конфіденційні дані захищені у файлі `.env`, давайте почнемо писати код. Для нашого прикладу надсилання транзакції ми будемо надсилати ETH назад на кран Sepolia.

Створіть файл `sendTx.js`, де ми налаштуємо та надішлемо нашу тестову транзакцію, і додайте до нього наступні рядки коду:

```
async function main() {
    require('dotenv').config();
    const { API_URL, PRIVATE_KEY } = process.env;
    const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
    const web3 = createAlchemyWeb3(API_URL);
    const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: замініть цю адресу на вашу власну публічну адресу

    const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // нонс починає відлік з 0

    const transaction = {
     'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // адреса крана для повернення eth
     'value': 1000000000000000000, // 1 ETH
     'gas': 30000,
     'nonce': nonce,
     // необов'язкове поле даних для надсилання повідомлення або виконання смарт-контракту
    };

    const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);

    web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) {
    if (!error) {
      console.log("🎉 The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!");
    } else {
      console.log("❗Something went wrong while submitting your transaction:", error)
    }
   });
}

main();
```

Обов'язково замініть адресу в **рядку 6** на вашу власну публічну адресу.

Тепер, перш ніж ми перейдемо до запуску цього коду, давайте поговоримо про деякі його компоненти.

- `nonce`: Специфікація нонсу використовується для відстеження кількості транзакцій, надісланих з вашої адреси. Це потрібно нам з міркувань безпеки та для запобігання атакам повторного відтворення. Щоб отримати кількість транзакцій, надісланих з вашої адреси, ми використовуємо [getTransactionCount](https://www.alchemy.com/docs/chains/ethereum/ethereum-api-endpoints/eth-get-transaction-count).
- `transaction`: Об'єкт транзакції має кілька аспектів, які нам потрібно вказати:
  - `to`: Це адреса, на яку ми хочемо надіслати ETH. У цьому випадку ми надсилаємо ETH назад на [кран Sepolia](https://sepoliafaucet.com/), з якого ми спочатку їх запитували.
  - `value`: Це сума, яку ми хочемо надіслати, вказана у Wei, де 10^18 Wei = 1 ETH.
  - `gas`: Існує багато способів визначити правильну кількість газу для включення у вашу транзакцію. Alchemy підтримує [вебхуки](https://www.alchemy.com/docs/reference/webhooks-overview), які можуть сповіщати вас про ончейн-активність. Для транзакцій у Головній мережі хорошою практикою є перевірка поточних умов газу, щоб визначити правильну кількість газу для включення. 21000 — це мінімальна кількість газу, яку використовуватиме операція в Етеріумі, тому, щоб гарантувати виконання нашої транзакції, ми вказуємо тут 30000.
  - `nonce`: дивіться визначення нонсу вище. Нонс починає відлік з нуля.
  - [НЕОБОВ'ЯЗКОВО] data: Використовується для надсилання додаткової інформації з вашим переказом або виклику смарт-контракту, не вимагається для переказів балансу, перегляньте примітку нижче.
- `signedTx`: Щоб підписати наш об'єкт транзакції, ми будемо використовувати метод `signTransaction` з нашим `PRIVATE_KEY`.
- `sendSignedTransaction`: Щойно ми отримаємо підписану транзакцію, ми можемо надіслати її для включення в наступний блок за допомогою `sendSignedTransaction`.

**Примітка щодо даних (data)**
В Етеріумі можна надіслати два основні типи транзакцій.

- Переказ балансу: Надіслати ETH з однієї адреси на іншу. Поле даних не вимагається, однак, якщо ви хочете надіслати додаткову інформацію разом із транзакцією, ви можете включити цю інформацію у форматі HEX у це поле.
  - Наприклад, припустимо, ми хотіли б записати хеш документа IPFS у ланцюг Етеріуму, щоб надати йому незмінну часову мітку. Тоді наше поле даних має виглядати як data: `web3.utils.toHex(‘IPFS hash‘)`. І тепер будь-хто може зробити запит до ланцюга і побачити, коли цей документ був доданий.
- Транзакція смарт-контракту: Виконати певний код смарт-контракту в ланцюзі. У цьому випадку поле даних має містити смарт-функцію, яку ви хочете виконати, разом із будь-якими параметрами.
  - Для практичного прикладу перегляньте [посібник зі смарт-контракту Hello World](/developers/tutorials/hello-world-smart-contract/).
### 8\. Запустіть код за допомогою `node sendTx.js` {#run-the-code-using-node-sendtx-js}

Поверніться до свого терміналу або командного рядка та виконайте:

```
node sendTx.js
```

### 9\. Перегляньте свою транзакцію в мемпулі {#see-your-transaction-in-the-mempool}

Відкрийте [сторінку мемпулу](https://dashboard.alchemy.com/mempool) на вашій панелі керування Alchemy та відфільтруйте за створеним вами застосунком, щоб знайти свою транзакцію. Саме тут ми можемо спостерігати за переходом нашої транзакції зі стану очікування (pending) до стану видобутку (mined) (у разі успіху) або відхиленого стану (dropped) у разі невдачі. Переконайтеся, що вибрано «All» (Усі), щоб ви могли бачити «mined», «pending» та «dropped» транзакції. Ви також можете знайти свою транзакцію, шукаючи транзакції, надіслані на адресу `0x31b98d14007bdee637298086988a0bbd31184523` .

Щоб переглянути деталі вашої транзакції після того, як ви її знайшли, виберіть хеш транзакції, що має перенаправити вас до вигляду, схожого на цей:

![Скриншот спостерігача мемпулу](./mempool.png)

Звідти ви можете переглянути свою транзакцію на Etherscan, натиснувши на іконку, обведену червоним!

**Ура! Ви щойно надіслали свою першу транзакцію Етеріуму за допомогою Alchemy 🎉**

_Для відгуків та пропозицій щодо цього посібника, будь ласка, напишіть Elan у [Discord](https://discord.gg/A39JVCM) Alchemy!_

_Спочатку опубліковано Alchemy._
