Статьи

Качественный код солидности с OpenZeppelin и друзьями

Учитывая тот факт, что все вычисления Эфириума должны быть воспроизведены на всех узлах сети, вычисления Эфириума по своей природе являются дорогостоящими и неэффективными. (На самом деле, разработчики Ethereum на GitHub утверждают, что от Ethereum не следует ожидать большей вычислительной мощности, чем от телефона 1999 года.)

Таким образом, безопасность на виртуальной машине Ethereum — то есть безопасность интеллектуальных контрактов, развернутых на блокчейне Ethereum — имеет первостепенное значение. Все ошибки на нем стоят реальных денег — будь то ошибки, вызванные плохо написанными контрактами, или хакеры, использующие лазейки в контрактах, как в хорошо известном хаке DAO, что привело к расколу сообщества и появлению блокчейна Ethereum Classic.

Полнота Тьюринга — и целый ряд других дизайнерских решений, которые сделали Ethereum намного более способным и изощренным — стали дорогостоящими. Богатство Ethereum сделало его более уязвимым для ошибок и хакеров.

Чтобы добавить к проблеме, умные контракты, развернутые в Ethereum, не могут быть изменены. Блокчейн является неизменной структурой данных.

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

Давайте посмотрим на некоторые удивительные обновления нашего набора инструментов, которые мы можем использовать сегодня, чтобы использовать лучшие практики, которые может предложить среда Solidity.

Вспомогательные инструменты

Одним из самых крутых инструментов в наборе инструментов разработчика Ethereum является библиотека OpenZeppelin. Это фреймворк, состоящий из множества шаблонов кода Solidity и модулей смарт-контрактов, написанных безопасным способом. Авторы являются аудиторами и консультантами Solidity, и вы можете прочитать о стороннем аудите этих модулей здесь . Мануэль Араоз из Zeppelin Solutions, аргентинской компании, которая стоит за OpenZeppelin, обрисовывает в общих чертах основные схемы и аспекты безопасности Solidity.

OpenZeppelin зарекомендовал себя как отраслевой стандарт для многоразовой и безопасной базы кода Solidity с открытым исходным кодом (MIT), которую можно легко развернуть с помощью Truffle . Он состоит из интеллектуальных контрактов, которые после установки через npm могут быть легко импортированы и использованы в наших контрактах.

Процесс установки трюфеля

В Truffle Framework опубликовано руководство по использованию OpenZeppelin с Truffle и Ganache .

Эти контракты предназначены для импорта, а их методы должны быть переопределены по мере необходимости. Файлы не должны быть изменены сами по себе.

Шаблоны ICO

Библиотека OpenZeppelin содержит набор контрактов для публикации токенов на платформе Ethereum — для токенов ERC20 , включая контракт BasicToken, BurnableToken, CappedToken. Это минимальный токен с фиксированным ограничением, MintableToken, PausableToken, с помощью которого можно приостанавливать передачу токенов. Затем есть TokenVesting, контракт, который может постепенно освобождать свой токен-баланс, как типичная схема наделения, с периодом обрыва и наделения , и многое другое.

Также есть набор контрактов на токены ERC721 — или не являющиеся взаимозаменяемыми, уникальные токены типа CryptoKitties.

Контракты токенов ERC827 , стандартные для отправки данных вместе с транзакционными токенами, также включены .

Существует также ряд краудсейл-контрактов — контрактов на проведение Первоначального предложения монет. Они могут регистрировать покупки , доставлять / выдавать токены покупателям, пересылать средства ETH . Есть функции для проверки и обработки покупок токенов.

Контракт FinalizableCrowdsale предусматривает использование некоторой логики после продажи. PostDeliveryCrowdsale позволяет заморозить снятие средств до конца краудсейла. RefundableCrowdsale — это расширение контракта Crowdsale, которое добавляет цель финансирования и возможность для пользователей получить возмещение, если цель не достигнута .

Разрушаемые контракты могут быть уничтожены владельцем, и все средства отправляются владельцу. Существуют также договоры об осуществлении алиментов на детей .

OpenZeppelin предоставляет множество помощников и утилит для проведения ICO — например, контракт, который позволяет восстанавливать токены ERC20, ошибочно отправленные на адрес ICO вместо ETH. Наследственный договор предусматривает передачу права собственности другому владельцу при определенных обстоятельствах. Контракт на владение имеет адрес владельца и предоставляет основные полномочия / разрешения и передачу права собственности.

Контракт RBAC предоставляет утилиты для управления доступом на основе ролей. Мы можем назначать разные роли разным адресам с неограниченным количеством ролей.

Zeppelin также предоставляет пример начального краудсейл-проекта Truffle, который еще не прошел аудит, поэтому его лучше всего использовать как введение в использование OpenZeppelin. Это позволяет легко начать с краудсейла и токена.

ZeppelinOs

Диаграмма ZeppelinOS

ZeppelinOsэто децентрализованная платформа инструментов и сервисов с открытым исходным кодом на основе EVM для безопасной разработки приложений для интеллектуальных контрактов и управления ими .

По сути, это своего рода промежуточный слой поверх EVM, который будет на шаг дальше, чем текущая среда OpenZeppelin. Решения Zeppelin Solutions здесь позволяют разработчикам включить изменяемость для своего развернутого кода с помощью шаблонов обновления . Те, кто пишет умные контракты для EVM, знают, что одной из проблем / ограничений является неизменность развернутых контрактов: однажды в блокчейне контракты не могут быть изменены. Это одна из вещей, которые делают обещание ZeppelinOs интересным.

