Представляем вам серию статей о первых в России проектах, разработанных на основе технологии блокчейн. Мы спросили у команд-участниц хакатона InspiRussia о технологической составляющей их решений.

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



Цикл статей «Погружение в технологию блокчейн»


1. Погружение в технологию блокчейн: Секреты EmerCoin.
2. Погружение в технологию блокчейн: Быстрые и безопасные транзакции.
3. Погружение в технологию блокчейн: Экосистема цифровой стоматологии.
4. Loading…

Проблемы в банковской сфере, которые можно решить с помощью технологии блокчейн


Так как представители проекта работают в банковской сфере, они не понаслышке знакомы с проблемой расчета между юридическими лицами: этот процесс может занимать до трех дней, что крайне долго для малого бизнеса и динамичных предпринимателей. Кроме того, у банков сегодня есть еще одна проблема: часть безналичных расчетов между компаниями является «транзитом» чёрных денег. Обычно это очень сложно определить, потому что нет цепочки прохождения транзакции и связи между ними. Нет истории движения денег в других банках. Банки придумывают различные аналитические алгоритмы, чтобы выявлять такие транзакции. Но и они часто ошибаются, так как не хватает данных для полноценного анализа. В свою очередь, сеть блокчейн подразумевает единое распределённое хранилище транзакций. Это значит, что каждый платёж навсегда остаётся в единой базе движения средств, поэтому для анализа всегда доступен весь денежный поток.



Скорость платежей


Проблему скорости платежей решает то, что транзакции в блокчейн происходят мгновенно. Единственным замедляющим фактором может стать время, которое принимающая сторона будет ожидать подтверждение этой транзакции, так как они приходят от других участников сети — 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\*" <username>@<server_ip>:./

Далее запускаем сеть 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://<nodeid>@<ip address>: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 с одного счета на другой — уже темы будущих статей.

На фотографии ниже авторы материала: Лёвин Денис, Анастасиев Святослав, Андрей Вариков, — команда разработчиков Модульбанка.

Поделиться с друзьями
-->

