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

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

транзакції
Viem
Alchemy
Для початківців
Елан Гальперн
4 листопада 2020 р.
10 хвилин на читання

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

ПРИМІТКА: Цей посібник призначений для підписання ваших транзакцій на бекенді вашого застосунку. Якщо ви хочете інтегрувати підписання транзакцій на фронтенді, ознайомтеся з API провайдера МетаМаск (відкривається в новій вкладці).

Основи

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

1. Alchemy не зберігає ваші приватні ключі

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

2. Що таке «підписувач» (signer)?

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

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

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

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

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

5. У чому різниця між eth_sendTransaction та eth_sendRawTransaction?

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

При використанні Viem доступ до eth_sendRawTransaction здійснюється шляхом виклику функції sendRawTransaction (відкривається в новій вкладці).

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

6. Що таке бібліотека Web3?

Гаразд, тепер, коли ми розібралися з деякими з цих питань, перейдемо до посібника. Не соромтеся ставити запитання в будь-який час у Discord (відкривається в новій вкладці) Alchemy!

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

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

  1. Створіть безкоштовний акаунт Alchemy (відкривається в новій вкладці)
  2. Створіть акаунт МетаМаск (відкривається в новій вкладці) (або отримайте адресу Етеріуму)
  3. Встановіть Node.js та npm (відкривається в новій вкладці)

Кроки для надсилання вашої транзакції

1. Створіть застосунок Alchemy в тестовій мережі Sepolia

Перейдіть до вашої панелі керування Alchemy (відкривається в новій вкладці) та створіть новий застосунок, вибравши Sepolia (або будь-яку іншу тестову мережу) як вашу мережу.

2. Запросіть ETH з крана Sepolia

Дотримуйтесь інструкцій на крані Sepolia від Alchemy (відкривається в новій вкладці), щоб отримати ETH, або скористайтеся одним з інших кранів Sepolia. Крани видають невеликі суми (кран Alchemy дає 0,1 ETH на день), чого цілком достатньо для цього посібника. Переконайтеся, що ви вказали свою адресу Етеріуму в мережі Sepolia (з МетаМаск), а не в іншій мережі. Після виконання інструкцій ще раз перевірте, чи отримали ви ETH на свій гаманець.

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

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

mkdir sendtx-example
cd sendtx-example

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

Виконайте наступну команду у вашій директорії проєкту, щоб встановити Viem (відкривається в новій вкладці):

Зверніть увагу, якщо ви хочете використовувати бібліотеку Ethers.js, дотримуйтесь інструкцій тут (відкривається в новій вкладці).

npm init -y
npm install viem

5. Встановіть dotenv

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

npm install dotenv

6. Створіть файл .env

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

  • Щоб знайти URL-адресу API Alchemy, перейдіть на сторінку деталей застосунку, який ви щойно створили на своїй панелі керування, натисніть «View Key» у верхньому правому куті та скопіюйте URL-адресу HTTP.
  • Щоб знайти свій приватний ключ за допомогою МетаМаск, перегляньте цей посібник (відкривається в новій вкладці). Використовуйте акаунт, на якому є лише ETH тестової мережі.
API_URL="your-api-url"
PRIVATE_KEY="your-private-key"
Не робіть коміт файлу .env! Будь ласка, ніколи не діліться і не розкривайте свій файл .env нікому, оскільки цим ви ставите під загрозу свої секрети. Якщо ви використовуєте систему контролю версій, додайте свій .env до файлу gitignore.

7. Створіть файл sendTx.js

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

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

