Модель безпеки біткойна: глибоке занурення
CoinDesk зазирне під капот, щоб зрозуміти, які функції безпеки пропонує Bitcoin , а які T .
Коли обговорення механізмів консенсусу Для різних криптовалют ONE проблемою, яка часто викликає суперечки, є відсутність розуміння (і визначення) моделі безпеки, яку вони забезпечують для історичних даних у книзі. Хоча кожна консенсусна модель спрямована на запобігання різноманітним теоретичним атакам, важливо розуміти цілі моделі.
Кожна модель безпеки має дві основні частини: припущення та гарантії. Якщо припущення, використані як вхідні дані, є вірними, то так само повинні бути гарантії, які видає модель.
Давайте розберемося в моделі безпеки, яка, здається, пропонується користувачам Bitcoin , які використовують повний вузол.
У пошуках істини
«ONE з сильних сторін біткойна — навіть найважливіша, на мій Погляди , — це низький рівень довіри до інших». –Пітер Вуїл
Метою розподілених реєстрів є надання впорядкованої історії Заходи, оскільки в розподілених системах ви T можете просто довіряти мітці часу.
Коли новий учасник мережі, заснованої на блокчейні, приєднується, він завантажує будь-які доступні блоки та розглядає кожну дійсну серію блоків, які вони бачать, починаючи з жорстко закодованого блоку генезису.
ONE з найбільших припущень, зроблених моделлю безпеки біткойна, полягає в тому, що більшість майнерів є чесними – вони працюють над захистом блокчейну, а не намагаються його підірвати. На практиці це зберігається протягом всієї історії біткойна завдяки стимулам для майнерів якесь запитання якщо це буде актуально в майбутньому.
Враховуючи це припущення, оператори повного вузла можуть бути повністю впевнені в кількох фактах:
- Грошову масу ніхто не роздував, крім шахтарів, і тільки за чітко визначеним графіком.
- Ніхто ніколи не витрачав гроші, не маючи відповідних закритих ключів.
- Ніхто ніколи не витрачав ті самі гроші двічі.
Оператори повного вузла можуть бути достатньо впевнені в кількох інших речах. Є сильна гарантія, що:
- Будь-який блок у ланцюжку було створено протягом приблизно двох годин після мітки часу блоку.
- Вони синхронізують «справжню» історію блокчейна.
На більш технічному рівні це вимагає безлічі перевірок:
- Усі блоки Соціальні мережі правилам консенсусу:
- Кожен блок є прив’язаний до батьківського блоку
- Кожен блок досяг цільового рівня складності достатній доказ роботи
- Блок часових позначок потрапляє в a вікно відносно останніх блоків
- Корінь Меркла відповідає транзакціям блоку
- Ніяких блоків не було більше допустимого максимального розміру
- Перша (і єдина) транзакція кожного блоку є транзакцією coinbase
- Виходи Coinbase T платять більше, ніж відповідну винагороду за блок
- Жоден блок не містить більше ніж дозволені операції підпису
- Усі транзакції Соціальні мережі правилам консенсусу:
- Вхідні та вихідні значення осудні
- транзакції витрачати лише невитрачені виходи
- Витрачено всі входи мають дійсні підписи
- Виходи транзакцій coinbase не були витрачені протягом 100 блоків після їх створення.
- Жодних транзакцій проводити введення з часом блокування перед блоком, у якому вони підтверджені.
- Багато інших правил це займе надто багато часу, щоб охопити тут.
Термодинамічна безпека
Після підтвердження транзакції в блоці її T скасувати без того, щоб хтось витратив мінімальну кількість енергії, щоб переписати ланцюжок.
Поки жоден зловмисник не володіє більше ніж 50% обчислювальної потужності мережі, а чесні вузли можуть швидко спілкуватися, ймовірність скасування транзакції експоненціально зменшується з кількістю отриманих підтверджень. Є й інші напади, наприклад егоїстичний видобуток, які можуть зменшити цю потребу в електроенергії, хоча здається, що їх важко вчинити.

Дивлячись на поточну сукупну роботу, яку виконують майнери Bitcoin , для створення альтернативного блокчейну з генезису з більшим сукупним доказом роботи, який повні вузли вважатимуть «справжнім» ланцюгом, знадобиться майже 1026 хешів.