До сих пор, чтобы «обновить» контракт, нужно было развернуть два контракта — один в качестве прокси с интерфейсом, а другой в качестве реализации. Будут вызваны функции прокси, перенаправляющие запросы к реализации. Затем, если требуется изменение, реализация отключается в прокси-сервере (другая реализация перенаправляется, и, по желанию, исходная версия уничтожается функцией suicide

Мы ждем, чтобы сообщество приняло ZeppelinO в будущем. Решения Zeppelin уже называют некоторых нетривиальных игроков, таких как OpenBazaar, district0x, storj.io, теми, кто использует ZeppelinO.

ZeppelinOS назван

Трюфельные коробки

Truffle Framework — это среда разработки, среда тестирования и конвейер активов для Ethereum. Это наиболее полный набор инструментов, пользующийся наибольшей популярностью среди разработчиков Ethereum. Экосистема Truffle включает в себя несколько блоков Truffle — шаблонов, которые включают в себя интерфейсный код JavaScript, контракты Solidity и утилиты рабочих процессов, такие как стандартный шаблон веб-пакета с его набором инструментов — миграции, тесты, конвейер сборки и т. Д. Truffle Box может содержать целые начальные приложения.

Некоторые из официально поддерживаемых коробок:

Ящики, созданные сообществом, также содержат шаблоны для интеграции контрактов с мобильными приложениями / Status IM , или предоставляют шаблоны Angular и Vue.js и т. Д.

Эти блоки интегрированы с Truffle, поэтому мы начинаем с них, выполняя такие команды, как truffle unbox reactReact и установят ее зависимости локально.

TokenMarket

TokenMarket — еще одна компания, которая опубликовала хранилище контрактов Solidity и инструментов для управления продажами токенов / ICO. Это компания с ограниченной ответственностью, зарегистрированная в Гибралтаре, которая консультирует ICO. Он был удостоен звания «Лучший консультант ICO» на Всемирном саммите по криптовалюте в Берлине в 2018 году

В репозитории ICO Tokenmarket на GitHub говорится, что одна из его целей / принципов разработки — использовать или опираться на существующие контракты OpenZeppelin, называя их золотым стандартом контрактов Solidity. Исходя из этого, большая часть кодовой базы ICO TokenMarket основана на кодовой базе OpenZeppelin, а затем основывается на ней (путем наследования от нее в режиме ООП).

TokenMarket регулярно (старается) идти в ногу со своей исходной кодовой базой OpenZeppelin. Это добавляет больше к этому, хотя, например, следующее:

  • Контракт AMLtoken : это дает Владельцу возможность вернуть токены от участника до того, как токен будет выпущен после того, как участник потерпел неудачу в длительном процессе AML .
  • Gnosis Wallet : в основном кошелек с несколькими подписями, который требует согласия нескольких сторон для определенных транзакций.
  • централизованно выданный токен контракт.
  • KYCCrowdsale : контракт, который позволяет только инвесторам, которые не являются анонимными.
  • Перезапущенный контракт Crowdsale : восстанавливает предыдущий Crowdsale и позволяет изменять некоторые параметры.
  • Ценообразование на этапах : этот контракт предусматривает ценообразование на основе этапов и предварительные сделки ICO.

Хотя в репозиториях, о которых мы здесь говорим, много кода, EVM завершен по Тьюрингу, так что все эти различные контракты, даже удаленно, не исчерпывают своих полных возможностей. При условии, что система — Ethereum — выживет и будет конкурентоспособной, с достаточным количеством людей в сети, мы можем рассчитывать на гораздо большую гибкость в том, что пытаются решить эти контракты блокчейн.

ConsenSys

Consensys Ventures — швейцарская венчурная / инвестиционная компания, которая позиционирует себя как инвестиционная компания « ангел / семя» в децентрализованном пространстве — и это, в частности, означает пространство Ethereum. Помимо других ресурсов, которые они предлагают своим компаниям-протеже, они составили небольшой небольшой сборник лучших практик для умных контрактов Ethereum . Хотя в общих чертах это не код, он все же содержит множество хороших и плохих примеров кода Solidity.

В основном речь идет о лучших практиках безопасности интеллектуальных контрактов Solidity.

Полный список тем выходит за рамки этой статьи, поскольку этот ресурс является исчерпывающим и заслуживает прочтения даже для того, чтобы напомнить разработчику умных контрактов обо всем, что им необходимо учитывать при написании программного обеспечения для EVM. И это особенно актуально, если писать программы с нуля (не полагаясь на уже созданный и проверенный код, такой как OpenZeppelin).

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

Далее идут предупреждения о конкретных токенах, предупреждения, относящиеся к стандартам токенов, методикам разработки программного обеспечения, инструментам безопасности — для статического анализа, тестирования, линтеров и т. Д.

Они также перечисляют известные атаки, в том числе те, которые включают вызов внешнего кода и контрактов, функции, которые могут вызываться неоднократно в таких случаях, проблемы повторного входа, условия межфункциональной гонки. Здесь они анализируют целый ряд проблем, некоторые из которых проявились в взломать DAO .

Кроме того, они упоминают зависимость упорядочения транзакций, временную метку, целочисленное переполнение и недополнение, различные возможности / точки DoS-атак, такие как DoS с ограничением блокирующего газа, а затем принудительная отправка Ether на контракт; и они также анализируют исторические и устаревшие атаки. Определенно прочитайте их документы.

Вывод

В этом введении в экосистему мы рассмотрели некоторые из доступных ресурсов для написания хороших, готовых к производству интеллектуальных контрактов на виртуальной машине Ethereum. Это включает в себя как повторное использование уже проверенного, проверенного кода (OpenZeppelin заявляет, что по их контрактам работает криптовалюта стоимостью более 4 миллиардов долларов), так и практические ресурсы для изучения написания собственного безопасного, готового к работе программного обеспечения.

Мы уверены, что список еще не завершен. Мы что-то упустили, стоит упомянуть? Дайте нам знать!