Чому пули приховують від вас Stale шари?

15/02/2023

Криптекс не приховує втрати через відхилені шари. Інші пули можуть це робити. Досить смішно іноді читати: "А у пула N 0% реджектів".

Смішно, бо так не може бути. Чому? Розбираймося!

Види рішень та їх відмінності

Відеокарта обробляє роботу → надсилає рішення → пул перевіряє рішення:

  1. Share accepted (шару прийнято) — все добре, пул прийняв рішення і сплатить за нього.

  2. Rejected share (шара відхилена) — з рішенням щось не так, і пул його відхиляє:

    • Invalid share — неправильне рішення. Відеокарта порахувала задачу невірно (2+2=5). Зазвичай, таке рішення відсіюється ще на етапі перевірки комп'ютером і не надсилається до пулу. На правильно налаштованій відеокарті неправильних рішень майже не буває.
    • Stale share — “старе”, “несвіже”, “запізніле”, “неактуальне” рішення. Це рішення, яке надійшло до пулу надто пізно, тому що пул вже видав інше завдання для пошуку іншого блоку.
    • Duplicate share — рішення-дублікат. З якоїсь причини, відеокарта двічі порахувала та надіслала одне й те саме рішення. Два однакових рішення пул не ухвалить. Рішення, яке надходить на пул пізніше, відзначається як duplicate і не сплачується.

    Найчастіше, Stale та Duplicate — результат затримок мережі та проблем з інтернетом.

Чому 0% Rejected shares — це обман?

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

Коли відеокарта знаходить рішення — вона надсилає це рішення пулу. І тут з'являються дві можливості:

  1. Ваша карта знайшла шару у відведений час для пошуку блоку. Відмінно, цю шару прийнято, share accepted!
  2. Ваша карта знайшла шару, коли блок вже сформовано. Ваша карта не змогла знайти рішення у відведений для цього час, але через пару секунд все-таки знайшла його та надіслала до пулу. Ця шара має нагоду створити Uncle block. Тобто її ще не зовсім втрачено, але пул повинен відзначити її як stale.

Шара, яка не вписується у відведений на пошук блоку час (Block time), ризикує породити Uncle Block.

Поняття Uncle Block існує лише у Ethereum-based монет (ETH, ETHW, ETHF, ETC, UBQ). В інших монетах, такі блоки називаються Orphan Block. Такі блоки взагалі не приносять прибутку ні пулу, ні майнерам.

Отже, Stale shares у вас будуть, і що більша затримка мережі (чим пізніше відеокарта отримає роботу) — то їх буде більше.

Навіть якщо проблем із мережею взагалі немає — майнер може відправити шари для блоку вже після того, як блок було знайдено. Шара стає stale та згодиться максимум для Uncle блоку.

У результаті маємо, що реджектів з пункту 2 уникнути неможливо.

Пошук блоку та нагорода за блок

Розглянемо процес на прикладі мережі Ethereum Classic ETC (для різних монет умови будуть різними).

Початкові дані:

  • Час на пошук блоку — 13,3 секунди.
  • Нагорода за блок (за написання) — 2.56 ETC + нагорода за Uncle блок. Нагорода за блок знижується на 20% кожні 5 000 000 блоків згідно з протоколом монети ETC. На момент написання нагорода за Uncle блок складає близько 0,08 ETC.
  • Якщо пул знайшов той самий блок пізніше за інший пул — його блок стає Uncle-блоком.

Розрахунок нагороди за блок та uncle блок можна знайти в цій статті розробників: https://ethereumclassic.org/blog/2018-02-22-rewards

Період блоку

Період блоку (або час блоку) — це час, за який ви повинні відправити шару, а пул ухвалить її для формування блоку. Це проміжок часу відведений для шари, щоб стати accepted.

Майнери, що брали участь у створенні блоків, одержують додаткову нагороду з Uncle блоків.

  • Якщо шару відправлено в рамках часу, заданого на пошук Block 1 (в середньому 13,3 секунди), вона враховується для знаходження Block 1.
  • Якщо шару для Block 1 відправлено після того, як Block 1 було знайдено, вона не використовується, але може бути використана у створенні Uncle Block 1 першого, або другого порядку.

13,3 с — середній період часу на пошук блоку. Тобто якщо перший блок будо знайдено за 20 секунд, другий за 10 секунд, третій за 9 секунд, то середній час період блоку складатиме 13 секунд.

Шара, період якої сягає більше 60 секунд, з ймовірністю близькою до 100%, має стати stale (rejected), тому що пул не зможе використовувати таку шару для формування блоку. Вона може підійти максимум для Uncle блоку.

На малюнку нижче, можна побачити розподіл ймовірності блоків. Вертикальна шкала — можливість знаходження блоку (0.0 — 0%, 1.0 — 100%), а горизонтальна — період блоку в секундах.

Графік запозичений зі статті https://github.com/rolandkofler/blocktime

Блокчейн один, пулів багато, майнерів — ще більше. Один блок можуть водночас видобувати декілька пулів та тисячі майнерів. Майнер може підключитися будь-якої миті, і навіть якщо шару відправлено швидко (15 мс), вона має шанс стати частиною Uncle блоку. Сам блок вже знайдено, але ця шара призначалася йому.

Нагороду за блок отримує той пул і ті майнери, що першими знайшли блок.

Пул, який має більше stale шар, має менше повноцінних блоків і більше бере участь у створенні Uncle блоків. Це значить, що пул заробляє менше. Майнери, що майнят на ньому, також заробляють менше.

