Перейти до основного контенту

Надсилання транзакцій за допомогою Web3

транзакції
web3.js
alchemy
Початківець
Elan Halpern
4 листопада 2020 р.
9 читається за хвилину

Це посібник для початківців із надсилання транзакцій Ethereum за допомогою Web3. Існує три основних кроки для того, щоб відправити транзакцію до блокчейну Ethereum: створити, підписати та поширити. Ми розглянемо всі три, і, сподіваємось, відповімо на всі ваші запитання! У цьому посібнику ми будемо використовувати Alchemy (opens 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 web3 (opens in a new tab) для підписання нашої транзакції, але ви також можете використовувати будь-яку іншу бібліотеку web3.
  • На фронтенді хорошим прикладом підписувача є MetaMask (opens in a new tab), який підписує та надсилає транзакції від вашого імені.

3. Чому мені потрібно підписувати свої транзакції?

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

4. Як захистити свій приватний ключ?

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

5. Яка різниця між eth_sendTransaction та eth_sendRawTransaction?

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

  • 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, яка досить часто використовується в розробці на Ethereum.
  • Існує багато бібліотек web3 для різних мов. У цьому посібнику ми будемо використовувати Alchemy Web3 (opens in a new tab), яка написана на JavaScript. Ви можете ознайомитися з іншими варіантами тут (opens in a new tab), наприклад, ethers.js (opens in a new tab).

Гаразд, тепер, коли ми розібралися з цими питаннями, перейдімо до посібника. Не соромтеся ставити запитання в будь-який час у discord (opens in a new tab) від Alchemy!

7. Як надсилати безпечні, оптимізовані за газом і приватні транзакції?

  • Alchemy має набір Transact API (opens in a new tab). Ви можете використовувати їх для надсилання посилених (reinforced) транзакцій, симуляції транзакцій до їх виконання, надсилання приватних транзакцій та надсилання транзакцій, оптимізованих за газом
  • Ви також можете використовувати Notify API (opens in a new tab), щоб отримувати сповіщення, коли вашу транзакцію витягують із мемпулу та додають до ланцюжка

ПРИМІТКА: для цього посібника потрібен обліковий запис Alchemy, адреса Ethereum або гаманець MetaMask, а також встановлені Node.js та npm. Якщо ні, виконайте такі дії:

  1. Створіть безкоштовний обліковий запис Alchemy (opens in a new tab)
  2. Створіть обліковий запис MetaMask (opens in a new tab) (або отримайте адресу Ethereum)
  3. Виконайте ці кроки, щоб установити 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. Переконайтеся, що ви вказали свою адресу Ethereum у мережі Sepolia (з MetaMask), а не іншу мережу. Виконавши інструкції, ще раз перевірте, чи отримали ви ETH у свій гаманець.

3. Створіть новий каталог проєкту та перейдіть у нього за допомогою cd

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

1mkdir sendtx-example
2cd sendtx-example

4. Установіть Alchemy Web3 (або будь-яку бібліотеку web3)

Виконайте таку команду у вашому каталозі проєкту, щоб установити Alchemy Web3 (opens 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-адресу вашого Alchemy API, перейдіть на сторінку з детальною інформацією про застосунок, який ви щойно створили на інформаційній панелі, натисніть «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). Щоб отримати кількість транзакцій, надісланих з вашої адреси, ми використовуємо getTransactionCount (opens in a new tab).
  • transaction: об’єкт транзакції має кілька аспектів, які нам потрібно вказати
    • to: це адреса, на яку ми хочемо надіслати ETH. У цьому випадку ми надсилаємо ETH назад на кран Sepolia (opens in a new tab), з якого ми спочатку їх запитували.
    • value: це сума, яку ми хочемо надіслати, вказана у веях, де 10^18 вей = 1 ETH
    • gas: існує багато способів визначити правильну кількість газу для включення у вашу транзакцію. Alchemy навіть має вебхук ціни на газ (opens in a new tab), щоб сповіщати вас, коли ціна на газ опускається до певного порогу. Для транзакцій в основній мережі варто перевірити оцінювач газу, наприклад ETH Gas Station (opens in a new tab), щоб визначити правильну кількість газу. 21000 — це мінімальна кількість газу, яку буде використовувати операція на Ethereum, тому, щоб наша транзакція була виконана, ми вказуємо тут 30000.
    • nonce: див. визначення nonce вище. Nonce починає відлік з нуля.
    • [OPTIONAL] 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. Перегляньте свою транзакцію в мемпулі

Відкрийте сторінку мемпулу (opens in a new tab) на інформаційній панелі Alchemy та відфільтруйте за створеним вами застосунком, щоб знайти свою транзакцію. Тут ми можемо спостерігати, як наша транзакція переходить зі стану очікування до стану видобутку (у разі успіху) або стану скасування (в разі невдачі). Переконайтеся, що встановлено значення «Усі», щоб ви могли бачити «видобуті», «очікувані» та «скасовані» транзакції. Ви також можете знайти свою транзакцію, шукаючи транзакції, надіслані на адресу 0x31b98d14007bdee637298086988a0bbd31184523.

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

Знімок екрана спостерігача за мемпулом

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

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

Щоб залишити відгук та пропозиції щодо цього посібника, будь ласка, напишіть Елану в Discord (opens in a new tab) від Alchemy!

Вперше опубліковано на https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy (opens in a new tab)

Останні оновлення сторінки: 18 грудня 2025 р.

Чи була ця інструкція корисною?