Недавний крах DAO – системы на базе Ethereum, из которой хакеры ухитрились увести валюты почти на $150 млн, вызвал серьезную дискуссию. Некоторые из хакеров действительно были злоумышленниками, другие лишь тестировали систему. Но одним из самых важных выводов стало то, что для DAO требуется своего рода аварийный люк. Такой «запасной выход» должен стать тем механизмом, который при обнаружении чего-либо подозрительного будет в состоянии остановить работу умного контракта и перейти на особый уровень контроля безопасности.
Главная проблема с аварийным люком заключается в «автономной» природе умных контрактов. Не в последнюю очередь умные контракты используются из-за их предсказуемости и запрограммированности. Было бы по меньшей мере наивно теперь в спешном порядке «приделать» им аварийный люк, лишив их тем самым основных преимуществ.
Предлагаем рассмотреть в этой статье один простой и вместе с тем эффективный аварийный люк, который практически полностью децентрализован и отвечает всем требованиям DAO.
Наивные решения
С технической точки зрения самый простой аварийный люк – это криптографический ключ, встроенный непосредственно в контракт. Активировать такой запасной люк и перевести контракт в «режим обслуживания» может лишь человек, обладающий разрешением. Таким образом, у владельца ключа возникает возможность отладки и перезапуска контракта с использованием одного и того же ключа. Для аварийного люка такого вида подходит умный контракт с мультиподписью или общий секретный ключ, позволяющий отвергнуть операцию главного контракта по совместному решению владельцев.
Однако владельцы ключей представляют собой слабое звено: они могут вмешиваться в операцию главного контракта DAO ради собственной выгоды, ключи могут быть утеряны либо украдены, или же злоумышленники могут заставить владельцев выдать им ключи. К тому же мало кто согласится нести такую ответственность, когда при определенном стечении обстоятельств можно оказаться под судом. Следовательно, такой аварийный люк применительно к DAO является нежелательным.
Лучший выход
Однако простой в реализации, децентрализованный запасной выход (ДЗВ) существует, с которым атака, опустошившая DAO, вполне могла быть остановлена.
Рассмотрим его структуру подробнее. Итак, в состав ДЗВ входят следующие три компонента.
Буфер. Все деньги на выходе из главного контракта проходят контракт ДЗВ.
ДЗВ сохраняет эти денежные потоки в буфере на заранее определенное количество времени, например сутки, прежде чем фактически выполнить send() – процедуру по их окончательному выводу. Эта задержка обеспечивает возможность рассмотреть операцию главного контракта на предмет ошибок.
Спусковой механизм. ДЗВ имеет механизм, при помощи которого денежные потоки в его буфере при определенных условиях могут быть возвращены в главный контракт.
Действие отмены. Способ, при которым ДЗВ определяет, как вернуть те или иные действия.