- PVSM.RU - https://www.pvsm.ru -
Смарт-контракты Ethereum, если верить официальному сайту [1], выполняются «в точности так, как запрограммированы, без какой-либо возможности простоя, цензуры, мошенничества или вмешательства третьей стороны». Сегодня я попробую разобраться, так ли всё радужно на самом деле, рассмотрев некоторые проблемы, с которыми пользователи смарт-контрактов сталкиваются на практике.
В конце статьи я резюмирую свои размышления краткой инструкцией по написанию безопасных смарт-контрактов.

Речь пойдёт о проблемах, с которыми в итоге сталкиваются разработчики смарт-контрактов, а не о безопасности самой платформы (хотя немного и о ней). Условно разделим эти проблемы на следующие типы:
Под проблемами в коде смарт-контракта здесь я подразумеваю такие проблемы, которые решаются редактированием .sol-файла. Это, в частности:
required. При этом для того чтобы поменять required (например, на единицу, чтобы дальше самому подписывать транзакции), достаточно подписи только одного из владельцев: 



Проблемы в коде непосредственно приводят к атакам и потере средств. Хорошая новость в том, что проблемы в коде можно выявить в процессе аудита и устранить. При этом важно понимать, откуда они берутся, чтобы избежать их в дальнейшем. Поэтому переходим к следующему пункту.
Проблемы в коде обусловлены в первую очередь неправильно выстроенным процессом разработки. Казалось бы, разработка ПО — дело давно изученное, с устоявшимися best practices. Тем не менее, молодость области смарт-контрактов, непропорционально большие деньги и хайп приводят к тому, что люди по тем или иным причинам пренебрегают стандартными процедурами, что часто приводит к серьёзным проблемам. Из самого типичного стоит упомянуть:
Добавляет дёгтя сам язык Solidity. Изначально он был создан скорее для того, чтобы его могли быстро освоить большое количество людей, чем для того, чтобы на нём было удобно писать безопасные смарт-контракты. Вот лишь некоторые его особенности, которые мешают безопасности:
using for, call/delegate call — всё это запускает код не из текущего исходника, а значит, снижает читаемость и, как следствие, безопасность кода.Понятно, что проект Ethereum развивается, и невозможно всё учесть заранее. Но в итоге разработчики вынуждены помнить о многих особенностях и пользоваться костылями [8], чтобы сделать свой смарт-контракт безопасным.
Однако самая серьёзная проблема ещё глубже — в том, что многие недостаточно хорошо понимают, для чего смарт-контракты нужны, что они могут, чего не могут и как работают. В худшем случае это приводит к тому, что смарт-контракт:
Не смарт:
Не контракт:
Пример из жизни: владелец контракта может произвольно менять капитализацию, курс и продолжительность продажи токена:


Что же в итоге? Хотели модно, безопасно, блокчейн, а получаем дорогой неподдерживаемый код, который угрожает безопасности и вообще не нужен. Хотели, чтобы наши смарт-контракты выполнялись «в точности так, как запрограммированы, без какой-либо возможности простоя, цензуры, мошенничества или вмешательства третьей стороны», и в итоге они действительно выполняются так, как написаны — только написаны они с уязвимостью. И нам остаётся лишь помахать ручкой своим средствам. Ну или сделать хардфорк [9] (тем самым вообще-то дискредитировав саму исходную идею), если из-за уязвимости потеряли деньги в том числе создатели Ethereum.

На самом деле, конечно же, всё не так плохо. Я просто сгущаю краски в попытках обратить внимание на некоторые важные, на мой взгляд, моменты. В целом же область развивается, люди учатся, в том числе и безопасности.
Если же читатель решит-таки написать смарт-контракт, я бы посоветовал:
Следуя этим простым рекомендациям, можно избежать большинства описанных выше проблем (от хардфорка, впрочем, это всё равно не спасёт).
Автор: discovan
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/282751
Ссылки в тексте:
[1] официальному сайту: https://ethereum.org/
[2] работам Nick Szabo: https://twitter.com/TokenHash/status/1000429668539908096
[3] Solidity: http://solidity.readthedocs.io/en/v0.4.21/
[4] re-entrancy: http://solidity.readthedocs.io/en/v0.4.24/security-considerations.html#re-entrancy
[5] проэксплуатированные: https://en.wikipedia.org/wiki/The_DAO_(organization)
[6] Solium: https://github.com/duaraghav8/Solium
[7] Solhit: https://github.com/protofire/solhint
[8] костылями: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
[9] сделать хардфорк: https://www.cryptocompare.com/coins/guides/the-dao-the-hack-the-soft-fork-and-the-hard-fork/
[10] Truffle: http://truffleframework.com/
[11] Remix: https://remix.ethereum.org/
[12] SmartCheck: https://tool.smartdec.net/
[13] Источник: https://habr.com/post/412559/?utm_campaign=412559
Нажмите здесь для печати.