Приключения в классическом эфире

1_Hwcma5SZlYzXJXifg3dp2w

Практическое руководство по созданию простого контракта для Ethereum Classic и записи его в блокчейн.

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

Об Ethereum Classic я узнал сразу после атаки на DAO и был его сторонником после разделения блокчейна, поддерживая идеалы неизменяемости записей в блокчейне. С тех пор я стал участником ETC комьюнити.

Мне хотелось создать смарт-контракт на блокчейне Ethereum Classic, чтобы лучше понять, как это работает. Для нижеприведённого руководства я решил создать простой смарт-контракт для регистрации товарного знака. Он будет автоматически проверять названия зарегистрированных торговых марок, и регистрировать новую в случае, если нужное имя свободно. Пользователи также будут иметь возможность узнать автора зарегистрированного товарного знака.

Кажется, ничего сложного. Давайте попробуем!

Примечание: Это руководство требует некоторых базовых знаний в области блокчейн-технологии и смарт-контрактов на EVM. Более подробно они описаны здесь.

В своём эксперименте я буду пользоваться средой разработки Truffle. Она позволяет локально тестировать, запускать и отлаживать смарт-контракты при помощи любых эмуляторов терминала.

Также нам понадобится клиент для соединения с сетью. Для простоты эксперимента воспользуемся сервисом ganache-cli.

Во-первых, нам нужно установить ganache и запустить его:

$ npm install -g ganache-cli
$ ganache-cli

Запуск ganache-cli позволяет установить клиент Ethereum локально, что ускорит процесс создания приложений на блокчейне.

Теперь запустите ganache-cli в одном из окон терминала. Введите порт и хост, к которому он подключен, в окне терминала:

Listening on 127.0.0.1:8545
net_version
eth_accounts

Отлично, теперь наш клиент Ethereum работает локально!

Теперь сделаем небольшую подготовку к проекту. Мы начнём с создания директории и запуска truffle:

$ npm install -g truffle
$ mkdir trademark-contract && cd trademark-contract
$ truffle init

Ok, мы установили truffle. Давайте убедимся, что наш truffle может взаимодействовать с ganache client, который у нас запущен. Вы можете использовать любую IDE или текстовый редактор для кодинга. Я выбрал vim.

$ vim truffle.js

Замените содержимое файла следующим кодом:

module.exports = {
networks: {
development: {
host: “localhost”,
port: 8545,
network_id: “*”,
}
}
};

Мы использовали порт и хост, указанные при запуске ganache-cli ранее.

Убедимся, что всё работает с помощью следующего кода:

$ truffle console
truffle(development)>

Если всё нормально, то вы увидите в терминале запись такого вида: truffle(development)> С помощью команды .exit выйдите из консоли разработчика truffle.

Теперь, когда окружение полностью настроено, перейдём к созданию смарт-контракта!

Мы будем использовать общепринятый для создания смарт-контрактов язык Solidity.

Примечание: Для отправки смарт-контракта в сеть ETC, при компилировании должна использоваться версия Solidity не позднее 0.4.2. Вместе с Truffle устанавливается последняя версия Solidity, которая не подходит для наших целей. Для простоты, я покажу, как создать и протестировать наш смарт-контракт в Truffle, а затем изменю версию Solidity и отправлю смарт-контракт в сеть Ethereum Classic.

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

Я нашёл код для такого смарт-контракта в репозитории GitHub.

Начнём с написания версии смарт-контракта для solidity:

pragma solidity ^0.4.19;

Примечание: Мы используем символ ^ в качестве указания, что используется версия Solidity 0.4.19 или выше, для того, чтобы текущая версия Truffle смогла его скомпилировать. При компиляции для Ethereum Classic мы удалим символ ^.

Добавим код скелета для нашего смарт-контракта:

contract TradeMarkRegistration {}

Отлично, у нас уже есть пустой контракт. Теперь давайте подумаем о том, чем нам его заполнить. Нам нужна структура товарного знака, в которой будут зарегистрированы название, имя автора, отметка времени и доказательство товарного знака.

Внутри фигурных скобок напишем:

struct TradeMark {
string phrase;
string authorName;
uint256 timestamp;
bytes32 proof;
}

Затем нам нужно создать карты доказательства того, есть ли такое название в нашей карте. Также нам нужно создать карту доказательства названия в структуре товарного знака. Ещё нам понадобятся две функции. Одна – для проверки того, зарегистрирован ли товарный знак в нашей карте, и вторая – для создания доказательства для нашего названия. Для функции доказательства мы будем просто использовать генератор хэшей sha256.

mapping (bytes32 => bool) private trademarkLookup;
mapping (bytes32 => TradeMark) public trademarkRegistry;

function checkTradeMark(string phrase) constant returns (bool) {
bytes32 proof = phraseProof(phrase);
return trademarkLookup[proof];
}

function phraseProof(string phrase) constant returns (bytes32) {
return sha256(phrase);
}

Функции здесь очень простые. checkTradeMark сначала генерирует доказательство названия, затем проверяет, есть ли она в карте trademarkLookup и возвращает логическое значение. phraseProof хэширует фразу с помощью хэш функции sha256.

Обратите внимание на команду constant рядом с этими функциями. Она означает, что функция не должна изменять ничего в блокчейне или контракте (и она вообще не использует газ). Она только выполняет простые статичные задания, такие как генерирование хэша или выполнения простого поиска.

Теперь создадим функцию для регистрации товарного знака:

function registerTradeMark(string document, string author)
returns (bool) {
if (checkTradeMark(document) == false) {
bytes32 proofHash = phraseProof(document);
TradeMark memory trademark = TradeMark({
phrase: document,
authorName: author,
timestamp: now,
proof: proofHash
});
trademarkLookup[proofHash] = true;
trademarkRegistry[proofHash] = trademark;
return true;
}
return false;
}

Эта функция просто выдаёт данные зарегистрированного товарного знака и возвращает их из созданной структуры.

Отлично, мы только что создали смарт-контракт! Теперь давайте его скомпилируем и отправим в сеть.

В терминале напишите внутри директории:

$ truffle compile
Compiling TradeMarkRegistration.sol…
Compiling Migrations.sol…
Writing artifacts to ./build/contracts

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

Теперь давайте отправим наш смарт-контракт:

$ truffle migrate

Используя «разработку» сети:

Running migration: 1_initial_migration.js
Deploying Migrations…
… 0x67927682a4f832b72fbce053fc90f55249f41c4ae50af65ef537e134ca4fc43c
Migrations: 0xc85fa4542d77675b4e05253456cbd3d579f5e4de
Deploying TrademarkRegistration…
… 0x26ac51700167a9ed91ced3f21f54c6ec4d5250cce8e9f647229903a9f15aea52
TrademarkRegistration: 0x2552fd4d9736ab3e147deb7e87b82758c87a3aa6
Saving successful migration to network…
… 0x1430e29094b1281ee0468b6132fa2b14e88c017239831aa10cd56e3233444e6b
Saving artifacts…
Running migration: 2_deploy_contracts.js
Replacing TrademarkRegistration…
… 0x671942c306680d3d788852f8797a5521c8558057e19d9a948d0d9c1b711e1ddd
TrademarkRegistration: 0x50c74ff65ccd8a12c8e4757a3268671ec67918cf
Saving successful migration to network…
… 0xaecd9a087edf24b70c1a1963e00ffded813b4244bae5383203422e9f1e46fd45
Saving artifacts…

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

$ truffle console
truffle(development)>

Обратимся к смарт-контракту, создав переменную, отсылающую к его адресу:

truffle(development)> var trademark = TrademarkRegistration.at(TrademarkRegistration.address)
undefined
truffle(development)> trademark.address
‘0x50c74ff65ccd8a12c8e4757a3268671ec67918cf’

Прекрасно, у нас есть адрес нашего смарт-контракта. Теперь обратимся к нашим функциям и проверим название товарного знака. Для этого примера возьмём следующее название: “ETC Take My Energy”, а автором будет “ETC Community”.

Сначала вызовем функцию checkTradeMark:

truffle(development)> trademark.checkTradeMark(«ETC Take My Energy»)
false

Она возвращает ложное логическое значение, как и ожидалось, так как мы пока не зарегистрировали свой товарный знак. Давайте сделаем это:

truffle(development)> trademark.registerTradeMark(«ETC Take My Energy», «ETC Community»)
{ tx: ‘0x58ced570617bea3b210a7a914f749777e1f95c4c212551ca54a2cb0617f88895’,
receipt:
{ transactionHash: ‘0x58ced570617bea3b210a7a914f749777e1f95c4c212551ca54a2cb0617f88895’,
transactionIndex: 0,
blockHash: ‘0x26cadc9a227dd7edea0b1ed72dfdcfa3b99e9c409cbc4c14d5a3fd451084b972’,
blockNumber: 6,
gasUsed: 129690,
cumulativeGasUsed: 129690,
contractAddress: null,
logs: [],
status: ‘0x1’,
logsBloom: ‘0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000’ },
logs: [] }

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

Теперь давайте проверим, зарегистрирован ли наш товарный знак:

truffle(development)> trademark.checkTradeMark(«ETC Take My Energy»)
true

Мы видим, что да. А как посмотреть данные о его регистрации? Для этого нужно использовать функцию getTradeMarkData:

