Отправка транзакций с использованием Web3
Это руководство для начинающих по отправке транзакций Эфириума с использованием Web3. Для отправки транзакции в блокчейн Эфириума необходимо выполнить три основных шага: создание, подписание и трансляция. Мы рассмотрим все три и, надеемся, ответим на любые ваши вопросы! В этом руководстве мы будем использовать Alchemy (opens in a new tab) для отправки наших транзакций в цепь Эфириума. Вы можете создать бесплатный аккаунт Alchemy здесь (opens in a new tab).
ПРИМЕЧАНИЕ: Это руководство предназначено для подписания транзакций на бэкенде вашего приложения. Если вы хотите интегрировать подписание транзакций на фронтенде, ознакомьтесь с интеграцией Web3 с браузерным провайдером (opens in a new tab).
Основы
Как и большинство разработчиков блокчейна в самом начале своего пути, вы, возможно, искали информацию о том, как отправить транзакцию (что должно быть довольно просто), и столкнулись с множеством руководств, каждое из которых говорит о разном, оставляя вас в замешательстве. Если вы оказались в такой ситуации, не волнуйтесь; мы все через это проходили! Поэтому, прежде чем мы начнем, давайте проясним несколько моментов:
1. Alchemy не хранит ваши приватные ключи
- Это означает, что Alchemy не может подписывать и отправлять транзакции от вашего имени. Причина этого кроется в безопасности. Alchemy никогда не попросит вас поделиться своим приватным ключом, и вы никогда не должны делиться своим приватным ключом с размещенным узлом (или с кем-либо еще).
- Вы можете читать данные из блокчейна, используя основной API Alchemy, но для записи в него вам понадобится использовать что-то еще для подписания ваших транзакций перед их отправкой через Alchemy (это справедливо и для любого другого сервиса узлов).
2. Что такое «подписант» (signer)?
- Подписанты будут подписывать транзакции для вас, используя ваш приватный ключ. В этом руководстве мы будем использовать Alchemy Web3 (opens in a new tab) для подписания нашей транзакции, но вы также можете использовать любую другую библиотеку Web3.
- На фронтенде хорошим примером подписанта является МетаМаск (opens in a new tab), который будет подписывать и отправлять транзакции от вашего имени.
3. Зачем мне нужно подписывать свои транзакции?
- Каждый пользователь, который хочет отправить транзакцию в сети Эфириум, должен подписать транзакцию (используя свой приватный ключ), чтобы подтвердить, что отправитель транзакции является тем, за кого себя выдает.
- Крайне важно защищать этот приватный ключ, поскольку доступ к нему предоставляет полный контроль над вашим аккаунтом Эфириума, позволяя вам (или любому, у кого есть доступ) выполнять транзакции от вашего имени.
4. Как мне защитить свой приватный ключ?
- Существует множество способов защитить свой приватный ключ и использовать его для отправки транзакций. В этом руководстве мы будем использовать файл
.env. Однако вы также можете использовать отдельного провайдера, который хранит приватные ключи, использовать файл хранилища ключей или другие варианты.
5. В чем разница между eth_sendTransaction и eth_sendRawTransaction?
eth_sendTransaction и eth_sendRawTransaction — это функции API Эфириума, которые транслируют транзакцию в сеть Эфириум, чтобы она была добавлена в будущий блок. Они отличаются тем, как обрабатывают подписание транзакций.
eth_sendTransaction(opens in a new tab) используется для отправки неподписанных транзакций, что означает, что узел, на который вы отправляете, должен управлять вашим приватным ключом, чтобы он мог подписать транзакцию перед ее трансляцией в цепь. Поскольку Alchemy не хранит приватные ключи пользователей, они не поддерживают этот метод.eth_sendRawTransaction(opens in a new tab) используется для трансляции транзакций, которые уже были подписаны. Это означает, что сначала вам нужно использоватьsignTransaction(tx, private_key)(opens in a new tab), а затем передать результат вeth_sendRawTransaction.
При использовании Web3 доступ к eth_sendRawTransaction осуществляется путем вызова функции web3.eth.sendSignedTransaction (opens in a new tab).
Именно это мы и будем использовать в данном руководстве.
6. Что такое библиотека Web3?
- Web3.js — это библиотека-обертка вокруг стандартных вызовов JSON-RPC, которая довольно часто используется в разработке для Эфириума.
- Существует множество библиотек Web3 для разных языков. В этом руководстве мы будем использовать Alchemy Web3 (opens in a new tab), которая написана на JavaScript. Вы можете ознакомиться с другими вариантами здесь (opens in a new tab), например, с Ethers.js (opens in a new tab).
Отлично, теперь, когда мы разобрались с некоторыми из этих вопросов, давайте перейдем к руководству. Не стесняйтесь задавать вопросы в любое время в Дискорде (opens in a new tab) Alchemy!
7. Как отправлять безопасные, оптимизированные по газу и приватные транзакции?
- У Alchemy есть набор API для транзакций (Transact APIs) (opens in a new tab). Вы можете использовать их для отправки усиленных транзакций, симуляции транзакций до их выполнения, отправки приватных транзакций и транзакций, оптимизированных по газу.
- Вы также можете использовать Notify API (opens in a new tab), чтобы получать уведомления, когда ваша транзакция извлекается из мемпула и добавляется в цепь.
ПРИМЕЧАНИЕ: Для этого руководства требуется аккаунт Alchemy, адрес Эфириума или кошелек МетаМаск, а также установленные Node.js и npm. Если у вас их нет, выполните следующие шаги:
- Создайте бесплатный аккаунт Alchemy (opens in a new tab)
- Создайте аккаунт МетаМаск (opens in a new tab) (или получите адрес Эфириума)
- Выполните эти шаги для установки Node.js и npm (opens in a new tab)
Шаги для отправки вашей транзакции
1. Создайте приложение Alchemy в тестовой сети Sepolia
Перейдите в свою панель управления Alchemy (opens in a new tab) и создайте новое приложение, выбрав Sepolia (или любую другую тестовую сеть) в качестве вашей сети.
2. Запросите ETH из крана Sepolia
Следуйте инструкциям в кране Alchemy Sepolia (opens in a new tab), чтобы получить ETH. Убедитесь, что вы указали свой адрес Эфириума в сети Sepolia (из МетаМаск), а не в другой сети. После выполнения инструкций дважды проверьте, что вы получили ETH на свой кошелек.
3. Создайте новую директорию проекта и перейдите в нее с помощью cd
Создайте новую директорию проекта из командной строки (терминала для Mac) и перейдите в нее:
mkdir sendtx-example
cd sendtx-example
4. Установите Alchemy Web3 (или любую библиотеку Web3)
Выполните следующую команду в директории вашего проекта, чтобы установить Alchemy Web3 (opens in a new tab):
Обратите внимание, если вы хотите использовать библиотеку Ethers.js, следуйте инструкциям здесь (opens in a new tab).
npm install @alch/alchemy-web3
5. Установите dotenv
Мы будем использовать файл .env для безопасного хранения нашего ключа API и приватного ключа.
npm install dotenv --save
6. Создайте файл .env
Создайте файл .env в директории вашего проекта и добавьте следующее (заменив «your-api-url» и «your-private-key»):
- Чтобы найти URL-адрес вашего API Alchemy, перейдите на страницу сведений о приложении, которое вы только что создали на панели управления, нажмите «View Key» (Просмотреть ключ) в правом верхнем углу и скопируйте HTTP URL.
- Чтобы найти свой приватный ключ с помощью МетаМаск, ознакомьтесь с этим руководством (opens in a new tab).
API_URL = "your-api-url"
PRIVATE_KEY = "your-private-key"
.env! Пожалуйста, убедитесь, что вы никогда не делитесь и не раскрываете свой файл .env кому-либо, так как тем самым вы ставите под угрозу свои секреты. Если вы используете систему контроля версий, добавьте ваш .env в файл gitignore.7. Создайте файл 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("🎉 Хеш вашей транзакции: ", hash, "\n Проверьте мемпул Alchemy, чтобы увидеть статус вашей транзакции!");
} else {
console.log("❗Что-то пошло не так при отправке вашей транзакции:", error)
}
});
}
main();
Обязательно замените адрес в строке 6 на ваш собственный публичный адрес.
Теперь, прежде чем мы перейдем к запуску этого кода, давайте поговорим о некоторых его компонентах.
nonce: Спецификация нонса используется для отслеживания количества транзакций, отправленных с вашего адреса. Нам это нужно в целях безопасности и для предотвращения атак повторного воспроизведения (opens in a new tab). Чтобы получить количество транзакций, отправленных с вашего адреса, мы используем getTransactionCount (opens in a new tab).transaction: Объект транзакции имеет несколько аспектов, которые нам нужно указать:to: Это адрес, на который мы хотим отправить ETH. В данном случае мы отправляем ETH обратно в кран Sepolia (opens in a new tab), из которого мы изначально их запрашивали.value: Это сумма, которую мы хотим отправить, указанная в Wei, где 10^18 Wei = 1 ETH.gas: Существует множество способов определить правильное количество газа для включения в вашу транзакцию. У Alchemy даже есть вебхук цены газа (opens in a new tab), который уведомляет вас, когда цена газа падает до определенного порога. Для транзакций в Мейннете хорошей практикой является проверка оценщика газа, такого как ETH Gas Station (opens in a new tab), чтобы определить правильное количество газа для включения. 21000 — это минимальное количество газа, которое будет использовать операция в Эфириуме, поэтому, чтобы гарантировать выполнение нашей транзакции, мы указываем здесь 30000.nonce: см. определение нонса выше. Нонс начинает отсчет с нуля.- [НЕОБЯЗАТЕЛЬНО] data: Используется для отправки дополнительной информации с вашим переводом или вызова смарт-контракта, не требуется для переводов баланса, ознакомьтесь с примечанием ниже.
signedTx: Для подписания нашего объекта транзакции мы будем использовать методsignTransactionс нашимPRIVATE_KEY.sendSignedTransaction: Как только у нас есть подписанная транзакция, мы можем отправить ее для включения в последующий блок, используяsendSignedTransaction.
Примечание о данных (data) Существует два основных типа транзакций, которые можно отправить в Эфириуме.
- Перевод баланса: Отправка ETH с одного адреса на другой. Поле данных не требуется, однако, если вы хотите отправить дополнительную информацию вместе с вашей транзакцией, вы можете включить эту информацию в формате HEX в это поле.
- Например, допустим, мы хотели записать хеш документа IPFS в цепь Эфириума, чтобы присвоить ему неизменяемую временную метку. Тогда наше поле данных должно выглядеть как data:
web3.utils.toHex(‘IPFS hash‘). И теперь любой может сделать запрос к цепи и увидеть, когда этот документ был добавлен.
- Например, допустим, мы хотели записать хеш документа IPFS в цепь Эфириума, чтобы присвоить ему неизменяемую временную метку. Тогда наше поле данных должно выглядеть как data:
- Транзакция смарт-контракта: Выполнение некоторого кода смарт-контракта в цепи. В этом случае поле данных должно содержать смарт-функцию, которую вы хотите выполнить, вместе с любыми параметрами.
- Для практического примера ознакомьтесь с шагом 8 в этом руководстве Hello World (opens in a new tab).
8. Запустите код с помощью node sendTx.js
Вернитесь в свой терминал или командную строку и выполните:
node sendTx.js
9. Посмотрите вашу транзакцию в мемпуле
Откройте страницу мемпула (opens in a new tab) на панели управления Alchemy и отфильтруйте по созданному вами приложению, чтобы найти вашу транзакцию. Здесь мы можем наблюдать за переходом нашей транзакции из состояния ожидания (pending) в состояние добычи (mined) (в случае успеха) или в состояние отбрасывания (dropped) в случае неудачи. Убедитесь, что выбран параметр «All» (Все), чтобы вы могли видеть «добытые», «ожидающие» и «отброшенные» транзакции. Вы также можете найти свою транзакцию, выполнив поиск транзакций, отправленных на адрес 0x31b98d14007bdee637298086988a0bbd31184523.
Чтобы просмотреть детали вашей транзакции после того, как вы ее нашли, выберите хеш транзакции (tx hash), что должно привести вас к виду, похожему на этот:
Оттуда вы можете просмотреть свою транзакцию на Etherscan, нажав на значок, обведенный красным!
Ура! Вы только что отправили свою первую транзакцию Эфириума с использованием Alchemy 🎉
Для отзывов и предложений по этому руководству, пожалуйста, напишите Элану в Дискорде (opens in a new tab) Alchemy!
Первоначально опубликовано на https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy (opens in a new tab)
Последнее обновление страницы: 3 марта 2026 г.
