Zeppelin OS — ещё один шаг к безопасным смарт-контрактам

    Ethereum сейчас одна из самых популярных платформ для создания децентрализованных приложений, которая активно развивается. Одно из новшеств Zeppelin мы сегодня попробуем своими руками. А для тех кто в «танке», Zeppelin — это компания, занимающаяся разработкой и проверкой безопасности смарт-контрактов. Библиотека смарт-контрактов OpenZeppelin их самый известный продукт. 



    Так вышло, что инструменты разработки для Solidity ещё только развиваются, порой не позволяя разработчикам использовать всю мощь технологии смарт-контрактов. Например, ограничением являются «стандартные библиотеки», так как каждый раз в сеть перезаливается уже существующий код, что приводит к увеличению стоимости «развёртывания» кода и количества потенциальных ошибок. Всё это ведёт к существенным ограничениям в создании больших и многофункциональных децентрализованных приложений.


    Какой такой zeppelin OS?




    Zeppelin OS — это open source платформа, состоящая из инструментов и сервисов над EVM, предназначенная разработки и управления децентрализованными приложениями. 


    Команда Zeppelin выделила четыре наиболее важные компоненты, часть из которых уже реализована и доступна для использования.


    • Zeppelin OS Kernel — обновляемое и управляемое сообществом «ядро» платформы. Состоит из набора библиотек в блокчейне, которые разработчики могут подключить к своим проектам. Первопроходцем стал OpenZeppelin, который уже доступен для использования. 
    • Zeppelin OS Scheduler позволит контрактам запрашивать асинхронное исполнение функции, а также даст возможность любому участнику оплачивать расходы по газу, получая за это вознаграждение.
    • Zeppelin OS Marketplace — важная составляющая взаимодействия между контрактами и приложениями, своего рода App Store / Google Play для блокчейна. Позволит использовать другие сервисы для создания более сложных приложений.
    • Zeppelin OS off-chain tools — набор инструментов для работы и анализа децентрализованных приложений.

    Время пробовать самим!


    Очень хотелось начать работать с Zeppelin OS, написать первый контракт и обновить его. Проверить, так ли всё на самом деле и не обманули ли разработчики.


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


    Всю документацию Zeppelin OS можно посмотреть тут. Для начала нужно установить zos: 


    $ npm install --global zos

    Теперь создадим директорию проекта и все необходимое для него:


    $ mkdir zostest && cd zostest
    $ npm init
    $ zos init zostest

    После чего будут созданы все необходимые конфигурационные файлы, так что теперь можно переходить к написанию контрактов. В качестве тестового контракта давайте напишем небольшое «хранилище переменных»:


    pragma solidity 0.4.24;
    import "zos-lib/contracts/migrations/Migratable.sol";
    
    contract SimpleStorage is Migratable {
        uint storedData;
    
        function initialize(uint256 _x) isInitializer("SimpleStorage", "0") public {
            storedData = _x;
        }
    
        function get() public constant returns (uint) {
            return storedData;
        }
    }

    Компилируем и добавляем наш контракт:


    $ zos add SimpleStorage



    Запускаем тестовую сеть (в отдельном терминале):


    $ npx ganache-cli --port 9545

    Пушим в нашу локальную сеть, при этом создается новый конфигурационный файл zos.local.json:


    $ zos push --network local



    Дело за малым, осталось создать наш обновляемый контракт, попутно запустить initialize() с аргументом 88 для нашего «хранилища»:


    $ zos create SimpleStorage --init initialize --args 88 --network local



    Теперь попробуем добавить функцию увеличения переменной в «хранилище», например, такую:


    pragma solidity 0.4.24;
    import "zos-lib/contracts/migrations/Migratable.sol";
    
    contract SimpleStorage is Migratable {
        uint storedData;
    
        function initialize(uint256 _x) isInitializer("SimpleStorage", "0") public {
            storedData = _x;
        }
    
        function incrementStorage(uint256 _x) public {
            storedData += _x;
        }
    
        function get() public constant returns (uint) {
            return storedData;
        }
    }

    После чего надо обновить контракт в сети:


    $ zos push --network local



    $ zos update SimpleStorage --network local



    Теперь можно посмотреть, что же вышло. Для этого воспользуемся truffle console:


    $ npx truffle console --network=local
    truffle(local)> sS = SimpleStorage.at(<proxy-address>)

    А <proxy-address> можно посмотреть в zos.local.json в соответствующей графе, и проверим, что там у нас лежит в «хранилище» и можем ли мы увеличивать переменную:




    Всё работает здорово, есть много возможностей для тестирования контрактов. Я бы сказал, что Zeppelin OS можно использовать, как инструмент разработки точно. 


    Что же мы наделали?


    Мы проверили, что с помощью Zeppelin OS можно деплоить, обновлять, компилировать и тестировать контракты. Кажется, это отличный инструмент для тех, кому нравится работать с командной строкой, а от Remix в браузере бросает в дрожь. Плюс можно рекомендовать начать знакомство с Solidity и смарт-контрактами именно с этого проекта.

    • +20
    • 3.3k
    • 6
    Ростелеком-Солар
    403.53
    Безопасность по имени Солнце
    Share post

    Comments 6

      –1
      Etherum ратёт. Нет не только в плане инфраструктуры библиотек, но и в количестве проектов на нём. Паралич сети наступает внезапно, с каждым новым проектом, потом конечно всё рассасывается, но ненадолго. Высокую нагрузку сеть не держит…
        0
        Безопастность увеличивается из-за лучшего тестирования стандартных библиотек или есть еще какие-то механизмы?
          0
          truffle(local)> sS = SimpleStorage.at(<proxy-address>)

          А <proxy-address> можно посмотреть в zos.local.json в соответствующей графе, и проверим, что там у нас лежит в «хранилище» и можем ли мы увеличивать переменную:

          у меня на этом этапе выдает ошибку «invalid address» на любой адрес. Можете пояснить более подробно, где какой адрес смотреть?
            +1
            Gargo как вводите адрес?
              0
              Gargo cкорее всего неправильно вводите адрес. Его нужно вводить в ковычках( " " ). А сам адрес лежит в `zos.local.json`:
              ```
              «proxies»: {
              «SimpleStorage»: [
              {
              «address»: "<proxy-address>",
              «version»: «code-version»,
              «implementation»: «current-implementation»
              }
              ]
              },
              ```
              Сообщите, пожалуйста, все ли получилось?
                0
                The state mutability modifier «constant» was removed in version 0.5.0. Use «view» or «pure» instead.

                и

                Could not find zos-lib/contracts/migrations/Migratable.sol

                Only users with full accounts can post comments. Log in, please.