truffle(development)> trademark.getTradeMarkData(«ETC Take My Energy»)
[ ‘ETC Take My Energy’,
‘ETC Community’,
{ [String: ‘1536767522’] s: 1, e: 9, c: [ 1536767522 ] },
‘0xf162b3f6c83d920f6ec6ee44bbede159c4c384c3efe1ad58ca209ad3441dbb26’ ]

Структура выдала нам данные о названии, авторе, временной отметке и доказательстве названия. Отлично, это работает!

Теперь давайте перекомпилируем этот смарт-контракт для сети ETC.

Помните, я писал, что в ETC доступны только контракты, написанные на Solidity версии 0.4.2 и ниже? Нам нужно изменить код в начале смарт-контракта на следующий:

pragma solidity 0.4.19;

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

Отлично, теперь перейдём на сайт web IDE, на котором есть простой инструмент компиляции для Solidity.

В поле «браузер» вставим наш solidity код:

1

Во вкладке Settings в правой части экрана выберем строчку 0.4.19+commit.c4cbbb05 в выпадающем окне в поле Solidity version, как показано ниже:

1_7AE5ujlYeIyt1Ytr7hZ8KQ

Таким образом мы выбрали нужную нам версию компилятора для нашего смарт-контракта: Затем нажимаем «Compile»:

1_VDhi83NZxku3F8HKBJcWfg

После завершения компиляции, нажмите кнопку Details. Появится всплывающее окно с нужной нам информацией. Нам нужны две вещи: сгенерированный байт-код и ABI JSON.

1_W3tGIId3hKbPZ2cErPi0wg

Чтобы получить байт-код, скопируйте строчку “object”. Чтобы отправить смарт-контракт, перейдём на сайт MyCrypto.

Примечание: Так как мы собираемся отправить смарт-контракт в блокчейн ETC, предполагается, что у вас уже есть кошелёк Ethereum Classic и криптовалюта ETC, а также аккаунт на MyCrypto.

Во вкладке Contracts в кошельке MyCrypto, выберите вкладку Deploy. Вставьте скопированный байт-код в текстовое поле, как показано на рисунке ниже:

1_XDe6T5DFaDo9G8b0fo77Sg

Затем кликните по строчке Deploy Contract для начала операции. Сайт попросит вас подписать транзакцию. Это можно сделать с помощью аппаратного кошелька или приватного ключа. Помните, что для отправки тоже нужен газ, поэтому на вашем счету должно быть определённое количество ETC.

После завершения процесса отправки вы увидите детали транзакции и адрес контракта, как показано на рисунке ниже:

2

Скопируйте адрес, так как он вам понадобится для взаимодействия с вашим смарт-контрактом.

Ура, вы только что отправили контракт в сеть Ethereum Classic! Не забудьте себя похвалить!

Теперь давайте зарегистрируем товарный знак в неизменяемом блокчейне.

Вернёмся в MyCrypto->Contracts. Перейдите во вкладку «Interact«.

Здесь вам нужно будет заполнить несколько полей. Первое – это адрес контракта, который мы скопировали ранее после завершения процесса отправки.

Второе – вам нужно скопировать ABI JSON, о котором мы говорили ранее. ABI JSON – это простой интерфейс, с помощью которого можно легко взаимодействовать со своим смарт-контрактом. Он был сгенерирован на этапе компиляции контракта в браузере solidity. Скопируйте его:

3

Затем вставьте в текстовое поле, как показано на рисунке ниже:

4

Теперь нажмите Access, и он сгенерирует интерфейс для взаимодействия со смарт-контрактом, как показано ниже:

5.png

Выбрав checkTradeMark в выпадающем окне, мы увидим поле для ввода данных для команды phrase string для проверки товарного знака. Давайте напишем в нём “ETC Take My Energy“ и посмотрим, что он нам выдаст.

6.png

Он выдаёт false, так как мы ещё не зарегистрировали этот товарный знак в сети Ethereum Classic.

Что ж, давайте зарегистрируем. Выберите команду registerTradeMark в выпадающем списке. Название укажите “ETC Take My Energy”, а автора — “ETC Community”, как показано на рисунке ниже:

7.png

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

Это можно сделать с помощью функции checkTradeMark:

8

Результат — true! Поздравляем, вы только что зарегистрировали свой первый товарный знак в сети Ethereum Classic!

Теперь давайте просмотрим данные о нём с помощью функции get-TradeMarkData:

9

Отлично, мы видим имя автора, отметку времени и доказательство.

Супер! Далее этот смарт-контракт можно будет расширить с помощью дружественного пользовательского интерфейса в веб-приложении. А пока надеюсь, что вам понравилось это руководство.

 

Источник



Рубрики:ETC, смарт-контракты, эфир

Метки:

1 reply

  1. Видно, что автор ни строчки кода в своей жизни не написал.
    Ужасное форматирование.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s