Перейти к основному содержанию

Отправка транзакций с помощью Web3

транзакции
web3.js
Alchemy
Beginner
Elan Halpern
4 ноября 2020 г.
9 минута прочтения

Это удобное руководство для начинающих по отправке транзакций Ethereum с помощью Web3. Для отправки транзакций в блокчейн Ethereum необходимо выполнить три основных действия: создать, подписать и транслировать. Мы рассмотрим все три и, надеемся, ответим на все ваши вопросы! В этом руководстве мы будем использовать Alchemyopens in a new tab для отправки наших транзакций в сеть Ethereum. Вы можете создать бесплатный аккаунт Alchemy здесьopens in a new tab.

ПРИМЕЧАНИЕ: Это руководство предназначено для подписания ваших транзакций на серверной части вашего приложения. Если вы хотите интегрировать подписание транзакций на стороне клиента, ознакомьтесь с интеграцией Web3 с браузерным провайдеромopens in a new tab.

Основы

Как и большинство блокчейн-разработчиков в начале своего пути, вы, возможно, искали информацию о том, как отправить транзакцию (что должно быть довольно просто), и наткнулись на множество руководств, в каждом из которых говорится о разном, что приводит вас в некоторое замешательство и растерянность. Если вы в такой ситуации, не волнуйтесь, мы все через это проходили! Итак, прежде чем мы начнем, давайте проясним несколько моментов:

1. Alchemy не хранит ваши приватные ключи

  • Это означает, что Alchemy не может подписывать и отправлять транзакции от вашего имени. Это сделано в целях безопасности. Alchemy никогда не попросит вас поделиться своим приватным ключом, и вы никогда не должны делиться своим приватным ключом с хостинговым узлом (или с кем-либо еще).
  • Вы можете считывать данные из блокчейна с помощью основного API Alchemy, но для записи в него вам понадобится что-то еще для подписания ваших транзакций перед их отправкой через Alchemy (то же самое относится и к любому другому сервису узлов).

2. Что такое «подписант»?

  • Подписанты подписывают транзакции за вас, используя ваш приватный ключ. В этом руководстве мы будем использовать Alchemy web3opens in a new tab для подписания нашей транзакции, но вы также можете использовать любую другую библиотеку web3.
  • На стороне клиента хорошим примером подписанта является MetaMaskopens in a new tab, который будет подписывать и отправлять транзакции от вашего имени.

3. Зачем мне нужно подписывать транзакции?

  • Каждый пользователь, желающий отправить транзакцию в сети Ethereum, должен подписать ее (используя свой приватный ключ), чтобы подтвердить, что отправитель транзакции действительно тот, за кого себя выдает.
  • Очень важно защищать этот приватный ключ, поскольку доступ к нему дает полный контроль над вашим аккаунтом Ethereum, позволяя вам (или любому, у кого есть доступ) совершать транзакции от вашего имени.

4. Как защитить мой приватный ключ?

  • Существует много способов защитить ваш приватный ключ и использовать его для отправки транзакций. В этом руководстве мы будем использовать файл .env. Однако вы также можете использовать отдельного провайдера, который хранит приватные ключи, использовать файл хранилища ключей или другие варианты.

5. В чем разница между eth_sendTransaction и eth_sendRawTransaction?

eth_sendTransaction и eth_sendRawTransaction — это функции API Ethereum, которые транслируют транзакцию в сеть Ethereum, чтобы она была добавлена в один из будущих блоков. Они различаются тем, как они обрабатывают подписание транзакций.

  • eth_sendTransactionopens in a new tab используется для отправки неподписанных транзакций. Это означает, что узел, на который вы отправляете транзакцию, должен управлять вашим приватным ключом, чтобы он мог подписать транзакцию перед ее трансляцией в сеть. Поскольку Alchemy не хранит приватные ключи пользователей, этот метод не поддерживается.
  • eth_sendRawTransactionopens in a new tab используется для трансляции уже подписанных транзакций. Это означает, что сначала вы должны использовать signTransaction(tx, private_key)opens in a new tab, а затем передать результат в eth_sendRawTransaction.

При использовании web3 доступ к eth_sendRawTransaction осуществляется путем вызова функции web3.eth.sendSignedTransactionopens in a new tab.

Именно это мы и будем использовать в данном руководстве.

6. Что такое библиотека web3?

  • Web3.js — это библиотека-оболочка для стандартных вызовов JSON-RPC, которая довольно часто используется в разработке для Ethereum.
  • Существует множество библиотек web3 для разных языков. В этом руководстве мы будем использовать Alchemy Web3opens in a new tab, написанную на JavaScript. Вы можете ознакомиться с другими вариантами здесьopens in a new tab, например, с ethers.jsopens in a new tab.

Хорошо, теперь, когда мы разобрались с некоторыми из этих вопросов, давайте перейдем к руководству. Не стесняйтесь задавать вопросы в любое время в Discordopens in a new tab от Alchemy!

7. Как отправлять безопасные, оптимизированные по газу и приватные транзакции?

  • У Alchemy есть набор API Transactopens in a new tab. Вы можете использовать их для отправки усиленных транзакций, симуляции транзакций до их выполнения, отправки приватных транзакций и отправки транзакций с оптимизированным расходом газа.
  • Вы также можете использовать Notify APIopens in a new tab, чтобы получать оповещения, когда ваша транзакция извлечена из мемпула и добавлена в блокчейн.

ПРИМЕЧАНИЕ: Для этого руководства требуется аккаунт Alchemy, адрес Ethereum или кошелек MetaMask, а также установленные NodeJs и npm. Если у вас их нет, выполните следующие действия:

  1. Создайте бесплатный аккаунт Alchemyopens in a new tab
  2. Создайте аккаунт MetaMaskopens in a new tab (или получите адрес Ethereum)
  3. Следуйте этим инструкциям для установки NodeJs и NPMopens in a new tab

Шаги по отправке транзакции

1. Создайте приложение Alchemy в тестовой сети Sepolia

Перейдите на свою панель управления Alchemyopens in a new tab и создайте новое приложение, выбрав Sepolia (или любую другую тестовую сеть) в качестве своей сети.

2. Запросите ETH из крана Sepolia

Следуйте инструкциям на кране Sepolia от Alchemyopens in a new tab, чтобы получить ETH. Убедитесь, что вы указываете свой адрес Ethereum в сети Sepolia (из MetaMask), а не в другой сети. После выполнения инструкций еще раз проверьте, получили ли вы ETH на свой кошелек.

3. Создайте новый каталог проекта и перейдите в него с помощью cd

Создайте новый каталог проекта из командной строки (терминала для Mac) и перейдите в него:

1mkdir sendtx-example
2cd sendtx-example

4. Установите Alchemy Web3 (или любую другую библиотеку web3)

Выполните следующую команду в каталоге вашего проекта, чтобы установить Alchemy Web3opens in a new tab:

Примечание: если вы хотите использовать библиотеку ethers.js, следуйте этим инструкциямopens in a new tab.

1npm install @alch/alchemy-web3

5. Установите dotenv

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

1npm install dotenv --save

6. Создайте файл .env

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

  • Чтобы найти URL-адрес API Alchemy, перейдите на страницу сведений о приложении, которое вы только что создали на своей панели управления, нажмите «View Key» (Просмотреть ключ) в правом верхнем углу и скопируйте URL-адрес HTTP.
  • Чтобы найти свой приватный ключ с помощью MetaMask, ознакомьтесь с этим руководствомopens in a new tab.
1API_URL = "your-api-url"
2PRIVATE_KEY = "your-private-key"

7. Создайте файл sendTx.js

Отлично, теперь, когда наши конфиденциальные данные защищены в файле .env, давайте начнем писать код. В нашем примере отправки транзакции мы будем отправлять ETH обратно в кран Sepolia.

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

1async function main() {
2 require('dotenv').config();
3 const { API_URL, PRIVATE_KEY } = process.env;
4 const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
5 const web3 = createAlchemyWeb3(API_URL);
6 const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: замените этот адрес своим публичным адресом
7
8 const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // nonce начинает отсчет с 0
9
10 const transaction = {
11 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // адрес крана для возврата eth
12 'value': 1000000000000000000, // 1 ETH
13 'gas': 30000,
14 'nonce': nonce,
15 // необязательное поле данных для отправки сообщения или выполнения смарт-контракта
16 };
17
18 const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY);
19
20 web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) {
21 if (!error) {
22 console.log("🎉 Хеш вашей транзакции: ", hash, "\n Проверьте мемпул Alchemy, чтобы просмотреть статус вашей транзакции!");
23 } else {
24 console.log("❗Что-то пошло не так при отправке вашей транзакции:", error)
25 }
26 });
27}
28
29main();
Показать все

