Bitcoin Forum
June 30, 2024, 09:49:12 AM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Помните о гэпах биткоин-адресов  (Read 100 times)
vaultman (OP)
Copper Member
Full Member
***
Offline Offline

Activity: 493
Merit: 170


BountyMarketCap


View Profile
November 20, 2020, 12:36:28 PM
Last edit: November 20, 2020, 02:46:53 PM by vaultman
Merited by Symmetrick (6), xenon131 (2)
 #1


Руководство по предотвращению и устранению крайних случаев гэпа биткоин-адресов.

Владельцы биткоинов, которые самостоятельно хранят свои монеты, должны знать о различных способах кражи или потери их ключей. Но что менее известно, так это то, что можно потерять свои биткоины, даже если у вас все еще есть ключи!


Историческая справка

Раньше биткоин-кошельки были просто «связкой ключей», что означало, что они будут случайно генерировать ключи по мере необходимости и пытаться сохранить определенное количество неиспользованных ключей в любой момент времени. Обратной стороной этого было то, что каждый раз, когда кошелек генерировал новый ключ, пользователю приходилось делать новую резервную копию. Естественно, кошельки не будут информировать пользователей об этом факте, и в конечном итоге люди навсегда теряют доступ к средствам из-за недостаточно частого резервного копирования своего кошелька.

Иерархические детерминированные (Hierarchical Deterministic, HD) кошельки были разработаны, чтобы сделать резервное копирование простым одноразовым процессом. Однако вместе с HD кошельками появилась новая проблема.

Если Вы импортируете / восстанавливаете кошелек на основе пула ключей, то тут все довольно просто: все, что у вас есть ― это ключи, которые Вы импортируете. С HD кошельками ваш мнемонический код ― это портал к практически неограниченному количеству ключей. Поскольку мы не хотим тратить неограниченное количество времени на генерацию ключей из своего мнемонического кода, импорт кошелька должен следовать определенному процессу обнаружения ключей, который включает в себя разумные ограничения на то, когда прекращать генерацию ключей и поиск средств. Учитывая мнемонический код, параметры сценария погашения и путь деривации, кошелек должен пройти по стандартным дочерним путям учетной записи, пока не достигнет большого гэпа адресов, которые никогда не получали средства. Это число называется «ограничением по гэпу адресов» (address gap limit).


Как отмечено в BIP 44 и BIP 45, рекомендуемый предел гэпа адресов составляет 20 (только на пути адресов приема, а не на пути адресов сдачи). Обратите внимание на раздел BIP 44:

Quote
Ограничение по гэпу адресов в настоящее время установлено на 20. Если программное обеспечение обнаруживает 20 неиспользуемых адресов подряд, то ожидается, что за пределами этой точки нет используемых адресов, и поиск прекращается. Мы сканируем только внешние цепочки адресов, потому что внутренние цепочки получают только те монеты, которые поступают из связанных внешних цепочек.
Quote
Программное обеспечение кошелька должно предупреждать пользователя, когда он пытается превысить лимит гэпа по внешней цепочке, создавая новый адрес.

К сожалению, лишь немногие кошельки следуют рекомендации BIP 44, чтобы предупреждать пользователей о гэпе адресов.


Предположения…

Все вопросы, поднятые в этой статье, связаны с предположениями, которые не всегда верны. Какие это предположения?

•   Ни один пользователь не будет создавать 20 адресов подряд без получения депозита;
•   В пути деривации адресов сдачи никогда не будет гэпов.



Случаи гэпов на практике

Первый раз я столкнулся с проблемой гэпа адресов еще в 2016 году

Проблема, с которой я столкнулся, была связана с длинной цепочкой неподтвержденных транзакций, для которых главная транзакция была искажена, что сделало недействительными все дочерние транзакции. Какие еще крайние случаи могут вызвать гэпы адресов?

•   Вы сгенерировали 20+ адресов приема во время тестирования кошелька, на которые Вы не получали средства, затем Вы получили средства на адреса, созданные после этого;
•   Вы создали множество адресов для внесения в белый список на различных сторонних сервисах с целью вывода средств, но в конечном итоге не перевели средства на них;
•   На вашем интернет-магазине / сервере BTCPay было создано более 20 счетов, которые не были оплачены. Это своего рода вектор DoS-атаки, потому что, как правило, не требуется больших затрат для того, чтобы пройти процесс проверки и заставить продавца выставить счет;
•   Вы запускаете сервис, который принимает депозиты (например, биржу) и назначаете уникальные депозитные адреса для каждого пользователя. Если 20 пользователей создадут учетные записи, но никогда в них не сделают депозит, то Вы превысите гэп-лимит;
•   У вас есть один и тот же кошелек, работающий на разных устройствах, которые не синхронизируются друг с другом, и Вы генерируете много адресов на одном устройстве, но не на других;
•   У вас есть кошелек “только для просмотра”, работающий на устройстве, которое не синхронизируется с программным обеспечением кошелька, которое Вы используете для расходования средств;
•   Вы можете столкнуться с проблемами гэпа на пути адресов сдачи, подписав несколько предложенных транзакций, но не транслируя их, а затем транслируя транзакцию, которую Вы создаете позже.



