Погружение в технологию блокчейн: Быстрые и безопасные транзакции
В этом материале речь пойдет о победителях хакатона — проекте от команды разработчиков Модульбанка, который решает существующие проблемы в банковской сфере и помогает осуществлять быстрые и безопасные транзакции между юридическими лицами.
Проблемы в банковской сфере, которые можно решить с помощью блокчейн
Так как представители проекта работают в банковской сфере, они не понаслышке знакомы с проблемой расчета между юридическими лицами: этот процесс может занимать до трех дней, что крайне долго для малого бизнеса и динамичных предпринимателей. Кроме того, у банков сегодня есть еще одна проблема: часть безналичных расчетов между компаниями является «транзитом» чёрных денег. Обычно это очень сложно определить, потому что нет цепочки прохождения транзакции и связи между ними. Нет истории движения денег в других банках. Банки придумывают различные аналитические алгоритмы, чтобы выявлять такие транзакции. Но и они часто ошибаются, так как не хватает данных для полноценного анализа. В свою очередь, сеть блокчейн подразумевает единое распределённое хранилище транзакций. Это значит, что каждый платёж навсегда остаётся в единой базе движения средств, поэтому для анализа всегда доступен весь денежный поток.
Скорость платежей
Проблему скорости платежей решает то, что транзакции в блокчейн происходят мгновенно. Единственным замедляющим фактором может стать время, которое принимающая сторона будет ожидать подтверждение этой транзакции, так как они приходят от других участников сети — PoW.
Безопасность транзакций
Безопасность транзакций обеспечивается тем, что в блокчейн в каждый блок данных встраивается вычисленная контрольная сумма предыдущего блока, таким образом, каждый блок имеет ссылку на предыдущий. Мы считаем, что благодаря этой особенности технология блокчейн позволит существенным и даже радикальным образом повысить прозрачность транзакций и сделает процедуры проверки (в части противодействия отмыванию денег и финансирования терроризма) простыми и эффективными.
На хакатоне было протестировано решение, упрощающее анализ движения денежных средств между счетами: при прохождении транзакции через каждый счет «деньги» помечали специальной уникальной меткой этого счета. Поэтому, каждый рубль, который проходит через сеть, может тянуть за собой не только хвост всех меток, но и последовательность всех счетов, через которые он прошел. Вместе с остальными достоинствами сети блокчейн (скорость, безопасность, единая база транзакций), это решение исключает непрозрачное прохождение денег и позволяет однозначно восстановить маршрут их движения в любой момент времени в рамках финансового консорциума.
Реализация идеи
Ключевая цель команды заключалась в том, чтобы показать, что их идея рабочая для конечного пользователя, поэтому для наглядности были созданы: клиентское приложение для мобильного устройства, веб-приложения для банка и регуляторов. Для back-end было принято решение развернуть сеть Ethereum (платформу для создания децентрализованных онлайн-сервисов на базе блокчейна) на основе Azure Blockchain as a Service.
Мобильное приложение под iOS для осуществления переводов было создано на Objective-C. Веб-приложения для мониторинга — на Angular. Для back-end интеграции использовали язык C# и инструменты Visual Studio.
Архитектура реализованной системы достаточна проста. Ниже вы можете увидеть её.
Почему Microsoft Azure?
Microsoft Azure был выбран, так как существует готовый шаблон для развёртывания всей необходимой инфраструктуры для Ethereum — DevTest Labs for Blockchain as a Service. Данный шаблон разворачивает в Azure виртуальную машину на Ubuntu, внутри которой из стандартного репозитория разворачивается сеть Ethereum, после чего с помощью артефактов настраиваются параметры её работы.
Почему Ethereum?
Так как для связывания клиентских приложений с сетью Ethereum использовался .NET WebApi, крайне удобно использовать Nethereum — готовое решение для доступа к сети Ethereum. Основное преимущество Ethereum для текущего решения — программируемые смарт-контракты. Для их создания существует удобный инструмент Solidity extension для Visual Studio. Дополнительным преимуществом можно выделить то, что back-end приложение также можно без проблем развернуть на веб-сервисе в Azure.
Развертывание сети блокчейн
Самой сложной и одновременно интересной стала задача по развёртыванию сети блокчейн. Для этого был использован шаблон DevTest Labs, позволяющий развернуть Ethereum в Azure затратив минимум усилий, так как многие вещи в нём происходят автоматически.
Фактически, при его использовании создается группа ресурсов, полностью готовая к развертыванию сети Ethereum. Но! Виртуальную машину она не создает. Выход простой — кликнув на Add просто выбираем и добавляем новый ресурс — виртуальную машину на Ubuntu Server 14.04:
Примерно через 5 минут вы увидите готовую среду для развёртывания блокчейн сети:
Примечание: здесь стоит оговориться, что развёртывание сети Ethereum может проходить в полностью автоматическом режиме с помощью подключения артефактов перед созданием виртуальной машины. Этот способ описан в этой статье. Но в рамках тестового аккаунта Azure, предоставленного для хакатона, такая возможность была недоступна. Поэтому команда разворачивала сеть вручную.
Далее, с помощью заготовленных скриптов, подцепившись к виртуальной машине через SSH-клиент, выполняем несколько команд (добавляем репозиторий Ethereum, обновляем список пакетов, устанавливаем Ethereum):
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
Далее необходимо всё это запустить. Для этого отправляем скрипты на виртуальную машину с помощью команды:
pscp "C:\path to your scripts folder\*" @:./
Далее запускаем сеть Ethereum, выполнив:
sh seed-blockchain.sh
Здесь при создании сети используется genesis-файл
lab-seed.json
, который содержит следующее: {
"config": {
"homesteadBlock": 10
},
"alloc": {},
"nonce": "0x0000000000000042",
"difficulty": "0x0400",
"mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82ee",
"gasLimit": "0x4c4b40"
}
После этого создаём первый аккаунт:
geth --datadir "chains/devtest" account new
И запускаем майнинг:
geth --mine --identity "Node1" --datadir "/home/deathys/chains/devtest/" --nodiscover --rpc --rpccorsdomain "*" --networkid 552 console
В результате видим запуск процесса майнинга — в сети создаются новые блоки. Сейчас они без транзакций:
Примечание: обратите внимание, что если в сети не происходит майнинг, то сеть не считает созданные в ней транзакции подтверждёнными.
Теперь, когда виртуальные машины готовы, можно погружаться в саму «сеть». Чтобы не останавливать майнинг, подключаемся к ней в параллельной сессии. Команда для подключения приведена в скрипте attachOne.sh
. Так как майнинг идёт полным ходом, мы получаем за него вознаграждение в эфирах — стандартной валюте сети. На текущий момент мы имеем следующее количество эфиров для тестирования решения:
Примечание: на самом деле, это довольно внушительная сумма для Homestead «production». На момент проведения хакатона стоимость одного ether приближалась к С$17.
Распределенная сеть блокчейн
Для того, чтобы развернуть распределенную блокчейн сеть будет необходима хотя бы еще одна виртуальная машина (нода). Чтобы поднять вторую ноду нашей сети, нужно выполнить все действия, аналогичные созданию основной ноды.
Кроме того в Azure в разделе Network security group необходимо открыть исходящие и входящие порты, на которых работает сеть Ethereum. В разделе Inbound security rules открываем порты 30303 и 34964:
Теперь свяжем ноды, чтобы они увидели друг друга в сети. Для этого нужно представить одну ноду другой, введя команду, в рамках подключения одной из нод:
admin.addPeer("enode://@:30303")
Чтобы узнать ID представляемой ноды, нужно в рамках подключения к ней выполнить команду:
admin.nodeInfo.enode
Итак, теперь у нас появилась распределённая сеть блокчейн и можно начинать переводить криптовалюту между счетами.
Чтобы было интереснее, создадим больше аккаунтов:
personal.newAccount()
В результате получим:
Теперь мы можем переводить между ними ether, но есть один нюанс — чтобы перевести деньги с одного аккаунта на другой нужно снять блокировку с аккаунта с которого будем делать перевод. Блокировка на счет устанавливается автоматически. Это сделано для обеспечения безопасности пользования аккаунтом.
personal.unlockAccount('0xa2081622fcc99aec3c1efb575b548c90bdadf8cf','12345678', 0)
Здесь первый аргумент — это адрес счета, второй — пароль, а последним аргументом мы задаем время на которое аккаунт будет разблокирован (если указать 0, то аккаунт будет разблокирован на время жизни данного подключения к сети Ethereum). Если подключение прерывается, то аккаунт сразу же блокируется.
Переходим к созданию транзакции:
eth.sendTransaction({from: "0xa2081622fcc99aec3c1efb575b548c90bdadf8cf", to: "0x847a20cdec0b3ba98aced771bd1df7e8a2e004f5", value: web3.toWei(1, "ether")})
В данном случае мы переводим 1 эфир между счетами. В ответ на вызов, если всё прошло успешно, возвратится адрес транзакции:
По этому адресу можно запросить данные, которые транзакция содержит:
eth.getTransaction('0x88839260b77b250458731ba07d351753aba5042dd22c8420a1f6f104f3deede9')
Теперь посмотрим баланс на счёте назначения:
Видим, что сеть успешно функционирует. Теперь прикрутим к ней клиентские приложения. Для этого можно использовать SSH-клиент. Пример использования:
using (var client = new SshClient(hostUrl, 22, userName, pass))
{
client.Connect();
string commStr = @"curl http://localhost:8545 -X POST --data '{""method"":
""eth_sendTransaction"",
""params"": [{
""from"": ""0xa2081622fcc99aec3c1efb575b548c90bdadf8cf"",
""to"": ""0x847a20cdec0b3ba98aced771bd1df7e8a2e004f5"",
""gas"": ""0x76c0"",
""gasPrice"": ""0x9184e72a000"",
""value"": ""0x9184e72a"",
""data"": ""bla bla""
}], ""id"":1}'";
var comm = client.RunCommand(commStr);
client.Disconnect();
}
Это часть кода, в которой переводятся средства с одного счета на другой, с использованием команды
curl
— по сути запрос RPC в нашу сеть. В ответ мы получаем результат выполнения команды в формате JSON с данными созданной транзакции.При промышленном применении все будет гораздо сложнее, так как необходимо внедрение и развитие интеллектуальных аналитических алгоритмов, позволяющих установить полный путь движения средств со счета на счет. А также, необходимо будет учесть взаимодействие данного решения на платформе блокчейн с уже существующими сервисами внутри банка.
В данной статье мы продемонстрировали только переводы ether между счетами. Способы при помощи которого отмечали переводы ether с одного счета на другой — уже темы будущих статей.
На фотографии ниже авторы материала: Лёвин Денис, Анастасиев Святослав, Андрей Вариков, — команда разработчиков Модульбанка.