Щоб підвести деякі цифри щодо вартості такої атаки:
Antminer S9 працює на рівні 0,1 Джоуля на GH (109 хешів)
1026 хешів * 0,1 Дж / 109 хешів = 1015 джоулів
1015 джоулів = 2 777 777 778 кВт-годин * 0,10 дол. США кВт/год = 277 777 778 доларів США електроенергії, щоб переписати весь блокчейн
У той час як на момент написання один блок повинен досягати цільової складності 253 618 246 641, що вимагатиме приблизно:
253 618 246 641 * 248 / 65535 = 1,09 * 1021 хешів
1,09 * 1021 хеш * 0,1 Дж / 109 хеш = 1,09 * 1011 джоулів
1,09 * 1011 джоулів = 30 278 кВт-год * 0,10 дол. США кВт/год = 3 028 дол. США електроенергії на блок
Ось чому ми можемо стверджувати, що Bitcoin є доведено термодинамічно безпечним.
Є кілька змінних, які ви можете налаштувати у наведеному вище розрахунку, щоб зменшити вартість, але ми можемо бути впевнені, що для того, щоб переписати весь блокчейн, знадобиться електроенергія на багато мільйонів доларів. Однак зловмисник із такою потужністю хешування в гіршому випадку зможе скасувати транзакції до 2014 року – незабаром ми заглибимося в причину цього.
Також зауважте, що це T враховує витрати, необхідні для отримання та експлуатації достатнього обладнання для майнінгу для здійснення такої атаки.
Опір Сибіл
Оскільки протокол Bitcoin вважає справжній ланцюг ONE з найбільшою сукупністю доказів роботи (а не найдовший ланцюг, як часто неправильно заявляють), результатом є те, що новому одноранговому партнеру, який приєднується до мережі, потрібно підключитися лише до одного чесного однорангового вузла, щоб знайти справжній ланцюжок.
Це також відоме як «стійкість Сибіл», що означає, що хтось не може здійснити атаку на вузол, створивши багато нечесних однорангових вузлів, які передають йому неправдиву інформацію.

