Несколько месяцев назад я был на премии «Берлинский блокчейн», и кажется, что «блокчейн» — это новое модное слово, которое стартапы и технический персонал любят бросать во все, без полного понимания концепций, стоящих за ним.
Верите ли вы, что блокчейн — это просто новое модное слово для индустрии или действительно революционная технология, разработчики часто не уверены, как они могут использовать концепцию блокчейна в своих приложениях. Решение Eris Industries может сделать это немного проще.
Eris Industries объединяет концепции блокчейна и умного контракта, чтобы сделать их более удобными и применять их в своем проекте. Лучшие проекты для такого рода технологий — это идеи, которые нуждаются в форме децентрализованного доверия и безопасности.
В этой статье я создам демонстрационное приложение, которое представляет собой библиотеку имен привилегированных пользователей для гипотетической ситуации. В последнем разделе руководства приложение позволит вам изменить имя в списке и проверить значения.
Установка и настройка
Установка Eris сбивает с толку, инструкции на их домашней странице не работают для меня, и я вместо этого выполнил шаги в их более подробных инструкциях . Для меня на моем Mac я установил Docker Toolbox (требуется Docker), а затем установил Eris с Homebrew .
После установки настройте Eris с помощью следующей команды, которая создаст файлы конфигурации и загрузит требуемые (большие) образы Docker:
eris init
Примечание . Это не ясно из документации Eris, но лучше всего выполнить остальные команды в этом руководстве в контексте Docker. Это в основном относится к Mac и Windows, более подробную информацию можно найти здесь .
Предоставление доступа
Запустите службу ключей Eris для аутентификации с помощью:
eris services start keys
Эта команда запускает службу на основе определения службы keys
~ / .eris / services . Eris создает некоторые по умолчанию для предопределенных типов приложений (например, Tor , ipfs и bigchaindb ), но вы также можете создавать свои собственные .
Теперь создайте несколько ключей, чтобы предоставить конкретным пользователям доступ к сервису и приложению:
eris keys gen
Сохраните ключ для последующего использования, заменив значение ключа только что сгенерированным ключом:
eris keys export E0F4BA1E6D15503074239A663101547074889574
И используйте следующую команду, чтобы проверить, какие ключи доступны на вашем хост-компьютере и в контейнерах:
eris keys ls
Если вы хотите больше узнать о ключах с помощью Eris, то я рекомендую их руководство по работе с ключами .
Создание блокчейна
Затем создайте блокчейн с именем ( library_chain
simplechain
eris chains make library_chain --account-types=Root:2,Full:1 simplechain
Если вы покопаетесь в скрытой папке ~ / .eris, вы увидите файлы, сгенерированные этой командой. Внутри ~ / .eris / chain / library_chain находится серия файлов:
- genesis.json : рассказывает eris, как создать конкретный блокчейн, обеспечивая состояние «генезиса» блокчейна.
- account.csv и validators.csv : вы можете использовать два файла позже, чтобы создать новый genesis.json, если он будет потерян.
- address.csv : содержит адреса и «имена» узлов.
Теперь вы готовы создать экземпляр Blockchain:
eris chains new library_chain --dir ~/.eris/chains/library_chain/library_chain_full_000
Убедитесь, что цепочка существует и работает:
eris chains ls
контракты
«Умный контракт» — это популярный термин, связанный с блокчейном, для «соглашения о том, что блокчейн будет анализировать транзакции, которые вы отправляете». В качестве простого примера, связанного с Eris, вы создадите контракт, в котором будет set
get
Начните с создания папки для приложения и перехода в нее:
cd ~/.eris/apps
mkdir library
cd library
Создайте файл library.sol внутри этой папки и добавьте в него следующее:
contract Library {
string storedData;
function set(string x) {
storedData = x;
}
function get() constant returns (string retVal) {
return storedData;
}
}
Этот файл должен быть достаточно понятным, он определяет строковую переменную и соответствующие функции set
get
Затем создайте файл epm.yaml, который читается менеджером пакетов Eris, и ищет в нем задания для запуска:
jobs:
- name: setStorageBase
job:
set:
val: "Book Title"
- name: deployStorageK
job:
deploy:
contract: library.sol
wait: true
- name: setStorage
job:
call:
destination: $deployStorageK
data: set $setStorageBase
wait: true
- name: queryStorage
job:
query-contract:
destination: $deployStorageK
data: get
- name: assertStorage
job:
assert:
key: $queryStorage
relation: eq
val: $setStorageBase
Некоторые из этих объявлений о работе имеют больше смысла, чем другие, для получения более подробной информации прочитайте документ с описанием работы .
Затем вам нужно сказать Эрисе, чтобы они посмотрели на эти два файла, сгенерировали другие необходимые файлы, а затем:
- Развернуть договор.
- Отправь ей транзакции.
- Запрос результатов из договора.
- Утверждаю результаты.
Сначала получите адрес, по которому вы хотите развернуть контракт:
addr=$(cat ~/.eris/chains/library_chain/addresses.csv | grep library_chain_full_000 | cut -d ',' -f 1)
echo $addr
А внутри папки приложения ( ~ / .eris / apps / library ) вызовите менеджер пакетов Eris для файлов, которые вы создали, и разверните контракт в блокчейне:
eris pkgs do --chain library_chain --address $addr
Эта команда найдет заданные вами задания, развернет их, а затем вернет сделанное утверждение, которое в данном случае состоит в том, что заголовок книги является строкой.
Оформление заявки
Теперь пришло время написать некоторый код, который взаимодействует с блокчейном и выполняет над ним действия. Это все еще простой пример, который позволяет пользователям устанавливать новое значение для книги в блокчейне, а затем проверять текущее значение.
В примере будет использоваться Node.js, поэтому сначала создайте файл package.json в папке ~ / .eris / apps / library со следующим содержимым:
{
"name": "library_app",
"version": "0.0.1",
"dependencies": {
"eris-contracts": "^0.13.1",
"prompt": "*"
}
}
Затем создайте файл app.js и добавьте следующее:
'use strict';
var contracts = require('eris-contracts');
var fs = require('fs');
var http = require('http');
var address = require('./epm.json').deployStorageK;
var abi = JSON.parse(fs.readFileSync('./abi/' + address, 'utf8'));
var accounts = require('../../chains/library_chain/accounts.json');
var chainUrl = 'http://192.168.59.103:1337/rpc';
var manager = contracts.newContractManagerDev(chainUrl,
accounts.library_chain_full_000);
var contract = manager.newContractFactory(abi).at(address);
Этот первый блок кода создает требования, а затем некоторые специфичные для Eris переменные для abi
За исключением нескольких деталей, большая часть остального кода — более знакомая территория JavaScript, создающая сервер Node, прослушивающая запросы и записывающая и считывающая данные в блокчейн в зависимости от ситуации:
var server;
server = http.createServer(function (request, response) {
var body;
var value;
switch (request.method) {
case 'GET':
console.log("Received request for details.");
contract.get(function (error, result) {
if (error) {
response.statusCode = 500;
} else {
response.statusCode = 200;
response.setHeader('Content-Type', 'application/json');
response.write("You have requested details on: " + result);
}
response.end('\n');
})
break
case 'PUT':
body = '';
request.on('data', function (chunk) {
body += chunk;
});
request.on('end', function () {
console.log("Received request to set title to " + body + '.');
contract.set(body, function (error) {
response.statusCode = error ? 500 : 200;
response.end();
});
});
break;
default:
response.statusCode = 501;
response.end();
}
});
server.listen(process.env.NODE_PORT, function () {
console.log('Listening for HTTP requests on port ' + process.env.NODE_PORT +
'.');
});
Примечание : вам может понадобиться установить для значения NODE_PORT
Заверните приложение и PUT
curl --request PUT --data Jane http://localhost:1111
# Or whatever your node IP address is
Теперь, если вы GET
curl http://localhost:1111
Посмотрите на вывод команды curl и приложения Node.js, чтобы получить немного более четкое представление о том, что происходит за кулисами.
‘Вывод’
На первый взгляд может показаться, что сложно начать работу с базовым приложением, использующим Eris. Но если вы не столкнулись с какими-либо проблемами, эти шаги по установке не должны занимать слишком много времени, и тогда вы будете готовы начать использовать блокчейн в своих приложениях.
На самом деле кодирование приложения, использующего блокчейн, — это большая и сложная тема, и я едва коснулся ее поверхности. Для следующих шагов я рекомендую вам убедиться, что у вас есть добросовестный вариант использования блокчейна в вашем приложении, а затем прочитать учебные руководства на веб-сайте Eris .
Это будет ухабистое и порой запутанное путешествие, но мне бы очень хотелось услышать ваш опыт, мысли и вопросы.