Хабрахабр

Адаптер для работы с блокчейн Ethereum для платформы данных InterSystems IRIS

1. Блокчейн

Сейчас, когда я пишу эту статью курс Bitcoin упал более чем в 5 раз относительно максимального значения и рассказывая о том, что я делал что-то связанное с блокчейн первое, что я слышу это нескрываемый скепсис — “кому теперь нужен весь этот ваш блокчейн”.

Но технологии лежащие в основе остались, они развиваются и будут продолжать развиваться и использоваться в определенных нишах. Да, действительно хайп вокруг блокчейна прошел. В интернете и в частности на Хабре множество материалов, описывающих как общие направления применения технологий (например, habr.com/company/bitfury/blog/353350 так и более частные примеры habr.com/company/raiffeisenbank/blog/332756).

база данных, которая распределена между несколькими узлами при этом каждый узел хранит полную копию реестра. Как известно, блокчейн — это распределенный реестр, т.е. При этом доступны только операции по добавлению данных. Особенность блокчейн в том, что записи (транзакции) сгруппированы в блоки, а блоки объединены в цепочку блоков. Все это приводит к тому, что внести изменения в уже сохраненные в блокчейн транзакции практически невозможно.

Есть множество материалов, о том как работает блокчейн (если вы до этого ничего не слышали про блокчейн, то начать можно с этого простого видео).

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

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

Во-вторых, отсутствие третьей стороны, которой все доверяют.

В-третьих, необходимость наличия механизма для публичной проверки данных.
Если все перечисленные условия выполнены — необходимо задуматься об использовании блокчейна.

Проект www. Такие задачи могут возникнуть в любых отраслях. 101blockchains.com собирает информацию как о потенциальных так и о внедренных проектах, а также об особенностях использования блокчейн в разных областях.

Например, в сфере здравоохранения блокчейн может использоваться:

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

При применении блокчейн в корпоративном сегменте обычно используют частный блокчейн с различным уровнем разрешений (Private Permissioned Blockchain). В таких сетях есть специальный набор узлов для подтверждения транзакций.

Такой выбор связан с популярностью Ethereum и достаточно развитой инфраструктурой: наличием различных инструментов и библиотек. Однако при разработке первого адаптера InterSystems IRIS для работы с блокчейн мы выбрали Ethereum, который относится к категории Permissionless Blockchain — открытой платформы без управляющего органа. Также можно заметить что используя ПО для работы с Ethereum можно создать приватный блокчейн.

2. Адаптер

Теперь пора перейти к собственно адаптеру.

Адаптеры InterSystems IRIS делятся на входящие (для получения данных от внешней системы, когда внешняя система является инициатором взаимодействия) и исходящие (для работы с внешней системой, когда инициатором взаимодействия является InterSystems IRIS). Адаптер в InterSystems IRIS (также как и в Ensemble) — это класс или пакет классов InterSystems IRIS, предоставляющих возможность работы с внешней системой.

Архитектура приведена на рисунке 1. IRIS Ethereum адаптер является исходящим адаптером, и немного отличается от большей части других адаптеров InterSystems IRIS, поскольку часть этого адаптера — это пакет классов InterSystems IRIS, но также в адаптер входит небольшой модуль NodeJS.


Рисунок 1.

Модуль NodeJS адаптера использует существующие библиотеки NodeJS для работы с Ethereum.

Адаптер предоставляет следующие возможности:

  • Разместить смарт-контракт в Ethereum (мы планируем подготовить еще одну статью, в которой более подробно расскажем про смарт-контракты, инструменты для разработки и обсудим пример).
  • Вызывать методы смарт-контрактов: как методы которые не изменяют состояние блокчейн, так и методы которые изменяют состояние блокчейн
  • Сохранение транзакции (перевод средств с кошелька на кошелек)
  • Вызов вспомогательных методов, для получение состояния блокчейн
  • Логирование всех запросов (выполняет NodeJS модуль, полезно при отладке)

Адаптер доступен с исходными кодами на OpenExchange.

3. Простой пример

Вместе с адаптером устанавливается пример “Hello world”.