Комментарии (21)


  1. TimsTims
    12.10.2016 22:40
    +4

    Несколько простых вопросов:
    1) > Теперь посмотрим баланс на счёте назначения
    Если (вдруг) все банки перейдут на блокчейн, то все банки (или даже юр.лица?) смогут запрашивать БАЛАНС счета другого юр.лица? Это ведь весьма спорное решение, ведь выяснив номер счета, можно знать, сколько щас денег у юр.лица. Да, это не значит, что эти деньги украдут, но я считаю, что компании не захотят, чтобы эта информация была доступна другим банкам.

    2) > каждый рубль, который проходит через сеть, может тянуть за собой не только хвост всех меток, но и последовательность всех счетов, через которые он прошел.
    Возможно я как-то неправильно себе это представляю, но допустим «Юр.лицо 1» переводит 1млн другому «юр.лицу 2» (транзитник). Этот транзитник получил таких переводов 10шт на 10млн и делает 1000 маленьких переводов, разбивая сумму на самые разные доли: кому-то перевел 33, кому-то 30, кому-то 45, кому-то 47. Как вы узнаете, какие и чьи деньги кому этот транзитник перевел? Насколько я понимаю, блокчейн помечают целые транзакции, а не «каждый рубль в транзакции». Это значит, что такого рода транзитники попрежнему будут заниматься сомнительной деятельностью, а блокчейн со стороны регулятора (который и так видит все транзакции всех клиентов банков и между банками) никак тут не помогает.


    1. gleber1
      13.10.2016 09:09

      Да тоже бы интересно было узнать ответ на 2 вопрос


      1. quantum
        13.10.2016 10:07

        del


    1. quantum
      13.10.2016 10:07

      10 шт по 1 млн суммируются, но не смешиваются. При переводе с транзитника видно, какая именно входящая транзакция разделилась на перевод и «сдачу».


    1. benyamin
      14.10.2016 09:37

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


    1. Schvepsss
      14.10.2016 10:13

      1. Да, если использовать существующие решения, то эта проблема будет присутствовать. Но, при внедрении блокчейна в банковскую сферу его будет необходимо доработать по многим вопросам. Скорее всего там подойдет какой-нибудь Masterchain с существенными доработками в плане безопасности и доступа.

      2. Как правильно заметил quantum, деньги не будут смешиваться. Они могут лишь раздробиться за счет той же «сдачи».


    1. erlyvideo
      15.10.2016 00:38
      -1

      не просто баланс. Идея в том, что бы хорошие люди полностью показывали абсолютно всю свою историю движения денег плохим людям.

      Плохие люди будут тратить время на то, что бы скрыть свои потоки, а хорошие нет. В итоге плохим людям будет проще найти: кого ограбить. И кому впарить за взятки свой Azure например.


  1. nevzorofff
    12.10.2016 22:44

    Я вот чего не понимаю:
    У меня на счету лежат деньги от десяти контрагентов.
    Я отправил их в двадцать разных мест, налоги, ПФР, запрлата, своим поставщикам.

    Кто решает какие деньги я куда отправил? Ведь на р/с они все в одной куче и при оплате я не выбираю деньги какого контрагента кому отправить.


    1. TimsTims
      12.10.2016 23:02
      +1

      И это правда. А вот более сложный случай:
      Допустим есть «Юр.лицо 1», которое ведет свою небольшую коммерческую деятельность.
      Это «юр.лицо 1», допустим, иногда занимается запрещенным транзитом денег (когда этому юр.лицу якобы заплатили за услуги или товар, которое ЯКОБЫ это юр.лицо поставило, а на самом деле это юр.лицо просто перевело деньги дальше). Так вот, это «юр.лицо 1» получило 1млн от другого «юр.лица 2», чтобы «юр.лицо 1» перевело 1млн на счет «юр.лица 3». Но «юр.лицо 1» вместо этого изображает из себя хорошую и порядочную организацию и перечисляет деньги на закупку товаров своему хорошему и крупному поставщику «юр.лицу 4». А через 1 день, «юр.лицу 1» возвращает дебиторский долг совсем другая организация «юр.лицо 5». Используя этот долг, и совсем напрочь смешав деньги, «юр.лицо 1» наконец-то перечисляет этот самый 1млн на счет «юр.лица 3».

      Из предлагаемой системы блокчейнов получится, что юр.лицо1 сделало транзит денег НЕ ОТ юр.лица2, а от юр.лица3. И в этой всей песне блокчейнов, юр.лицо2 нигде не «засветится», т.к. фактически, её ПОМЕЧЕННЫЕ РУБЛИ ушли крупному поставщику товаров, а не на счет отмывальщика юр.лица3.


      1. Schvepsss
        14.10.2016 10:25

        Действительно, ваш пример вполне реализуем. Но, для его воспроизведения нужно, чтобы «Юр.лицо 1» имело обороты превышающие или хотя бы сопоставимые транзитным деньгам. Обнаружение тем не менее должно произойти с использованием уже существующих механизмов, и здесь идея команды действительно мало поможет. Далее нужно выявить участников этого транзита. Так как транзакции тянут за собой хвост, то он приведёт к «Юр.лицу 1» и ему как минимум начнут задавать неудобные вопросы. Таким образом, получив небольшую выгоду от незаконного транзита, «Юр.лицо 1» обретает проблемы с контролирующими или иными органами. Такая ситуация будет экономически нецелесообразна для «Юр.лица 1», что должно исключить желание участвовать в подобного рода аферах.

        В случае же когда объём транзита значительно выше оборотов «Юр.лица 1», до «Юр.лица 3» дойдёт значительна часть исходных денег, полученных от «Юр.лица 2».

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


    1. quantum
      13.10.2016 10:11

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


  1. vitiko
    12.10.2016 22:49
    +1

    1. Почему использовали Ethereum, а не, например, Eris? они обещают PoS, что должно быть быстрее
    2. Кто будет майнерами в рабочей системе — ограниченный консорциум банков?
    2. Как планируете использовать смарт контракты в данной системе?


    1. TimsTims
      12.10.2016 23:11
      +1

      1. Почему использовали Ethereum
      Полагаю, это была лишь концепция, чтобы показать жизнеспособность системы. Естественно, никто не будет создавать систему, полагаясь на кем-то так или иначе контролируемую систему/протоколы, т.е. всё будут создавать под банки.

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


    1. Schvepsss
      14.10.2016 10:28
      +1

      1. Да, так как прототип создавался в рамках хакатона длиною в сутки, было использовано готовое решение, которое можно быстро развернуть.

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

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


  1. varnav
    13.10.2016 12:30

    Проблемы в банковской сфере, которые можно решить с помощью блокчейн

    Нужно писать либо «решить с помощью блокчейна» либо «решить с помощью технологии блокчейн».


    1. Schvepsss
      14.10.2016 10:09

      Спасибо, исправлено.


  1. ibrmax
    13.10.2016 12:47

    1. Идея отслеживания пути прохождения валюты в блокчейне не нова, она появилась вместе с биткоином. В чём же ваша отличительная особенность?
    2. И всё-таки как на счёт смарт-контрактов? Получается что Вы в Ethereum даже не создали собственную валюту, хотя там есть уже готовые контракты под это. А любой майнер будет получать ether, которым Вы оперируете.
    3. И самый волнующий вопрос. Как Вы планируете обеспечить пропускную способность в тысячи, а может быть даже и миллионы транзакций в секунду?


    1. densmirnov
      14.10.2016 05:49

      2. Я так понимаю, была задача показать работающий прототип, который проще реализовать в рамках тестовой сети. Ничего не мешает подобным же образом развернуться, используя уже собственный токен. Больше того, даже эфир не является обязательным условием.
      3. Сам эфириум после одного из запланированных апдейтов предполагает проведение 10000+ транзакций в секунду, что не является пределом. Другие же технологии (к примеру NEM или Lisk), позволяют в будущем конкурировать с пропускной способностью Visa и пр. (Nem, по идее, уже сейчас позволяет)


    1. Schvepsss
      14.10.2016 10:44

      1. Помечаются не конкретные транзакции, а деньги внутри них. Так в рамках одной транзакции может ехать несколько «пачек», полученных из разных источников. Также, при «размене» история не теряется.

      2. Для такой деликатной сферы, как банковская, сеть блокчейн должна быть закрытой, поэтому там будет строго ограниченный круг участников. «Майнинга» как такового в этой сети также не предполагается. У участников будет другая мотивация — обеспечение целостности данных в сети.

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


  1. densmirnov
    14.10.2016 05:45
    +1

    Спасибо за материал, довольно интересно!


    1. Schvepsss
      14.10.2016 10:44
      +1

      Спасибо за фидбэк. Приятно слышать!