Статьи

Создание первого приложения для Blockchain с помощью Eris

Несколько месяцев назад я был на премии «Берлинский блокчейн», и кажется, что «блокчейн» — это новое модное слово, которое стартапы и технический персонал любят бросать во все, без полного понимания концепций, стоящих за ним.

Верите ли вы, что блокчейн — это просто новое модное слово для индустрии или действительно революционная технология, разработчики часто не уверены, как они могут использовать концепцию блокчейна в своих приложениях. Решение Eris Industries может сделать это немного проще.

Eris Industries объединяет концепции блокчейна и умного контракта, чтобы сделать их более удобными и применять их в своем проекте. Лучшие проекты для такого рода технологий — это идеи, которые нуждаются в форме децентрализованного доверия и безопасности.

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

Установка и настройка

Установка Eris сбивает с толку, инструкции на их домашней странице не работают для меня, и я вместо этого выполнил шаги в их более подробных инструкциях . Для меня на моем Mac я установил Docker Toolbox (требуется Docker), а затем установил Eris с Homebrew .

После установки настройте Eris с помощью следующей команды, которая создаст файлы конфигурации и загрузит требуемые (большие) образы Docker:

eris init

Начать процесс Eris

Загрузка изображений

Процесс завершен

Примечание . Это не ясно из документации 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_chainsimplechain

 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, вы создадите контракт, в котором будет setget Начните с создания папки для приложения и перехода в нее:

 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;
  }
}

Этот файл должен быть достаточно понятным, он определяет строковую переменную и соответствующие функции setget

Затем создайте файл 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

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

Затем вам нужно сказать Эрисе, чтобы они посмотрели на эти два файла, сгенерировали другие необходимые файлы, а затем:

  1. Развернуть договор.
  2. Отправь ей транзакции.
  3. Запрос результатов из договора.
  4. Утверждаю результаты.

Сначала получите адрес, по которому вы хотите развернуть контракт:

 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 .

Это будет ухабистое и порой запутанное путешествие, но мне бы очень хотелось услышать ваш опыт, мысли и вопросы.