Чтобы начать работать с Ethereum (в том числе чтобы запустить этот пример) вам понадобится:

  • Выбрать с какой из сетей вы будете работать. Для разработки обычно используют тестовые сети например Ropsten
  • Создать в этой сети кошелек и пополнить его
  • Установить локальный клиент Ethereum (например, Geth) или получить ключ для работы с облачным провайдером (например, Infura)

При настройке бизнес-операции необходимо задать (рисунок 2):

  1. Сервер и порт, где запущен модуль NodeJS (по умолчанию порт 3000)
  2. Настройки провайдера ( в данном случае доступ к Infura)
  3. Реквизиты доступа ( в реквизитах доступа в качестве имени пользователя необходимо указать ваш кошелек, в качестве пароля — приватный ключ от кошелька. В InterSystems IRIS реквизиты доступа хранятся в отдельной БД, для которой необходимо включить шифрование)


Рисунок 2.

Для работы со смарт контрактами — вам понадобится создать (для каждого смарт-контракта, к которому вы будете обращаться) папку в файловой системе и разместить там 2 файла:
* abi.txt
* bytecode.txt

ABI смарт-контракта — формальное описание интерфейса смарт-контракта в json-формате. В этих файлах должны быть ABI смарт-контракта и Bytecode. ABI и Bytecode создаются в момент компиляции смарт-контракта.

Bytecode необходим только для развертывания контракта.

С помощью службы тестирования можно проверить работу бизнес-операции.

Результат вызова этой бизнес операции — это сообщение содержащее хеш транзакции. На рисунке 3 с помощью службы тестирования выполняется развертывание (deploy) смарт-контракта.


Рисунок 3.

С помощью браузера ropsten.etherscan.io (https://etherscan.io/) можно найти эту транзакцию, и получить адрес размещенного смарт-контракта.

Для выполнения методов смарт-контракта помощью адаптера необходимо указать настройки в конфигурации продукции: ContractFolder и ContractAddress.

Код вызова метода смарт-контракта достаточно прост:

set ..ContractABI = [].%FromJSON(..ContractFolder_"abi.txt") set contract = ..Adapter.GetContract( ##class(Ethereum.Address).%New(..ContractAddress), ..ContractABI)
set result = contract.hello()
set pResponse = ##class(Ens.StringContainer).%New(result.args)

С помощью метода адаптера GetContract, которому передается адрес смарт-контракта и ABI, создается объект смарт-контракт, которые затем используется для вызова методов. В данном случае в смарт контракте должен быть определен метод hello(), возвращающий строку.

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

Адаптеру необходимо передать токен отложенного ответа (deferred) и тогда при подтверждении транзакции NodeJS модуль передаст InterSystems IRIS результат ее выполнения. Для вызова таких методов можно использовать механизм отложенного ответа (deferred response) в InterSystems IRIS. Для этого необходимо сконфигурировать веб-приложение и добавить в продукцию бизнес-операцию, которая будет обрабатывать полученный ответ.

Код для вызова метода, изменяющего состояние блокчейн:


// getting EthereumAccount(wallet) and privateKey
do ##class(Ens.Config.Credentials).GetCredentialsObj(.cred, "Ethereum.Demo.EthereumOperation", "Ens.Config.Credentials", ..Credentials)
set account = ##class(Ethereum.Address).%New(cred.Username)
set privateKey = cred.Password //reading contract ABI
set ..ContractABI = [].%FromJSON(..ContractFolder_"abi.txt") // get contract object
set contract = ..Adapter.GetContract( ##class(Ethereum.Address).%New(..ContractAddress), ..ContractABI)
$$$ThrowOnError(..DeferResponse(.deferred)) // estimate gas
do contract.SetOptions(account)
set gasJSON = contract.EstimateGas("setName",pRequest.Name)
$$$TRACE(gasJSON.gas) do contract.SetOptions(account, privateKey, ##class(Ethereum.Wei).%New(1000000000), ##class(Ethereum.Wei).%New(100*gasJSON.gas),,deferred) set result = contract.setName(pRequest.Name)

В данном случае перед вызовом метода смарт-контракта setName() необходимо указать ряд параметров, включая токен отложенного ответа.

В нашей следующей статье будет более подробно рассказано о смарт-контрактах и приведен пример решения прикладной задачи с использованием Ethereum-адаптера InterSystems IRIS.

Теги
Показать больше

Похожие статьи

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть