Занурення в технологію блокчейн: Швидкі та безпечні транзакції

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

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



Проблеми у банківській сфері, які можна вирішити з допомогою блокчейн
Так як представники проекту працюють у банківській сфері, вони не з чуток знайомі з проблемою розрахунку між юридичними особами: цей процес може тривати до трьох днів, що вкрай довго для малого бізнесу і динамічних підприємців. Крім того, у банків сьогодні є ще одна проблема: частина безготівкових розрахунків між компаніями є «транзитом» чорних грошей. Зазвичай це дуже складно визначити, тому що немає ланцюжка проходження транзакції і зв'язку між ними. Немає історії руху грошей в інших банках. Банки придумують різні аналітичні алгоритми, щоб виявляти такі транзакції. Але і вони часто помиляються, так як не вистачає даних для повноцінного аналізу. У свою чергу, мережа блокчейн передбачає єдиний розподілене сховище транзакцій. Це означає, що кожен платіж назавжди залишається в єдиній базі руху коштів, тому для аналізу завжди доступний весь грошовий потік.

Швидкість платежів

Проблему швидкості платежів вирішує те, що транзакції в блокчейн відбуваються миттєво. Єдиним сповільнює фактором може стати час, що приймаюча сторона буде очікувати підтвердження цієї транзакції, так як вони приходять від інших учасників мережі — 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",
"екстраданих": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82ee",
"gasLimit": "0x4c4b40"
}

Після цього створюємо перший запис:

geth --datadir "chains/devtest" new account

І запускаємо майнінг:

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"": [{
""з"": ""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 з одного рахунку на інший — вже теми майбутніх статей.

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


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.