Тут зображено NEAR найгірший сценарій, коли ваш вузол піддається масовій атаці Sybil, але все ще має єдине з’єднання з чесним вузлом, який підключено до справжньої мережі Bitcoin . Поки єдиний чесний пір передає справжні дані блокчейну вашому повному вузлу, буде цілком зрозуміло, що будь-які зловмисники Sybil намагаються вас обдурити, і ваш вузол ігноруватиме їх.
Консенсус у реальному часі
Протокол Bitcoin створює ряд інших цікавих атрибутів щодо підтримки загальномережевого консенсусу, коли ваш вузол знаходиться на вершині блокчейну.
Автори «Перспективи дослідження та виклики для Bitcoin і криптовалют” зверніть увагу на наступні властивості, важливі для стабільності Криптовалюта:
Кінцевий консенсус. У будь-який час усі сумісні вузли узгоджують префікс того, що в кінцевому підсумку стане «справжнім» блокчейном.
Експоненціальна збіжність. Ймовірність розгалуження глибини n дорівнює O(2−n). Це дає користувачам високу впевненість у тому, що просте правило «k підтверджень» забезпечить постійний розрахунок їхніх транзакцій.
Жвавість. Нові блоки продовжуватимуть додаватися, а дійсні транзакції з відповідними комісіями будуть включені в блокчейн протягом розумного періоду часу.
Коректність. Усі блоки в ланцюжку з найбільшим сукупним підтвердженням роботи включатимуть лише дійсні транзакції.
Справедливість. Майнер з X% загальної обчислювальної потужності мережі буде видобувати приблизно X% блоків.
Автори статті відзначають, що Bitcoin, схоже, має ці властивості, принаймні за припущення, що більшість майнерів залишаються чесними, і саме це намагається стимулювати винагорода за блок разом із доказом роботи.
Є багато інших алгоритмів, які можна використовувати для підтримки консенсусу в розподілених системах, наприклад:
- Доказ ставки
- Підтвердження віку монети
- Підтвердження депозиту
- Доказ опіку
- Підтвердження діяльності
- Доказ часу, що минув
- Федеративний консенсус
- Практична візантійська помилковість
Вони створюють різні моделі безпеки – найбільш очевидна відмінність від доказу роботи полягає в тому, що консенсус кожної з альтернативних систем досягається за рахунок внутрішніх ресурсів (монет або репутації), а не зовнішніх ресурсів (електроенергії). Це створює зовсім інший набір стимулів для (і довіри до) валідаторів у мережі, що кардинально змінює модель безпеки.
Непорозуміння щодо моделі безпеки
Поширеним помилковим припущенням є те, що для Bitcoin існує чітко визначена модель безпеки.
Насправді протокол Bitcoin був і будується без формально визначеної специфікації чи моделі безпеки. Найкраще, що ми можемо зробити, це вивчити стимули та поведінку акторів у системі, щоб краще зрозуміти та спробувати її описати.
Тим не менш, є кілька властивостей протоколу Bitcoin , які часто аналізуються неправильно.
Деякі блокчейни досить сильно постраждали від атак, які додають розробники централізована трансляція підписаних контрольно-пропускних пунктів у програмне забезпечення вузла, по суті кажучи, що «розробники перевірили блок X як належний до правильного історичного ланцюга». Це точка крайньої централізації.
Варто зазначити, що Bitcoin має 13 жорстко закодованих контрольних точок, але вони не змінюють модель безпеки так, як це роблять транслювані контрольні точки. Додано останню контрольну точку Bitcoin CORE 0.9.3 і знаходиться в блоці 295000, який було створено 9 квітня 2014 року. Цей блок мав складність 6 119 726 089, що вимагало приблизно:
6 119 726 089 * 248 / 65 535 = 2,62 * 1019 хешів
2,62 * 1019 хешів * 0,1 Дж / 109 хешів = 2,62 * 109 джоулів
2,62 * 109 джоулів = 728 кВт-год * 0,10 дол. США кВт/год = 73 дол. США електроенергії для виробництва
Таким чином, якби зловмисник Sybil повністю оточив новий вузол, який синхронізувався з нуля, він міг створити кілька коротких блокчейнів на низькій висоті майже безкоштовно, але лише до різних блоків із контрольними точками.
Якби він відокремив вузол від мережі, який синхронізувався після блоку 295 000, він міг би почати подавати хибні блоки ціною 73 долари за блок, принаймні до тих пір, поки не досягне переналаштування складності. Однак, чим далі синхронізувався вузол-жертва, тим більшою буде вартість зловмисника на створення ланцюга з більшою сумарною роботою.
Обидва Грег Максвелл і Пітер Вуїл заявили, що сподіваються колись повністю скасувати блокпости. Провідний супроводжувач Bitcoin CORE Володимир ван дер Лаан зазначив, що контрольні точки є постійне джерело плутанини людям, які прагнуть зрозуміти модель безпеки біткойна.
Можна стверджувати, що це означає, що повний вузол «довіряє» розробникам CORE щодо дійсності історії блокчейну до 9 квітня 2014 року, але вузол усе ще перевіряє хеші Merkle у заголовку кожного блоку, що означає, що надійність історії транзакцій все ще забезпечується доказом роботи. Ці старі блокпости дозволяють збільшити продуктивність (пропуск перевірки підпису) під час початкової синхронізації історичного блокчейну, хоча впровадження libsecp256k1 зробило різниця продуктивності менш значна.
на місці для трьох цілей:
- Щоб запобігти виникненню вузлів наповнюючи їх пам'ять з дійсними, але низькими заголовками блоків підтвердження роботи
- Пропуск підписів у попередніх блоках (підвищення продуктивності)
- Щоб оцінити прогрес синхронізації
Під час написання цієї статті Грег Максвелл запропонована заміна КПП з a накопичувальна перевірка робіт замість цього. Якщо вузол має ланцюжок, який містить більше 5,4 * 1024 виконаних хешів, ланцюжки з меншою сумарною роботою будуть відхилені. Це збігається з обсягом роботи, виконаної приблизно до блоку 320 000 у вересні 2014 року, тоді окремі блоки мали складність ~27 000 000 000.

