Несколько дней назад, чтобы продолжить регистрацию сертификата, я получил электронное письмо от B9Lab с просьбой прислать адрес EOA или адрес контракта, которые представляют меня.
Похоже, это хорошая возможность проверить три пункта в моем списке дел:
1. Напишите свою первую статью о среде
2. Напишите смарт-контракт в Vyper.
3. Проверьте фактическую интеграцию Vyper в среду Truffle.
Начнем этот день с Vyper!
Почему Вайпер
Прежде чем спросить, почему именно Vyper, давайте рассмотрим, что такое смарт-контракт. Это микросервис с некоторыми функциями, которые нужно вызывать для хранения и чтения данных в децентрализованной среде? Да, конечно. Но с нетехнической точки зрения смарт-контракт - это сделка между машиной и остальным миром. Сделка должна работать определенным образом, пока существует сеть.
С учетом этих принципов смарт-контракт должен быть простым для написания, но должен быть легким для чтения.
Из Документа:
Простота для читателя важнее, чем простота для писателя, а простота для читателей с низким уровнем предыдущего опыта работы с Vyper (и низким уровнем предыдущего опыта программирования в целом) особенно важна.
Во-первых, простота означает, что Vyper не имеет: Модификаторов, наследования классов, встроенной сборки, перегрузки функций, перегрузки оператора, рекурсивного вызова, циклов бесконечной длины и Двоичная фиксированная точка.
Установить Vyper
Я использую MacOS, для других ОС нажмите здесь.
Предварительные требования:
Vyper все еще находится в бета-версии, поэтому мы установим его в виртуальной среде Python.
Виртуальная среда:
$ sudo apt install virtualenv $ virtualenv -p python3.6 — no-site-packages ~/vyper-venv $ source ~/vyper-venv/bin/activate
Vyper:
$ git clone https://github.com/ethereum/vyper.git $ cd vyper $ make $ make test
Настройка проекта
Мы будем использовать параметр init
в Truttle, чтобы построить наш проект.
Сначала мы должны установить Truffle:
$ npm install -g truffle
Создайте и переместите в новую папку:
$ mkdir identity-test && cd identity-test
Запустить проект:
$ truffle init
Написать договор удостоверения личности
Цель проекта - написать базовый идентификационный контракт, который будет отражать меня. Моя основная личность состоит из: имени, фамилии и возраста, не более и не менее этого.
В папке контракты создайте файл с именем Identity.v.py (да, мы можем использовать подсветку синтаксиса python).
Объявите пять общедоступных переменных:
- owner - адрес владельца, который создает контракт.
- имя и фамилия представляют собой 32-байтовое представление имени и фамилии.
- Birth - это int128, представляющий отметку времени рождения. (если я использую отрицательную временную метку - дату до 1970 года,
assert birth < block.timestamp
отмените мою транзакцию, напишите в комментарии, если знаете почему). - Отметка времени creationTime представляет дату создания удостоверения .
Объявление создания Событие:
Конструктор:
Мы определяем:
- общедоступная __init__ функция, которая принимает: имя, фамилию и рождение.
- мы проверяем, что параметры нашей функции не пусты (примечание
assert not not _firstname
равноassert _firstname != 0x000000000000000
) - мы определяем наши общедоступные переменные.
- мы регистрируем событие Creation
Функция обновления имени:
Здесь мы обновляем firstname, если: (i) не пусто, (ii) транзакция от владельца и (iii) новое имя не совпадает со старым. В конце возвращаем обратно новое имя.
Резервная функция:
Резервные функции запускаются, когда подпись функции не соответствует ни одной из доступных функций или когда кто-то пытается отправить эфир в наш контракт.
Если кто-то попытается отправить эфир на наш контракт, мы отправим его обратно.
Интеграция трюфелей
Truffle еще не поддерживает контракты Vyper, поэтому нам нужен инструмент для компиляции Vyper в совместимые с Truffle артефакты. Truper спаси нас!
Установите Truper:
$ npm install -g truper
Создайте файл пакета:
$ npm init
В поле scripts добавьте следующие скрипты:
"scripts": { "build:sol": "truffle compile", "build:vyper": "truper", "build": "npm run build:sol && npm run build:vyper", "console": "truffle console", "migrate:ganache": "truffle migrate --network ganache", "migrate:mainnet": "truffle migrate --network mainnet", "test": "truffle test" },
Теперь мы можем запустить задачу сборки для сборки vyper и solidity контракта в папку / build (N.B. не забудьте запустить ее в virtualenv).
$ npm run build
Тестовое задание
Одна из самых интересных особенностей нашей интеграции Truffle заключается в том, что мы можем легко протестировать наш код.
Создайте новый файл Identity.test.js в папке test.
$ npm install moment bluebird
Теперь протестируем нашу функцию-конструктор:
Чтобы протестировать наш конструктор, у нас есть два основных «блока»:
- Случай сбоя: мы проверяем, завершается ли создание контракта (i) с пустым значением и (ii) , если мы отправляем значение в транзакции .
- Успешный случай: мы проверяем, есть ли у имени, фамилии, владельца и рождения правильные значения. Обратите внимание, что мы должны преобразовать bytes32 в utf8 с
web3.toUtf8()
и bigNumber в строку сtoString(10)
Тест UpdateFistName:
- Случай сбоя: мы проверяем, сбой функции: (i) транзакция с адреса не владельца (ii) новое имя пусто и (iii) новое имя равно старому имени.
- Успешный случай: мы проверяем, имеет ли новое имя новое значение.
Резервный тест:
Резервная функция отправляет обратно стоимость транзакции без комиссии за транзакцию, поэтому мы проверяем баланс отправителя в начале и в конце транзакции.
Теперь запустите $ npm run test
Развернуть в основной сети
Теперь мы добавляем наш контракт в основную сеть. Я буду использовать Инфура в качестве провайдера подключения к Ethereum.
Сначала мы должны установить HDWalletProvider для обработки подписи транзакции, а также подключения к сети Ethereum.
$ npm install truffle-hdwallet-provider
Затем в truffle.js нам нужно настроить нашего поставщика кошелька:
- мнеморический: это 12 начальных слов вашего кошелька.
- infura api key: ключ после регистрации в Infura.
- gasPrice: проверьте Eth Gas Station, чтобы узнать текущую цену на газ (N.B. gasPrice - в wei, ethGasStation - в Gwei).
Запустите $ npm run migrate:mainnet
Вот и все. До скорого! :)
Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик