Несколько дней назад, чтобы продолжить регистрацию сертификата, я получил электронное письмо от B9Lab с просьбой прислать адрес EOA или адрес контракта, которые представляют меня.

Похоже, это хорошая возможность проверить три пункта в моем списке дел:

1. Напишите свою первую статью о среде

2. Напишите смарт-контракт в Vyper.

3. Проверьте фактическую интеграцию Vyper в среду Truffle.

Начнем этот день с Vyper!

Почему Вайпер

Прежде чем спросить, почему именно Vyper, давайте рассмотрим, что такое смарт-контракт. Это микросервис с некоторыми функциями, которые нужно вызывать для хранения и чтения данных в децентрализованной среде? Да, конечно. Но с нетехнической точки зрения смарт-контракт - это сделка между машиной и остальным миром. Сделка должна работать определенным образом, пока существует сеть.

С учетом этих принципов смарт-контракт должен быть простым для написания, но должен быть легким для чтения.

Из Документа:

Простота для читателя важнее, чем простота для писателя, а простота для читателей с низким уровнем предыдущего опыта работы с Vyper (и низким уровнем предыдущего опыта программирования в целом) особенно важна.

Во-первых, простота означает, что Vyper не имеет: Модификаторов, наследования классов, встроенной сборки, перегрузки функций, перегрузки оператора, рекурсивного вызова, циклов бесконечной длины и Двоичная фиксированная точка.

Установить Vyper

Я использую MacOS, для других ОС нажмите здесь.

Предварительные требования:

  1. Установить Brew
  2. Установить Python ≥ 3.6
  3. Установить npm
  4. Убедитесь, что gmp leveldb установлен с Brew.

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).

Объявите пять общедоступных переменных:

  1. owner - адрес владельца, который создает контракт.
  2. имя и фамилия представляют собой 32-байтовое представление имени и фамилии.
  3. Birth - это int128, представляющий отметку времени рождения. (если я использую отрицательную временную метку - дату до 1970 года, assert birth < block.timestamp отмените мою транзакцию, напишите в комментарии, если знаете почему).
  4. Отметка времени creationTime представляет дату создания удостоверения .

Объявление создания Событие:

Конструктор:

Мы определяем:

  1. общедоступная __init__ функция, которая принимает: имя, фамилию и рождение.
  2. мы проверяем, что параметры нашей функции не пусты (примечание assert not not _firstname равно assert _firstname != 0x000000000000000)
  3. мы определяем наши общедоступные переменные.
  4. мы регистрируем событие 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.

Добавьте momentjs и bluebird:

$ npm install moment bluebird

Теперь протестируем нашу функцию-конструктор:

Чтобы протестировать наш конструктор, у нас есть два основных «блока»:

  1. Случай сбоя: мы проверяем, завершается ли создание контракта (i) с пустым значением и (ii) , если мы отправляем значение в транзакции .
  2. Успешный случай: мы проверяем, есть ли у имени, фамилии, владельца и рождения правильные значения. Обратите внимание, что мы должны преобразовать bytes32 в utf8 с web3.toUtf8() и bigNumber в строку с toString(10)

Тест UpdateFistName:

  1. Случай сбоя: мы проверяем, сбой функции: (i) транзакция с адреса не владельца (ii) новое имя пусто и (iii) новое имя равно старому имени.
  2. Успешный случай: мы проверяем, имеет ли новое имя новое значение.

Резервный тест:

Резервная функция отправляет обратно стоимость транзакции без комиссии за транзакцию, поэтому мы проверяем баланс отправителя в начале и в конце транзакции.

Теперь запустите $ npm run test

Развернуть в основной сети

Теперь мы добавляем наш контракт в основную сеть. Я буду использовать Инфура в качестве провайдера подключения к Ethereum.

Сначала мы должны установить HDWalletProvider для обработки подписи транзакции, а также подключения к сети Ethereum.

$ npm install truffle-hdwallet-provider

Затем в truffle.js нам нужно настроить нашего поставщика кошелька:

  1. мнеморический: это 12 начальных слов вашего кошелька.
  2. infura api key: ключ после регистрации в Infura.
  3. gasPrice: проверьте Eth Gas Station, чтобы узнать текущую цену на газ (N.B. gasPrice - в wei, ethGasStation - в Gwei).

Запустите $ npm run migrate:mainnet

Вот и все. До скорого! :)

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик