Разбор Bancor: все ваши токены принадлежат нам
Автор статьи: Уди Вертгеймер. Это первая статья из серии Unchained Reports (просветительские разборы), где рассматриваются часто упускаемые из виду детали относительно проектов в текущем «пузыре ICO».
Недавно проект Bancor собрал ~150 млн долларов. Команда успешно провела кампанию, получив самую крупную на сегодняшний день сумму среди ICO.
Основная задача Bancor — обеспечивать ликвидность токенов «длинного хвоста». Это интересная идея, которая заслуживает внимания. Этим проектом занимается квалифицированная команда предпринимателей. У них уже есть несколько отличных демонстрационных версий.
Я потратил некоторое время, чтобы рассмотреть большую часть материалов Bancor, включая код умного контракта. И я не ожидал найти в них некоторые вещи, которые считаю опасными бэкдорами.
В этой статье я подробно расскажу о своих находках, включая ту лазейку, которая позволяет команде забрать токены у кого угодно. Но сначала я коротко расскажу, что такое умные контракты и почему так важно их просматривать.
А вы читали код умного контракта?
Умные контракты — «сердце» блокчейна Эфириума. Их пишут программисты, поэтому некоторые люди считают их приложениями. Но на самом деле их задача — заменить юридические бумаги. Умные контракты могут описывать, например, набор условий, которые указывают, кто получит предварительно заложенную сумму или кто будет решать, что случится с пулом койнов.
Они очень похожи на традиционные контракты. Но в отличие от них здесь нет судей, которые принимают решение. Вместо этого участники блокчейна запускают код умного контракта, чтобы решить исход транзакции. У умного контракта есть только одна «интерпретация», и компьютер выполняет действия согласно ей. Ни желания создателя контракта, ни толкование контракта какой-либо стороной здесь роли не играют. Важно только то, что прописано в коде.
Просматриваем контракты Bancor
Умные контракты используются во многих ICO. Bancor не исключение.
Эта статья касается не столько самого проекта Bancor, сколько необходимости проверять контракты. Я не буду затрагивать детали протокола Bancor. Я рекомендую почитать официальную документацию проекта, где все подробно описано, а также разбор его потенциальных проблем от Эмина Гюна Сирера и Фила Дайана (ред. 22/06/2017: и очень подробный ответ команды Bancor, который был опубликован после размещения этой статьи).
Мы подробнее остановимся на контракте краудсейла и рассмотрим, соответствовал ли код контракта условиям продажи, которые опубликовала команда проекта.
Затем мы взглянем на контракт, который управляет токенами (BNT), созданными в ходе краудсейла, и на его опасные бэкдоры.
Неограниченный краудсейл
Краудсейл Bancor был запущен 12 июня. До его начала команда опубликовала в блоге условия продажи, включая следующие:
Кампания продлится не более 14 дней.
В ней будет предусмотрен «скрытый порог», который команда покажет при достижении 80 % от предельной суммы.
В течение первого часа, который назвали «минимальным сроком», средства будут приниматься в любом количестве, даже если оно превысит «скрытый порог». Если такое случится, кампания завершится сразу по истечении первого часа. В противном случае она продолжится до «скрытого порога».
Но в контракте краудсейла (его можно увидеть здесь) были прописаны немного другие условия. Я объясню, что было в контракте, и приложу соответствующие части кода на случай, если вы умеете его читать.
Кампания действительно должна была продлиться 14 дней.
1
Продолжительность краудсейла прописана в коде контракта.
Здесь есть «скрытый порог», и команда криптографически фиксирует его (то есть он скрыт, и его нельзя изменить после начала продаж). Он будет показан, когда команда решит это сделать.
2
«Скрытый порог» показывается и устанавливается, когда владелец контракта вызывает функцию enableRealCap, которая задает переменную totalEtherCap.
Продажа не ограничивается (кроме «порога безопасности» в 1 000 000 ETH, что составляет 400 млн долларов; это в 4 раза больше «скрытого порога», который стал известен позднее), пока команда не показывает «скрытый порог». Здесь нет указания про первый час, как было описано в условиях продажи в блоге. Я не думаю, что они могли бы запрограммировать это условие в контракте, не показывая заранее «скрытого порога».
3
Порог безопасности составляет 1 000 000 ETH. Когда владелец контракта вызывает функцию enableRealCap из предыдущей части кода, его заменяет «скрытый порог».
4
Вызов модификатора etherCapNotReached происходит перед каждым взносом. Так программа подтверждает, что общее количество внесенных средств не превышает текущего totalEtherCap. Последний составляет 1 000 000 ETH, пока владелец контракта не решит показать «скрытый порог».
После начала продажи люди бросились вкладывать эфир. Нагрузка на сеть Эфириума резко возросла из-за обработки всех этих транзакций. Такое порой происходит во время столь крупных и заметных ICO. Когда первый час был близок к концу, сумма всех подтвержденных сетью транзакций составляла 70 млн долларов. И еще десятки миллионов находились в очереди, ожидая подтверждения.
В соответствии с условиями, опубликованными ранее, они должны были завершить «неограниченный первый час» и вскоре после этого показать «скрытый порог», так как сумма достигла 80 млн, ~80 % от лимита.
Но они выпустили важное обновление:
Мы решили увеличить минимальный срок до ТРЕХ ЧАСОВ, чтобы сеть Эфириума обработала все НАХОДЯЩИЕСЯ НА РАССМОТРЕНИИ транзакции и каждый, чьи транзакции не прошли, смог ПОВТОРИТЬ ПОПЫТКУ. Мы намерены охватить всех ранних спонсоров.
Многих это удивило. Некоторые инвесторы были рады, так как они не смогли поучаствовать в кампании в первый час в связи с загрузкой сети. Другие разозлились (вероятно, те, кто успел вложить средства). Им обещали, что порог будет раскрыт по окончании первого часа, но после увеличения «минимального срока» до 3 часов, их доли по существу были размыты.
Одну группу людей это не удивило: тех, кто заранее потратил время на изучение контракта. Они всегда знали, что возможен такой вариант развития событий.
Сложно сказать, насколько хорошим или плохим было решение об увеличении «минимального срока». Основная мысль здесь состоит в следующем: когда контракт дает его владельцу возможности, не указанные в официальном заявлении и публикациях, это может вызвать недоумение у тех людей, которые не читали контракт.
Но основной сюрприз поджидает впереди…
Токен, полный бэкдоров
1-hh9RcNm6jms1jITe3eG-3Q
Люди считают «криптовалюты» или «цифровые активы» (или как там еще их сегодня называют продвинутые ребята) децентрализованными, устойчивыми к цензуре токенами, которыми не может управлять некая одна сторона. Различные проекты придерживаются разной степени (де)централизации, но я никогда не видел настолько централизованного токена, как BNT, где в руках группы людей находится так много контроля.
Контракт BancorTokenContract управляет токеном BNT и его поведением. Сейчас он принадлежит контракту BancorCrowdsale, который, в свою очередь, находится под управлением контракта с закрытым исходным кодом. Последний представляет собой счет с «мультиподписью», который принадлежит проекту и/или его партнерам.
Контракт BancorCrowdsale дает своим владельцам следующие возможности:
В любое время, по любой причине команда может блокировать все транзакции с использованием токена BNT. Вероятно, такая возможность предусмотрена, чтобы сразу после краудсейла заморозить все токены на неделю, пока не будет готов главный продукт Bancor. Но, по какой-то причине, после разморозки токенов команда сохранит возможность блокировать транзакции в любое время.
5
В BancorTokenContract владелец контракта (контракт ниже) может блокировать транзакции.
6
В BancorCrowdsale владелец контракта (команда Bancor) может использовать BancorTokenContract (выше), чтобы блокировать транзакции.
Команда может выпускать новые токены в любое время. «Обменнику» Bancor требуется возможность программно создавать токены по формуле маркетмейкинга из другого умного контракта. Поэтому ему необходима возможность создавать больше токенов. Но, по какой-то причине, команда может свободно создавать новые токены.
7
В BancorTokenContract владелец контракта (контракт ниже) может свободно выпускать новые токены.
8
В BancorCrowdsale владелец контракта (команда Bancor) может использовать BancorTokenContract (выше), чтобы свободно выпускать новые токены.
Невероятно, но команда может УНИЧТОЖАТЬ токены ЛЮБОГО СЧЕТА в любое время. И снова «обменнику» Bancor требуется возможность программно уничтожать токены, отправленные его контракту, поэтому такая функция предусмотрена. Ее можно легко ограничить только токенами, которые относятся к этому контракту. Но здесь команда может выбрать токены любого счета и уничтожить любое их количество.
9
В BancorTokenContract владелец контракта (контракт ниже) может уничтожать любые токены.
10
В BancorCrowdsale владелец контракта (команда Bancor) может использовать BancorTokenContract (выше), чтобы уничтожать любые токены.
Третий пункт просто не выдерживает критики. Я просматривал и другие контракты, которые управляют разными токенами, и не нашел ничего похожего. Что еще хуже, владельцы контракта имеют много скрытых возможностей.
Как этого не заметили?
В криптосфере такие вещи противоречат общепринятым нормам. И почему никто не обратил на это внимание?
Допустим, люди не заметили.
В этой публикации сказано, что команда Bancor пригласила двух аудиторов безопасности, чтобы проверить контракты. Но в ней отмечены только положительные моменты. Здесь не перечислялись проблемы, которые заметили аудиторы. В публикации есть только ссылки на длинные отчеты, которые написаны сложным техническим языком. Я сомневаюсь, что многие люди потратили время, чтобы детально их изучить.
Мартин Хольст Свенде, ведущий специалист по безопасности в Эфириуме, в своем отчете писал следующее:
Реализация протокола Bancor построена по модели безопасности на основе централизованного доверия: владелец контрактов, в значительной степени, контролирует активы, которые торгуются на платформе… Так как протокол Bancor представляет собой довольно сложную схему… централизованная модель не лишена смысла, как минимум на раннем этапе.
Ник Джонсон, член Ethereum Foundation, в своем отчете писал так:
Участники должны понимать, что контракты, разработанные для краудсейла, требуют доверия и зависят от честности команды Bancor. Последние заявляли, что это сделано умышленно: такая реализация позволит им справляться с любыми проблемами, которые возникнут во время краудсейла и на ранней стадии; ручной контроль сменится на более автоматизированный, когда они будут уверены, что система работает должным образом.
То есть оба уважаемых аудитора видели, что контракты полностью централизованные. Когда они говорили об этом команде Bancor, последние просто отвечали: «Мы знаем, в этом вся суть».
По мнению команды, пока их основной умный контракт находится на стадии тестирования, они должны сохранять полный контроль на случай непредвиденных ситуаций. Они подробно рассказывают об этом подходе в статье «Учимся на ошибках the DAO». В ней говорится о контроле команды над основным «обменником», контроле, который они планируют со временем снять. Но здесь не упоминается обо всех бэкдорах, перечисленных ранее.
В Википедии о бэкдорах пишут следующее:
Хотя обычно бэкдоры встраивают тайно, в некоторых случаях это делают намеренно и открыто. Такие виды бэкдоров считаются «правомерными» и позволяют, например, производителю восстанавливать пароли пользователя.
Я уверен, что команда Bancor не намерена злоупотреблять этими бэкдорами и считает их «правомерными». Но я не совсем согласен с их правомерностью, и в любом случае об их существовании нужно говорить инвесторам напрямую.
Люди в этом пространстве считают, что контроль над токенами полностью децентрализован. И если по какой-либо причине это не так, нужно доходчиво им все объяснять.
Обновляемость
Контракты Bancor «обновляемые». Это значит, что команда может самостоятельно добавить в них новую функциональность, которая даст им больше контроля или, наоборот, лишит их его. Они обещают, что будут постепенно снимать свой контроль над системой.
В следующие несколько дней (уже сделано) они планируют заменить текущий развернутый контракт BancorCrowdsale на BancorChanger. Но этот новый контракт по-прежнему содержит 3 бэкдора: блокировку всех транзакций, выпуск новых токенов и уничтожение любых токенов.
Риски
Как я упоминал ранее, я верю, что команда Bancor не будет злоупотреблять этими бэкдорами. Но тот факт, что столько возможностей сосредоточено в одних руках, создает потенциальную единую точку отказа. Например, ключи команды можно украсть. Или правоохранительные органы могут заставить их заблокировать или удалить токены, если поймут, что такое возможно (и если они будут подозревать их в чем-либо незаконном).
Можно утверждать, что инвесторы BNT в любом случае подвергаются риску, связанному со взломами, атаками и т. п., поэтому эти бэкдоры не играют большой роли. И если этими бэкдорами будут злоупотреблять, с их помощью команда всегда сможет восстановить прежнее состояние.
Но, так как существование этих бэкдоров не освещается должным образом, многие пользователи подвергаются риску, особенно биржи.
Биржи, которые добавляют в список токен BNT, могут не знать, что если ключи команды украдут, вероятно, они не смогут получить доступ к вложенным токенам. Из-за этого возникнут не только проблемы с законодательным регулированием, но и технические риски: обычно биржи не «отслеживают» счета, чтобы проверить, «находятся ли там» токены. Они считают, что если токены были вложены, они остаются на счете, пока их не переместят. Если токены биржи уничтожат (или заблокируют) во время активности на рынке, у биржи возникнет много проблем, так как он не сможет отменить исполненные ордера.
Рекомендации и заключение
Для проекта Bancor: я бы рекомендовал немедленно реструктурировать контракты, чтобы команда не могла свободно блокировать, выпускать или уничтожать токены. Или нужно должным образом сообщить инвесторам и прочим участникам о существовании этих бэкдоров и о том, как снизить риски.
Для бирж: самый безопасный вариант — отложить добавление токена BNT в списки до тех пор, пока команда не удалит бэкдоры. Если это невозможно, то во время внесения средств стоит как минимум информировать пользователей, что их токены могут быть заблокированы или уничтожены командой Bancor, и адаптировать систему для отслеживания состояния этих токенов.
Для будущих краудсейлов: чтобы обеспечить полную прозрачность для потенциальных инвесторов и пользователей, организаторам ICO нужно переводить умные контракты на простой язык и последовательно объяснять, что эти контракты делают. В первую очередь им следует сосредоточиться на различиях между опубликованными условиями и теми, что указаны в контракте. Иногда эти различия существуют.
И для пользователей: всегда читайте контракт перед тем, как его подписывать. Безопасность умных контрактов зависит от пользователей, которые их читают. Если не умеете читать код, найдите того, кто может.
Зачем я это делаю?
Я думаю, что «индустрия блокчейнов» находится в пузыре и от инвесторов в проектах утаивают некоторые подробности. Я хочу, чтобы эта индустрия продолжала процветать. Поэтому моя цель — помочь рынкам в саморегулировании, проливая свет на детали, о которых инвесторам и пользователям следует знать. Я надеюсь, что команда Bancor воспримет эту публикацию как конструктивную критику и поработает над прозрачностью для своего сообщества.
Я планирую и дальше писать просветительские разборы по другим проектам.
Я бы хотел поблагодарить Яира Вейнбергера и Одеда Лейба за помощь в исследовании для этой статьи.
Спасибо за внимание!
Источник: medium.com