Редактор Remix
Редактор Remix — это настоящий комбайн, позволяющий контролировать и оптимизировать написание контракта прямо в браузере без установки дополнительных программ.
В первом уроке мы компилировали наш контракт в Remix. Давайте посмотрим на что еще способен этот редактор.
Откройте сайт http://remix.ethereum.org и скопируйте-всавьте код нашего токена из первого урока. Во вкладке Settings переключите версию Solidity на 0.4.21. А во вкладке Run в поле Environment выберите Javascript VM. В этом поле три варианта. Injected Web3 позволяет соединиться с Метамаском и задеплоить контракт в блокчейн с его помощью, а Web3 Provider позволяет подключиться к локальной ноде http://localhost:8545 или удаленной ноде.
Javascript VM — это виртуальная машина, эмулирующая реальный блокчейн Ethereum. В прошлом уроке мы взаимодействовали с функциями нашего уже задеплоенного в блокчейн контракта с помощью MyEtherWallet, здесь же мы можем взаимодействовать с контрактом без деплоя. Это облегчает тестирование контрактов и поиск ошибок.
Итак, при выборе Javascript VM в поле Account автоматически создаются пять адресов со 100 виртуальными Эфирами на каждом.
Скомпилируйте контракт во вкладке Compile и вернитесь во вкладку Run. Нажмите на красную кнопку Deploy.
Вы увидите что ниже появился список всех функций контракта — розовым цветом отмечены те функции, которые что-либо записывают в блокчейн (transact), бледно-синим те, которые что-либо извлекают (call).
А также появился журнал событий (на сером фоне). В нем записываются подробности каждой транзакции.
Нажмите на name и увидите название токена. Нажмите на totalSupply и отобразится общее кол-во токенов (не забывайте про 18 нулей). И так далее.
Теперь давайте переведем 500 токенов на другой адрес. Переключитесь в поле Account на второй адрес и скопируйте его, затем переключитесь обратно на первый. В поле функции transfer вставьте адрес, поставьте запятую и пробел и введите 500 с 18 нулями. Получиться должно так:
Жмите transfer. В журнале событий можно увидеть подробности транзакции (успешно или нет, комиссия, расход газа и т.д.).
Теперь можно поиграться с безопасностью. На втором аккаунте у нас 500 токенов. Давайте попробуем с него перевести на третий аккаунт 800 токенов, то есть количество, которого у нас нет. Переключитесь в поле Account на третий адрес, скопируйте его и переключитесь назад на второй. В поле transfer введите адрес и 800 с 18 нулями, жмите transfer. В журнале событий вы увидите сообщение об ошибке, при этом комиссия за транзакцию все равно спишется. В функции transfer у нас есть проверка этого:
function transfer(address _to, uint256 _value) public returns (bool ) { require(_to != address(0));//проверить что адрес написан правильно require(balances[msg.sender] >= _value); //проверить что баланс отправителя больше или равен отправляемому кол-ву токнов balances[msg.sender] = balances[msg.sender] - _value; balances[_to] = balances[_to] + _value; emit Transfer(msg.sender, _to, _value); return true; }
Строка require(_to != address(0)) проверяет что адрес соответствует eth-адресу, строка require(balances[msg.sender] >= _value) проверяет что на балансе отправителя больше или равно количеству отправляемых токенов. В старых версиях Solidity вместо require использовалась функция:
if(balances[msg.sender] < _value) throw;
То есть если баланс отправителя меньше отправляемого, то прекратить. Но такую запись упразнили.
Ошибки
Remix помогает нам отслеживать ошибки. Ошибки можно разделить на два типа: критические, из-за которых выполнение контракта невозможно (красные), и советы, помогающие оптимизировать контракт (оранжевые). Уберите точку с запятой в определении переменной uint256 totalSupply_; и заново скомпилируйте контракт. Это критическая ошибка, после которой выполнение контракта невозможно.
Видим крестик и совет на красном поле с предложением по исправлению.
Теперь верните точку с запятой назад, а в функции function totalSupply() public view returns (uint256) уберите модификатор view и снова скомпилируйте контракт.
Видим что Remix советует нам в этой функции использовать модификатор view. Функции с этим модификатором могут только просматривать данные, но ничего не изменять, при этом за просмотр газ не берется. Более подробно про модификаторы поговорим в следующих уроках. Ошибка не является критической, контракт с ней сможет работать.
Мы рассмотрели с вами основы работы в Remix. В следующих уроках по мере изучения Solidity рассмотрим как работать с несколькими файлами, импортировать файлы из Гитхаба и т.д.