Обов'язково замініть 0xYourSecondAddress на адресу, на яку ви хочете надіслати ETH. Скрипт отримує вашу власну адресу (відправника) з PRIVATE_KEY, тому вам не потрібно її вводити.

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

  • account: локальний акаунт, створений з вашого приватного ключа за допомогою privateKeyToAccount (відкривається в новій вкладці). Підписання відбувається на вашій машині, і приватний ключ ніколи не надсилається до Alchemy.
  • publicClient та walletClient: клієнти Viem, які надсилають запити JSON-RPC на вашу URL-адресу Alchemy. Публічний клієнт зчитує дані з ланцюга, а клієнт гаманця готує та підписує транзакції для вашого акаунта.
  • nonce: специфікація нонсу використовується для відстеження кількості транзакцій, надісланих з вашої адреси. Нам це потрібно з міркувань безпеки та для запобігання атакам повторного відтворення. Щоб отримати кількість транзакцій, надісланих з вашої адреси, ми використовуємо getTransactionCount (відкривається в новій вкладці). Viem також може заповнити це за вас, але ми отримуємо його явно тут, щоб показати, звідки він береться.
  • transaction: об'єкт транзакції має кілька аспектів, які нам потрібно вказати. prepareTransactionRequest (відкривається в новій вкладці) заповнює решту за нас, включаючи chainId та поля комісії EIP-1559 maxFeePerGas і maxPriorityFeePerGas, на основі поточних умов мережі.
    • to: це адреса, на яку ми хочемо надіслати ETH.
    • value: це сума, яку ми хочемо надіслати, вказана у Wei, де 10^18 Wei = 1 ETH. parseEther (відкривається в новій вкладці) перетворює суму в ETH на Wei за нас. Вашому акаунту потрібно трохи більше, оскільки він також платить за газ.
    • gas: існує багато способів визначити правильну кількість газу для включення у вашу транзакцію. Alchemy підтримує вебхуки (відкривається в новій вкладці), які можуть сповіщати вас про активність ончейн. Для транзакцій у Головній мережі хорошою практикою є перевірка поточних умов газу, щоб визначити правильну кількість газу для включення. Звичайний переказ ETH на звичайну адресу завжди використовує рівно 21000 газу, що є мінімумом для будь-якої транзакції, тому ми вказуємо тут 21000. Якщо ви пропустите gas, Viem оцінить його за вас.
    • nonce: див. визначення нонсу вище. Нонс починає відлік з нуля.
    • [НЕОБОВ'ЯЗКОВО] data: використовується для надсилання додаткової інформації з вашим переказом або виклику смарт-контракту, не вимагається для переказів балансу, див. примітку нижче.
  • signedTx: щоб підписати наш об'єкт транзакції, ми використаємо метод signTransaction, який підписує його локально за допомогою акаунта, створеного з нашого PRIVATE_KEY.
  • sendRawTransaction: як тільки ми маємо підписану транзакцію, ми можемо надіслати її для включення в наступний блок за допомогою sendRawTransaction, який викликає eth_sendRawTransaction.
  • waitForTransactionReceipt: чекає, поки транзакція буде включена в блок, і повертає її квитанцію.

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

  • Переказ балансу: надсилання ETH з однієї адреси на іншу. Поле даних не вимагається, однак, якщо ви хочете надіслати додаткову інформацію разом із транзакцією, ви можете включити цю інформацію у шістнадцятковому форматі в це поле.
    • Наприклад, припустимо, ми хотіли б записати хеш документа IPFS у ланцюг Етеріуму, щоб надати йому незмінну мітку часу. Тоді наше поле даних має виглядати як data: toHex("IPFS hash"), використовуючи toHex (відкривається в новій вкладці) від Viem. І тепер будь-хто може зробити запит до ланцюга і побачити, коли цей документ був доданий.
  • Транзакція смарт-контракту: виконання певного коду смарт-контракту в ланцюзі. У цьому випадку поле даних має містити смарт-функцію, яку ви хочете виконати, разом із будь-якими параметрами.

8. Запустіть код за допомогою node sendTx.js

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

node sendTx.js

9. Перегляньте свою транзакцію в оглядачі блоків

Скрипт виводить хеш транзакції, як тільки вузол приймає транзакцію, потім чекає, поки вона буде включена в блок (зазвичай протягом декількох секунд), і виводить результат. Щоб побачити деталі, вставте хеш в оглядач блоків Sepolia, такий як Sepolia Etherscan (відкривається в новій вкладці) або Blockscout (відкривається в новій вкладці). Там ви можете спостерігати, як транзакція переходить зі стану очікування до включеної, і бачити суму, комісії та блок, у який вона потрапила.

Якщо замість цього ви бачите помилку insufficient funds, на вашому акаунті недостатньо Sepolia ETH для покриття суми плюс газ. Поверніться до кроку 2 і запросіть більше з крана.

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

Для відгуків та пропозицій щодо цього посібника, будь ласка, напишіть Elan у Discord (відкривається в новій вкладці) Alchemy!

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