Обязательно замените адрес в строке 6 на свой собственный публичный адрес.

Теперь, прежде чем мы приступим к запуску этого кода, давайте поговорим о некоторых его компонентах.

  • nonce: спецификация nonce используется для отслеживания количества транзакций, отправленных с вашего адреса. Это необходимо в целях безопасности и для предотвращения атак повторного воспроизведенияopens in a new tab. Чтобы получить количество транзакций, отправленных с вашего адреса, мы используем getTransactionCountopens in a new tab.
  • transaction: объект транзакции имеет несколько аспектов, которые нам нужно указать
    • to: это адрес, на который мы хотим отправить ETH. В данном случае мы отправляем ETH обратно в кран Sepoliaopens in a new tab, из которого мы изначально их запрашивали.
    • value: это сумма, которую мы хотим отправить, указанная в Wei, где 10^18 Wei = 1 ETH.
    • gas: существует множество способов определить правильное количество газа для включения в транзакцию. У Alchemy даже есть веб-хук цены на газopens in a new tab, который уведомляет вас, когда цена на газ падает ниже определенного порога. Для транзакций в основной сети рекомендуется проверять оценщик газа, например, ETH Gas Stationopens in a new tab, чтобы определить правильное количество газа для включения. 21000 — это минимальное количество газа, которое будет использовать операция в Ethereum, поэтому, чтобы гарантировать выполнение нашей транзакции, мы указываем здесь 30000.
    • nonce: см. определение nonce выше. Отсчет Nonce начинается с нуля.
    • [НЕОБЯЗАТЕЛЬНО] data: используется для отправки дополнительной информации с вашим переводом или вызова смарт-контракта, не требуется для переводов баланса, см. примечание ниже.
  • signedTx: для подписания нашего объекта транзакции мы будем использовать метод signTransaction с нашим PRIVATE_KEY.
  • sendSignedTransaction: как только у нас будет подписанная транзакция, мы можем отправить ее для включения в последующий блок с помощью sendSignedTransaction.

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

  • Перевод баланса: отправка ETH с одного адреса на другой. Поле данных не требуется, однако, если вы хотите отправить дополнительную информацию вместе с транзакцией, вы можете включить эту информацию в формате HEX в это поле.
    • Например, предположим, мы хотим записать хеш документа IPFS в блокчейн Ethereum, чтобы присвоить ему неизменяемую временную метку. Тогда наше поле данных должно выглядеть так: data: web3.utils.toHex('хеш IPFS'). И теперь любой может сделать запрос к блокчейну и увидеть, когда этот документ был добавлен.
  • Транзакция смарт-контракта: выполните какой-либо код смарт-контракта в блокчейне. В этом случае поле данных должно содержать интеллектуальную функцию, которую вы хотите выполнить, а также любые параметры.

8. Запустите код с помощью node sendTx.js

Вернитесь в свой терминал или командную строку и выполните:

1node sendTx.js

9. Просмотр транзакции в мемпуле

Откройте страницу Mempoolopens in a new tab на панели инструментов Alchemy и отфильтруйте по созданному вами приложению, чтобы найти свою транзакцию. Здесь мы можем наблюдать, как наша транзакция переходит из состояния ожидания в состояние «добыто» (в случае успеха) или в состояние «отклонено» (в случае неудачи). Убедитесь, что вы оставили значение «All» (Все), чтобы отслеживать «добытые», «ожидающие» и «отклоненные» транзакции. Вы также можете найти свою транзакцию, выполнив поиск транзакций, отправленных на адрес 0x31b98d14007bdee637298086988a0bbd31184523.

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

Снимок экрана наблюдателя за мемпулом

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

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

Чтобы оставить отзыв и предложения по этому руководству, напишите Элану в Discordopens in a new tab от Alchemy!

Оригинал статьи опубликован по адресу https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemyopens in a new tab

Последнее обновление страницы: 18 декабря 2025 г.

Было ли это руководство полезным?