Видобуток блоків зі складністю 27 000 000 000 потребує приблизно
27 000 000 000 * 248 / 65535 = 1,16 * 1020 хешів
1,16 * 1020 хешів * 0,1 Дж / 109 хешів = 1,16 * 1010 джоулів
1,16 * 1010 джоулів = 3222 кВт-год * 0,10 дол. США кВт/год = 322 дол. США електроенергії на блок
Таким чином, із цією запропонованою зміною, якби зловмисник Sybil повністю оточив новий вузол, який синхронізувався з нуля, він міг би розпочати подачу хибних блоків, починаючи з будь-якого блоку після створення, практично безкоштовно. Якби зловмисник Sybil повністю оточив вузол, який синхронізувався минулим блоком ~320 000, він міг би почати подавати помилковий ланцюжок з цієї точки ціною 322 доларів США за блок.
Коротше кажучи, будь-яка перевірка безпеки початкової синхронізації вузла є відносно недорогою для атаки, якщо суб’єкт може отримати повний контроль над підключенням до Інтернету вашого вузла; якщо вони T можуть, то вузол легко відхилить блоки зловмисника.
У зв’язку з цим кожна система блокчейну має свою жорстко закодований блок генезису у програмне забезпечення вузла. Ви можете стверджувати, що існує соціальний договір щодо «спільної історії», яка є бухгалтерською книгою: коли блок стає достатньо старим, усі в мережі розуміють, що він ніколи не буде скасований. Таким чином, коли розробники беруть дуже старий блок і створюють з нього контрольну точку, це робиться більше як узгоджена перевірка розумності, а не як диктування історії.
Окрім контрольних точок, існує також питання про те, як вузол завантажується сам. Поточний процес для Bitcoin вузлів полягає в тому, щоб перевірити, чи є у нього локальна база даних однорангових вузлів, про які він раніше дізнався. Якщо ні, тоді він запитає набір «початків DNS», які є жорстко закодований у програмне забезпечення. Ці вихідні дані зберігають список добре підключених Bitcoin вузлів, які вони повертають до вашого вузла.
Як ми бачимо з коду, Bitcoin CORE 0.13 наразі використовує DNS Seeds, якими керують Пітер Вуїлле, Метт Коралло, Люк Дашджр, Крістіан Декер, Джефф Гарзік і Йонас Шнеллі. Будь-хто може запустити DNS-засіб за допомогою Pieter Wuille програмне забезпечення для розсівання біткойнів або Програмне забезпечення Метта Коралло, хоча для того, щоб його використовували нові вузли, вам доведеться переконати розробників ONE з повних реалізацій вузлів додати ваш початковий хост DNS до свого програмного забезпечення.
Знову може здатися крайньою централізацією те, що процес початкового завантаження для нового вузла залежить лише від шести DNS-засіб. Пам’ятайте, що модель безпеки біткойна вимагає лише підключення до одного чесного однорангового пристрою, щоб мати можливість протистояти атакам Sybil.
Таким чином, новий вузол повинен лише мати можливість підключитися до одного початкового числа DNS, яке T зламано та повертає IP-адреси чесних вузлів. Однак існує резервний варіант, якщо з якоїсь причини всі DNS-засіб недоступні – a жорстко закодований список надійних IP-адрес вузлів, які оновлюється для кожного випуску.
Модель безпеки для цих різноманітних параметрів ініціалізації полягає не в тому, що оператор повного вузла довіряє X DNS-засадам або розробникам Y CORE , щоб вони надали їм чесні дані, а скоріше те, що принаймні 1/X DNS-засіб не скомпрометовано або 1/Y розробники CORE чесно говорять про це. перевірка дійсності жорстко закодованих однорангових змін.
Ніщо не є абсолютно безпечним
На ще більш глибокому рівні, коли ви запускаєте повний вузол, ви, ймовірно, певною мірою довіряєте апаратному та програмному забезпеченню, яке використовуєте.
Існують методи перевірки програмного забезпечення перевірка підписів вашого двійкового файлу проти ван дер Лана, але навряд чи багато людей намагаються пройти через цей процес. Що стосується надійного обладнання, це складна проблема. Найближче, що ви, ймовірно, підійдете до безпечного апаратного рішення ORWL, який гарантовано «самознищиться», якщо хтось спробує його підробити.