Нагорода за Uncle блок

Uncle-блоки — це дійсні блоки, створені майнером практично в той самий час, коли інший майнер вже знайшов успішний блок. Uncle-блоки з'являються внаслідок затримки у мережі та утворюються зі stale шар.

Нагорода за Uncle блок залежить від кількості приєднаних Uncle блоків, а також від кількості самих блоків на поточний момент. Uncle блок оплачується за рахунок новостворених блоків. Кожен новий блок може містити не більше двох Uncle блоків. Нагорода за кожний Uncle блок складає 1/32 від базової нагороди за блок, або 3,125% від нагороди за блок.

Навіщо ж пули приховують stale шари?

  1. Репутація пулу: пул виглядає гарно в очах майнерів. Не видно проблеми — отже, її взагалі не існує.
  2. Плюси для майнерів з поганим з'єднанням: вони одержують нагороду, незважаючи на проблеми із мережею (але ж незаслужено).
  3. Плюси для майнерів зі з'єднанням без проблем: Жодних!

Що поганого у приховуванні stale шар?

У приховуванні stale або будь-яких інших rejected шар немає нічого хорошого. Від цього страждають усі: пул, майнери з проблемами та майнери, які не мають проблем.

Приховуючи stale шари, пул позбавляє вас чесного заробітку!

  1. Мінуси для пулів: знижується загальна прибутковість. Через стейли знижується кількість блоків, за які майнери отримують 100% прибутку. Збільшується кількість Uncle-блоків, за які майнери одержують лише 3% прибутку.
  2. Мінуси для майнерів з поганим з'єднанням: вони не знають про наявність проблеми, отже нічого з цим не роблять. Вони несвідомо знижують загальну прибутковість пулу собі та іншим. Проблема накопичується і колись вийде боком.
  3. Та найбільше страждають майнери, у яких проблем немає:
    • Майнери, у яких проблем немає майнять "і за себе, і за сусіда", діляться своєю нагородою з тими, хто майнить зі стейлами.
    • Вони ніяк не впливають на ситуацію — з їхнього боку все чудово.

Що втрачають майнери? Скільки це грошей?

Збільшення кількості stale шар призводить до пропорційного збільшення кількості Uncle блоків та зменшення нормальних блоків. Між stale шарами та Uncle блоками існує пряма залежність. Якщо у користувача на пулі 50% stale шар, то у нього буде 50% нагороди від Uncle блоків, а не від нормального блоку.

  • Винагорода за uncle block 1 = 3% від нормального.
  • Винагорода за uncle block 2 = 3% від нормального.

Якщо припустити, що на пулі 5% майнерів, які генерують лише стейл шари (які породжують uncle block), то втрати становитимуть:

  • uncle block 1: (100-3)*0,05 = 4,85%
  • uncle block 2: (100-3)*0,05 = 4,85%

Сумарні втрати становитимуть 9,7%

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

Невже все так погано?

Існують пули, на яких можна майнити stale шарами 24/7, та навіть отримати виплату! Найчастіше, такі пули навіть не дивитимуться через що ті стейли.

Можна створити штучну затримку інтернет-з'єднання, скажімо, в 120 секунд, і відправляти шари. Пул спокійнісінько позначить їх як прийняті.

Час знаходження блоку той самий — 13.3 секунди.

  • PPS пули, що сплачують за кожну знайдену шару, просто зобов'язані відзначати такі шари як stale, тому що будь-яке відхилення від норми (будь-які шари, окрім share accepted) безпосередньо впливають на прибуток майнера.
  • PPLNS пули можуть приховати стейл шари, прикрившись "низькою вдачею пулу".

Якщо ви майните 100% стейлами в обох випадках, пул знає про це і показує їх. Більше того — продовжує платити гроші!

Це говорить лише про одне: нестачу пул покриватиме з кишені майнерів, у яких все добре.

Працювали 2 два робітника: Сашко та Василь. Сашко працював чесно, а Василь байдикував. Прийшов начальник роботу приймати і заплатив їм порівну. Начальник каже, що бачить тільки зроблену роботу, а що там “не зроблено” — його не хвилює. Працювали вдвох? Значить удвох оплату та отримуєте.

“Як так? Це ж не чесно!” — вірно, не чесно, але це плата за навмисне чи ненавмисне приховування стейлів.

Що робити, якщо в мене погане інтернет з'єднання. Чи можу це виправити?

  1. Розвантажте інтернет-канал. Качаєте торрент? Обмежте швидкість та кількість одночасних підключень. Якщо це не допоможе — спробуйте взагалі закрити торрент. Дивитеся Ютуб? Можливо, варто знизити якість картинки? Це розвантажить канал та покращить з'єднання.
  2. Вимкніть усі можливі обмежувачі у вигляді антивірусу чи файрволу.
  3. Вимкніть VPN та Proxy. Інтернет через VPN або Proxy завжди гірший за пряме з'єднання.
  4. Замініть підключення на пряме, дротове LAN підключення, якщо користуєтеся Wi-Fi роутером або мобільним інтернетом. Wi-Fi завжди буде гірший за дротовий інтернет, тому що на нього впливає безліч факторів: перешкоди у радіо ефірі, перевантаженість каналу, якість Wi-Fi роутера, якість Wi-Fi приймача, та навіть працююча мікрохвильова піч (мікрохвильовка працює в тому ж частотному діапазоні, що і Wi-Fi, різниця тільки в потужності сигналу).

Більше порад у нашій статті "Як позбутися відхилених шар?

This article is available in other languages: