---
title: "Отправка транзакций с использованием Web3"
description: "Это руководство для начинающих по отправке транзакций Эфириума с использованием Web3. Для отправки транзакции в блокчейн Эфириума необходимо выполнить три основных шага: создание, подписание и трансляция. Мы рассмотрим все три."
author: "Элан Халперн"
tags:
  - транзакции
  - web3.js
  - alchemy
skill: beginner
breadcrumb: "Отправка транзакций"
lang: ru
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}

- Подписанты (signers) будут подписывать транзакции для вас, используя ваш приватный ключ. В этом руководстве мы будем использовать [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/).

Отлично, теперь, когда мы разобрались с некоторыми из этих вопросов, давайте перейдем к руководству. Не стесняйтесь задавать вопросы в любое время в [Дискорде](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}

Следуйте инструкциям в [кране Alchemy Sepolia](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 = "your-api-url"
PRIVATE_KEY = "your-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» (Все), чтобы вы могли видеть «добытые», «ожидающие» и «отброшенные» транзакции. Вы также можете найти свою транзакцию, выполнив поиск транзакций, отправленных на адрес `0x31b98d14007bdee637298086988a0bbd31184523`.

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

![Скриншот наблюдателя мемпула](./mempool.png)

Оттуда вы можете просмотреть свою транзакцию на Etherscan, нажав на значок, обведенный красным!

**Ура! Вы только что отправили свою первую транзакцию в Эфириуме с использованием Alchemy 🎉**

_Для отзывов и предложений по этому руководству, пожалуйста, напишите Elan в [Дискорде](https://discord.gg/A39JVCM) Alchemy!_

_Первоначально опубликовано Alchemy._