Возможные решения

Превентивные меры:
•   Ограничение по генерации адреса получения: в Casa мы не разрешаем приложению создавать новый адрес, пока на текущий адрес не поступят средства. Это может негативно повлиять на опыт пользователей, которые хотят сгенерировать много депозитных адресов, но мы считаем это функцией безопасности;
•   Добавление алгоритма в свой биткоин кошелек, который возвращает и перераспределяет неиспользуемые адреса. Это может привести к путанице для продавцов, если кто-то оплачивает счет, срок действия которого истек, а адрес повторно используется. Это даже может оказаться невозможным для сервисов, которые назначают адреса давно существующим учетным записям. Вы могли бы возразить, что такие сервисы должны увеличивать лимит для своих целей, но и с другим путем деривации Вы неизбежно столкнетесь с проблемой прогнозирования.
•   Добавление платы за генерацию адреса для пользователя. Это не обязательно должны быть финансовые затраты, это должно быть своего рода “ограждение”, через которое им нужно “перепрыгнуть”, чтобы отпугнуть спамеров. Если кто-то может просто написать скрипт или обновить страницу большое количество раз, чтобы сгенерировать тысячу адресов в вашем кошельке, то у вас могут возникнуть серьезные проблемы.


Восстановительные меры:
•   Вручную заполнять гэпы, отправляя на них небольшие суммы BTC. Это дорого и представляет собой пустую трату ограниченного пространства блока.
•   Увеличить лимит гэпа в параметрах кошелька. Не все кошельки поддерживают это, но у некоторых (Electrum и Ledger Live) есть такая функция.


Изменить конфигурацию лимита гэпа в Electrum можно в консоли:

Quote
•   wallet.change_gap_limit (100)
•   wallet.storage.write ()


Возврат пропавших средств

Я уже сбился со счета, сколько раз мне приходилось помогать людям восстанавливать средства, которые «таинственным образом исчезали», когда они пытались восстановить кошелек из своей резервной копии. Мое решение - восстановить кошелек в Electrum (желательно, загрузив мнемонический код на аппаратное устройство), а затем использовать консоль для быстрого создания большого количества адресов:

Quote
for x in range(1000): wallet.create_new_address(False)
for x in range(1000): wallet.create_new_address(True)

В левом нижнем углу окна Electrum Вы должны увидеть сообщение «Synchronizing…» в течение нескольких секунд, а затем, я надеюсь, ваши «пропавшие» монеты и транзакции появятся! Теперь Вы опять сможете расходовать свои средства.

К счастью для пользователей BTCPay Server, у них есть встроенный инструмент повторного сканирования, который устанавливает лимит гэпа по умолчанию на 10 000 - это единственное программное обеспечение кошелька, с которым я столкнулся, позволяющее делать это так же просто, как нажать на кнопку.




Практический пример

Если Вы хотите знать, каково это ― искать потерянные деньги, то установите Electrum и настройте следующий кошелек “только для просмотра”.

1.   Запускаем: electrum --testnet
2.   Создать новый кошелек
3.   Выберите «Стандартный кошелек».
4.   Выберите «Использовать master key».
5.   Вставьте следующий расширенный публичный ключ:       vpub5VbqiMAitbLcBPBLVaHWTudEfwaBwcAR4naUaM54kGTDqFFB9bTU5sAwD3SoM7pD2JVVqTuojBR cQcauBeiswgm8QL1x2qrpxuPwsLjtU2W


Посмотрите, сможете ли Вы найти весь баланс кошелька: 20 TBTC


Другие последствия

Если Вы используете кошелек с упрощенной проверкой платежей (SPV) и большим лимитом гэпа, то Вы можете столкнуться с некоторыми серьезными проблемами. Превышение максимального размера фильтра Блума BIP 37 в 36000 байт, что было бы эквивалентно фильтру из 20000 адресов, приведет к тому, что узел отклонит ваш запрос. Кроме того, когда размер фильтра Блума приближается к 20000 адресов, частота ложных срабатываний будет приближаться к 0,1%. Принято считать, что фильтры Блума ужасно сказываются на конфиденциальности, и предприятиям следует запускать свои собственные полные узлы с решением индексирования UTXO для быстрого поиска.

Гэпы адресов можно даже превратить в орудия нападения с целью выкупа!


Скрытая опасность

Гэпы адресов - это вид низкоуровневой проблемы, которой пользователи биткойнов не должны заниматься сами. Однако до тех пор, пока все популярное программное обеспечение биткойн-кошельков не справится с этим крайним случаем более изящно, оно будет продолжать вызывать кошмары для тех, кто с ним столкнется.


Оригинал статьи на английском языке: https://blog.lopp.net/mind-the-bitcoin-address-gap/

▬▬▬▬▬▬▌   Vulcan Forged    ▐▬▬▬▬▬▬
▬▬▬▬▬▬▌    Telegram   ▌    Discord      ▌     Twitter      ▐▬▬▬▬▬▬
▬▬▬▬▬▬▬▬▬▬▬▬▬▬  DISCOVER   ▬▬▬▬▬▬▬▬▬▬▬▬▬▬
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!