Однак, враховуючи те, що апаратні архітектури для процесорів, оперативної пам’яті та іншого важливого обладнання, як правило, є власністю, ви ніколи не можете бути на 100% впевнені, що вони T скомпрометовані.
Баланс сил Bitcoin
Вода стає ще каламутнішою, коли ви починаєте досліджувати стосунки між різними учасниками системи.
Метою роботи повного вузла є захист вашого фінансового суверенітету. Зазвичай це означає, що встановлюючи та запускаючи певну версію програмного забезпечення, ви укладаєте угоду про те, що ви будете дотримуватись правил цього програмного забезпечення та що всі інші користувачі мережі також повинні їх дотримуватися.
Таким чином, якщо люди хочуть змінити правила таким чином, щоб вони не були зворотно сумісними, ви повинні явно погодитися на зміну правил, запустивши нову версію програмного забезпечення. З іншого боку, зворотно сумісні зміни правил можна впроваджувати та застосовувати без вашої згоди.
Дуже спрощений опис динаміки потужності Bitcoin:
[вставити]https://twitter.com/lopp/status/786241843436544002[/вставити]
Важливо зазначити, що програмне забезпечення повного вузла не оновлюється автоматично, і це задумано. Автоматичні оновлення значно змінили б баланс сил у бік розробників, дозволивши їм примусово змінювати правила для вузлів і майнерів без їхнього дозволу.
На жаль, незважаючи на те, що зміна правила може бути технічно зворотно сумісною, ми з роками Навчання , що достатньо креативні програмні розгалуження можуть насправді впроваджувати зміни, які явно виходять за межі попередньої версії правил. Віталік Бутерін продемонстрував це з описом способу soft fork часу блокування біткойна з 10 хвилин до 2 хвилин, що, звичайно, також прискорить графік емісії нових біткойнів.
Є ONE козир, який мають повні вузли, щоб протистояти небажаним м’яким форкам, — це хардфорк від майнерів, які впровадили софт-форк. Це важко виконати (за задумом) і викликає багато питань щодо вимірювання консенсусу та пошуку економічно важливих вузлів.
Технічно це можна зробити, змінивши алгоритм майнера з подвійного SHA256 на іншу хеш-функцію, тим самим зробивши всі ASIC SHA256 марними для видобутку біткойнів. Саме з цієї причини оператори вузлів повинні бути уважними до змін в екосистемі та нагадувати майнерам, що їх можна замінити, якщо вони перевищать свої повноваження.
Багато теорії ігор пов’язано з обговоренням операцій майнерів та їх загрози безпеці біткойнів, і я припустив, як може змінитися екосистема майнінгу у попередній статті. Незважаючи на те, що майнінг Bitcoin є більш централізованим, ніж хотілося б більшості з нас, він усе ще працює добре, тому що майнери Bitcoin інвестували багато капіталу – вони T можуть ризикувати знищенням своїх інвестицій, діючи зловмисно в системі, за якою всі спостерігають.
Безпека SPV
Багато користувачів Bitcoin використовують легкий клієнт для доступу до мережі, а не повний вузол, оскільки він потребує набагато менше ресурсів, забезпечуючи надійний захист.
Клієнт, який використовує спрощену перевірку платежів (SPV), завантажує повну копію заголовків для всіх блоків у всьому ланцюжку. Це означає, що вимоги до завантаження та зберігання лінійно масштабуються залежно від часу, що пройшов з моменту винаходу Bitcoin . Це описано в розділі 8 інформаційний документ Bitcoin.

