Умные контракты в основной сети 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.sol
SimpleToken
StandardToken.sol
is
Наш контракт унаследует множество переменных и функций, которые необходимо переопределить для настройки контракта.
Для завершения нашего проекта 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 для начала отладки контракта на наличие ошибок.
Надеюсь, это поможет вам безбоязненно погрузиться в пошаговую отладку ваших собственных контрактов. Дайте нам знать, как это работает для вас!