Статьи

Сведение контрактов и отладка с помощью Remix

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

Remix IDE является наиболее полнофункциональной IDE для Solidity. Среди других инструментов у него есть отличный пошаговый отладчик. Вы можете выполнять различные задачи, такие как перемещение во времени, изменение текущего шага, исследование локальных переменных и текущего состояния путем расширения различных панелей.

Вы также можете установить точки останова для перемещения между различными точками в коде. А терминал позволяет отображать транзакции, выполненные из Remix, и отлаживать их.

В этом руководстве мы будем использовать Truffle и OpenZeppelin для создания простого пользовательского токена. Мы увидим, почему и как сплющить контракт, и, наконец, мы будем использовать Remix IDE, чтобы начать отладку контракта.

Зачем выравнивать смарт-контракт?

Уплощение интеллектуального контракта означает объединение всего кода Solidity в одном файле вместо нескольких исходных файлов, так что вместо импорта импортированный код внедряется в один файл. Нам нужно сгладить умные контракты по разным причинам, например, вручную просмотреть контракт, проверить контракт на Etherscan или отладить контракт с Remix IDE, поскольку в настоящее время он не поддерживает импорт.

Написание простого токена с использованием трюфелей и OpenZeppelin

Remix IDE официально рекомендуется для создания небольших контрактов или для изучения Solidity, но как только вам понадобится создать более крупный контракт или использовать расширенные параметры компиляции, вам придется использовать компилятор Solidity или другие инструменты / среды, такие как Truffle.

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

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

Требования

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

Вам также необходимо установить Node.js 5.0+ и npm в вашей системе. Обратитесь к их странице загрузки для получения инструкций.

Установка трюфеля

Используя ваш терминал, выполните следующую команду для установки Truffle:

npm install -g truffle

Создание нового трюфельного проекта

Начните с создания нового каталога для вашего проекта. Давайте назовем это simpletoken

 mkdir simpletoken
cd simpletoken

Затем создайте фактические файлы проекта, используя:

 truffle init

Эта команда создаст несколько папок, таких как contracts/migrations/

Далее мы установим OpenZeppelin:

 npm install openzeppelin-solidity

Создание простого токенового контракта

Внутри contracts/SimpleToken.sol

 pragma solidity ^0.4.23;

import 'openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol';

contract SimpleToken is StandardToken {
    address public owner;

    string public name = 'SimpleToken';
    string public symbol = 'STt';
    uint8 public decimals = 2;
    uint public INITIAL_SUPPLY = 10000;

    constructor() public {
      totalSupply_ = INITIAL_SUPPLY;
      balances[owner] = INITIAL_SUPPLY;
    }

}

Это контракт, который мы собираемся выровнять и отладить. Мы импортируем контракт OpenZeppelin StandardToken.solSimpleTokenStandardToken.solis

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

Для завершения нашего проекта Truffle в папке migrations/2_deploy_contract.js

 var  SimpleToken = artifacts.require("SimpleToken");
    module.exports  =  function(deployer) {
        deployer.deploy(SimpleToken);
};

Используя этот файл, мы можем развернуть / перенести наш смарт-контракт в блокчейн, но нам на самом деле это не нужно для этого примера, потому что мы собираемся использовать Remix IDE для развертывания смарт-контракта после его выравнивания.

Сглаживание контракта с использованием трюфельного плющилки

Truffle Flattener — это утилита npm, которая выравнивает или объединяет файлы Solidity, разработанные в Truffle, со всеми их зависимостями в правильном порядке.

Во-первых, начните с установки truffle-flattener

 npm install -g truffle-flattener

Затем, внутри вашего проекта Truffle, выполните следующую команду, чтобы сгладить файл SimpleToken.sol

 truffle-flattener contracts/SimpleToken.sol > FlattenedSimpleToken.sol

truffle-flattener Используя оператор >FlattenedSimpleToken.sol

Компиляция и развертывание контракта с использованием Remix IDE

Вы можете получить доступ к своему сплющенному интеллектуальному контракту из файла FlattenedSimpleToken.sol Откройте файл и скопируйте его содержимое.

Затем откройте Remix IDE с https://remix.ethereum.org и вставьте сплющенный смарт-контракт в новый файл в IDE.

Если вы получили сообщение об ошибке: « Макет компилятора: источник не найден» , выберите более новую версию компилятора на вкладке «Настройки»> «Панель версий Solidity»> выберите выпадающий список новой версии компилятора .

Если автоматическая компиляция отключена, нажмите кнопку « Начать компиляцию» на панели « Компиляция» .

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

Ваш контракт развернут и работает на виртуальной машине JavaScript, которая имитирует блокчейн. Теперь мы можем начать отладку по-разному.

Отладка пользовательского токен-контракта

Чтобы увидеть, как мы можем отладить контракт, сначала введем несколько ошибок.

Вы можете начать отладку смарт-контрактов в Remix IDE двумя различными способами, в зависимости от варианта использования.

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

Использование assert ()

SafeMath — это библиотека OpenZeppelin для операций Math с проверками безопасности, которые выдают ошибку. Функция sub(a,b) Первый параметр должен быть больше второго, чтобы мы всегда могли получить положительное число. Функция применяет это правило, используя функцию assert () . Это код для подфункции :

   function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

Пока вы предоставляете значения для a и b, которые проверяют условие b <= a , выполнение продолжается без проблем, но как только вы предоставите значение b, большее, чем a , функция assert () выдаст ошибку, которая говорит:

 VM error: invalid opcode. invalid opcode The execution might have thrown. Debug the transaction to get more information.  

Итак, давайте добавим вызов sub () с неверными параметрами в контракте SimpleToken :

     constructor() public {
      totalSupply_ = INITIAL_SUPPLY;
      balances[owner] = INITIAL_SUPPLY;
      SafeMath.sub(10, 1000);
    }

Если вы повторно развернете контракт, вы получите недействительную ошибку кода операции в терминале:

Неверный код операции

После того, как вы нажмете кнопку « Отладка» , вы попадете на панель « Отладчик», где сможете начать отладку кода.

Панель отладчика

В редакторе кода первая строка / инструкция будет выделена, отмечая, где мы в данный момент находимся в коде.

Первая строка / инструкция выделены

Нажмите на кнопку « Перешагнуть вперед» , чтобы пройти по коду.

Кнопка «шаг вперед»

Вы также можете перейти прямо в исключении, используя кнопку Перейти к исключению .

Перейти к кнопке исключения

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

Остановка на проблеме

Вы можете проверить состояние локальных переменных на текущем шаге.

локальные переменные на текущем шаге

Панель Solidity Locals отображает локальные переменные, связанные с текущим контекстом.

Исходя из исходного кода и локализаций солидности , вы можете сделать вывод, что источник проблемы связан с методом assert (), а значение b больше значения a .

Вы можете остановить отладку, используя кнопку остановки отладки .

Остановить кнопку отладки

Стоит также взглянуть на другие панели отладчика.

инструкции

Панель инструментов

На панели « Инструкции» отображается байт-код отлаженного контракта. Байт-код текущего шага подсвечивается.

Состояние Солидности

Состояние твердости

Панель Solidity State отображает переменные состояния текущего отлаженного контракта.

Панели низкого уровня

Панели низкого уровня

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

Вывод

В этом руководстве мы использовали Truffle и OpenZeppelin для создания простого токена, затем использовали truffle-flattener для выравнивания пользовательского контракта и Remix IDE для начала отладки контракта на наличие ошибок.

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