Skip to content

Latest commit

 

History

History
181 lines (152 loc) · 13.5 KB

File metadata and controls

181 lines (152 loc) · 13.5 KB

Завдання 2 - Взаємодія з Біткоїн-мережею з командного рядка

Вступ

Учасники Біткоїн-мережі поділяються на повні ноди (англ. full nodes), та легкі ноди (англ. light nodes або light clients). Повні ноди - це вершини мережі, що мають повну копію ланцюга блоків, беруть участь у пропагації блоків та транзакцій і здійснюють повну валідацію блоків та транзакцій. Прикладом повної ноди є сервер Bitcoin Core, встановлення якого було описано у завданні 1. Легкі ноди реалізують лише підмножину функцій повних нод і використовуються для виконання окремих типів взаємодії з мережею. Найпоширенішим типом легких нод є програмні Біткоїн-гаманці. Повна Біткоїн-нода може мати вбудований програмний гаманець, і тому взаємодія з транзакціями може здійснюватись через повну ноду, але в більшості випадків повна нода є недостатньо зручною для використання в якості Біткоїн-гаманця, тому більшість програмних гаманців реалізовано саме як легкі клієнти.

Програмний гаманець - це програмне забезпечення, яке оперує ключами для стандартних невикористаних транзакційних виходів (англ. UTXOs). До функцій простого програмного гаманця входить:

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

Більшість легких Біткоїн-гаманців взаємодіють з мережею не через peer-to-peer-протокол, а через RPC: замість прямої взаємодії з випадковим набором нод у мережі, гаманець під’єднується до конкретної ноди анлогічно до того, як це робить інструмент bitcoin-cli, і виконує команди RCP API. Такий підхід має суттєвий недолік, якщо нода, до якої під’єднується ваш гаманець, не належить вам (зазвичай існуючі гаманці під’єднуються до нод, що надаються розробниками гаманців). Недолік полягає в тому, що така нода може збирати інформацію про транзакції користувачів для подальшого аналізу, і тому для критично важливих транзакцій варто використовувати програмні гаманці, що дозволяють користувачу під’єднатись до власної повної Біткоїн-ноди.

У даному практичному завданні ми розглянемо взаємодію з мережею за допомогою програмного гаманця, що вбудований у Біткоїн-ноду, а також за допомогою окремого Біткоїн-гаманця.

Інструкції

Для виконання даної лабораторної роботи рекомендується синхронізувати Біткоїн ноду з testnet-мережею, оскільки налаштувати окремий програмний гаманець на взаємодію з regetest-мережею може бути доволі складно.

Для запуску Біткоїн-ноди в testnet-режимі необхідно виконати команду

$ bitcoind -testnet -daemon

Cинхронізація триває близько 2 годин, але залежить від технічних характеристик пристрою, тому рекомендується залишити синхронізацію на ніч. Ланцюг блоків testnet-мережі займає близько 32 Гб. Слідкувати за процесом синхронізації демонізованої ноди можна за допомогою команди

$ tail -f ~/.bitcoin/testnet3/debug.log

Далі необхідно обрати окремий програмний гаманець. Для цього можна скористатись діалогом підбору гаманця на сайті bitcoin.org, але зверніть увагу, що одним з параметрів пошуку повинна бути підтримка testnet-мережі.

Після встановлення обраного вами гаманця, при першому запуску вам необхідно буде ініціалізувати ваш гаманець. В більшості випадків програмний гаманець запропонує вам записати 12 чи 24 слова, які є мнемонічних (тобто “легким для запам’ятовування”, хоча це й перебільшення) представленням кореневого ключа нового ієрархічного детерміністичного гаманця (англ. hierarchical deterministic wallet, HD wallet). Всі ключі, які надалі генеруватиме ваш гаманець при генерації нових адрес, будуть детерміністично обчислюватись з кореневого ключа, і тому резервна копія необхідна лише для кореневого ключа. Детально про HD-гаманці можна прочитати тут.

Приклад мнемонічного представлення кореневого ключа HD-гаманця:

happy gauge biology view proof over
inside assume actress way today true
unlock truck feature pitch reunion middle
spoon swift sing oak loud buffalo

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

Наступним кроком є отримання невеликої кільості testnet-біткоїнів. На відміну від regtest-мережі, testnet-мережа є повноцінною функціонуючою мережею з сотнями активних вершин, тому згенерувати новий блок (і отримати за нього винагороду) самостійно може бути складно. Оскільки testnet-біткоїн нічого не вартий, деякі ресурси, зокрема Yet Another Bitcoin Testnet Faucet, розповсюджують його за запитом з проханням повернути його назад після завершення тестування.

Для отримання тестових біткоїнів вам необхідно згенерувати нові адреси на обох гаманцях (вбудованому в Bitcoin Core та окремому) та скористатись діалогом на запропонованому вище ресурсі. Для генерації нової адреси в Bitcoin Core виконайте команду

$ bitcoin-cli -testnet getnewaddress

а для генерації нової адреси в окремому гаманці скористайтесь графічним інтрефейсом “Отримати” чи “Receive”.

Дочекайтесь отримання коштів на обох гаманця. У вбудованому гаманці Bitcoin Core це можна зробити за допомогої періодичної перевірки балансу

$ bitcoin-cli -testnet getbalance

а у окремому гаманці графічний інтерфейс автоматично відобразить інформацію про нову транзакцію.

Після отримання коштів ви можете здійснити транзакції з одного гаманця на інший та навпаки. Для цього спочатку необхідно згенерувати нові адреси. Повторне використання адрес не забороняється Біткоїн-протоколом, але може мати різноманітні негативні наслідки для приватності ваших транзакційних даних, і тому рекомендується завжди використовувати нову адресу для кожної нової транзакції. Для надсилання транзакції з Bitcoin Core скористайтесь командою

$ bitcoin-cli -testnet sendtoaddress <address> <amount>

а для надсилання транзакції з окремого гаманця скористайтесь графічним інтерфейсом “Надіслати” чи “Send”.

Демонстрація та запитання

Для захисту практичної роботи необхідно:

  • самостійо обрати окремий програмний Біткоїн-гаманець;
  • пояснити власний вибір (пояснення “він мені сподобався, бо має темний фон” теж підходять :));
  • встановити обраний програмний гаманець на робочий пристрій (додатково оцінюється встановлення на мобільний пристрій на базі Android чи iOS);
  • під’єднати програмний гаманець до тестової Біткоїн-мережі (додатково оцінюється під’єднання до власної ноди);
  • здійснити початкову генерацію ключів та зберегти їх резервну копію;
  • продемонструвати надсилання транзакції за допомогою bitcoin-cli на адресу, згенеровану у окремому гаманці;
  • продемонструвати надсилання транзакції з окремого гаманця на адресу, згенеровану у вбудованому гаманці вашої Біткоїн-ноди;
  • показати обидві транзакції у декодованому вигляді за допомогою bitcoin-cli.

Після завершення демонстрації лабораторної роботи не забудьте повернути тестові біткоїни назад на ресурс Yet Another Bitcoin Testnet Faucet. Для цього можна надіслати всі тестові біткоїни на гаманець Bitcoin Core і виконати команду

$ bitcoin-cli -testnet -named sendtoaddress address=mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt \
                                            amount=<total-amount> \
                                            fee_rate=1 \
                                            subtractfeefromamount=true