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

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

d7820407935d124c83a0ef2cfb6167a0.png


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

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


586c21dc93bac32f890a9088c9e7d75e.jpg
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

dqhs0fcjxkunmngxdqdfmokbose.png

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

npx ganache-cli --port 9545

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

zos push -- network local
56bec432e5833e2d1ec445c42e2a2ddd.png

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

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

4694286ab827949190fe452aeefabdff.png

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

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

7d90603f1e1a29a094584a1d26a2aa22.png

zos update SimpleStorage --network local

8f41df9b999d827ada83964fc1380a18.png

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

npx truffle console -- network=local
truffle(local)> sS = SimpleStorage.at()

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

0c61e6830a5187c57c4c88fc28357bb8.png

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

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


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

© Habrahabr.ru