Сатоші написав, що клієнт SPV «T може самостійно перевірити транзакцію, але, прив’язавши її до місця в ланцюжку, він може побачити, що мережевий вузол прийняв її, і блоки, додані після нього, додатково підтверджують, що мережа прийняла її». SPV припускає, що підробка транзакції X блоків буде дорогою.
Здається, SPV пропонує подібні гарантії, як повна безпека вузла, але з додатковим припущенням, що будь-який блок із дійсним заголовком і підтвердженням роботи завжди містить дійсні транзакції. Оскільки клієнти SPV T перевіряють усі правила консенсусу, зазначені в першому розділі цієї статті, вони роблять припущення, що правила консенсусу перевіряються вузлом(ами), з якого вони Request транзакції.
Додаткова незначна відмінність у безпеці полягає в тому, що однолітки приховують від вас інформацію. Коли ви використовуєте повний вузол, однорангові вузли можуть утримувати від вас непідтверджені транзакції та блокування. Однак, як тільки ви отримаєте блокування від будь-якого однорангового вузла, ніхто не зможе стримати від вас транзакції в цьому блоці. З іншого боку, одноранговий партнер може передати заголовок блоку клієнту SPV, а потім приховати інформацію про транзакції в цьому блоці.
Клієнти SPV можуть зробити запит, щоб Навчання інформацію про транзакції, що впливають на певну адресу, і хоча для однорангових партнерів було б дорого брехати їм про існування підроблених підтверджених транзакцій (це потребувало б видобутку блоку з достатнім PoW), вони могли б збрехати, пропустивши заяву, що не було результатів для фільтра Блум, який ви використовували для запиту транзакцій. Також варто зазначити, що SPV жахливо порушено з точки зору Політика конфіденційності через недоліки фільтрів Блюм.
BitcoinJ має відмінний запис моделі безпеки SPV. Щодо непідтверджених транзакцій зазначають:
«У режимі SPV єдиною причиною, чому ви повинні вірити, що транзакція є дійсною, є той факт, що вузли, до яких ви підключилися, ретранслювали транзакцію. Якби зловмисник міг переконатися, що ви підключені до його вузлів, це означало б, що він міг би передати вам транзакцію, яка була повністю недійсною (витрачені неіснуючі гроші), і вона все одно була б прийнята як дійсна».
Безпека SPV, ймовірно, «досить хороша» для середнього користувача, хоча її можна покращити за допомогою SPV Fraud Proofs. Було деяка дискусія з ця концепція але не реалізовано пропозиції для вбудовування їх у протокол.
Немає такого місця, як 127.0.0.1
Якщо ви T використовуєте повний вузол (і фактично використовуєте його для підтвердження транзакцій), то ви передаєте принаймні певний рівень довіри третім особам, що призводить до іншої моделі безпеки для вашого використання Bitcoin. Зауважте, що це не вимагає, щоб усі користувачі та компанії створювали своє програмне забезпечення безпосередньо на основі RPC API Bitcoin Core.
Деякі альтернативні конфігурації інфраструктури можуть включати, але не обмежуватися:
1) Використовуючи мобільний гаманець, наприклад Bitcoin гаманець для Android, GreenAddress, або Заначка що дає вам змогу налаштувати гаманець, щоб запитувати лише ваш власний повний вузол.

2) Створення додатків на основі бібліотек вузлів SPV, таких як BitcoinJ, і налаштування їх для підключення лише до повних вузлів, якими ви керуєте. У BitcoinJ це можна зробити, визначивши свій власний SeedPeers що ви передаєте своїм PeerGroup під час ініціалізації. За допомогою libbitcoin ви можете визначити мережеве підключення до певного вузла використовуючи цей приклад.
3) Створення проксі-сервера, сумісного з API JSON-RPC Bitcoin Core, який надсилає деякі виклики стороннім службам, але також автоматично перевіряє дані, які вони повертають, здійснюючи виклики до локального повного вузла. Для прикладу див Програмне забезпечення BitGoD від BitGo. Ця гібридна модель може дати вам найкраще з обох світів: ви можете використовувати розширені функції, запропоновані третіми сторонами, зберігаючи при цьому свій фінансовий суверенітет.
Повні вузли для свободи
Зрозуміло, що запуск власного повного вузла забезпечує чудову безпеку з найменшою кількістю необхідних припущень. З огляду на те, що ви можете створити комп’ютер, здатний працювати з надійним повним вузлом, лише за кілька сотень доларів, порахуйте та визначте, чи варте забезпечення вашого фінансового суверенітету цієї ціни.
Дякуємо Кристову ATLAS, Еріку Мартіндейлу, Ендрю Міллеру та Кіарі Роблес за рецензування та відгуки щодо цієї статті.
Рекомендоване зображення через Ден Нотт для CoinDesk. Інші зображення відповідно до підписів.
Jameson Lopp
Джеймсон Лопп є технічним директором і співзасновником Casa, служби самоопіки. Шифрпанк, метою якого є розробка Технології , яка надає людям можливості, він створює багатопідписні Bitcoin гаманці з 2015 року. До заснування Casa він був провідним інженером інфраструктури BitGo. Він є засновником Bitcoin Special Interest Group Mensa, зустрічі Triangle Blockchain and Business і кількох проектів Bitcoin з відкритим кодом. Весь цей час він працював над тим, щоб розповісти іншим про те, чого він навчився на важкому шляху під час написання надійного програмного забезпечення, яке може протистояти як ворогам, так і недосвідченим кінцевим користувачам.
