Введение
На дворе 21 век. Век новых технологий, научных прорывов и, что самое главное, век нового общества. С каждым годом это самое общество всё больше нуждается в безопасности: на улице, в интернете, в общественных местах, в различных сферах жизнедеятельности люди хотят чувствовать себя спокойно.
Одной из таких сфер является финансовая система. Каждую секунду совершаются тысячи, если не миллионы переводов и транзакций. Это могут быть переводы между юридическими лицами, компаниями, или просто от бабушки, которая перевела тебе деньги на мороженое. Эти деньги при переводе должны оставаться в безопасности. Мы, как клиенты тех или иных банков, должны быть уверены, что с этими деньгами ничего не случится, что их никто не сможет забрать или украсть.
Но можно ли переводить деньги между лицами анонимно, напрямую, не нуждаясь в различных посредниках в виде, например, тех самых банков? И можно ли быть уверенным, что в такой системе невозможно потерять передаваемую валюту? Всё это свидетельствует об актуальности работы. В проекте показано, как можно создать систему переводов и кошельков напрямую, без посредников.
Цели проекта:
Разобраться в технологиях электронных транзакций и переводов;
Узнать, как работает технология блокчейна, шифрования данных и передачи пакетов через сеть при помощи WinSock;
Создать три консольных приложения на языке C++, работающих отдельно друг от друга, способных подключаться и передавать между собой данные по сети;
Интегрировать систему блокчейна в проект.
Задачи:
Написать систему передачи данных через сеть, используя технологию WinSock;
Написать алгоритм шифрования для передачи данных между приложениями;
Реализовать технологию Блокчейна, не прибегая к сторонним библиотекам;
Реализовать систему Сервер-Клиент/Майнер с аутентификацией клиентов и хранением паролей на сервере;
Практическая значимость:
Данный проект является уменьшенной версией настоящего блокчейна, используемого для цифровых переводов. Это означает, что при масштабировании проекта его можно использовать в коммерческих целях для обеспечения безопасного и быстрого проведения транзакций между несколькими лицами.
Краткий обзор литературы:
Из книги “Цифровое золото: невероятная история Биткойна, или Как идеалисты и бизнесмены изобретают деньги заново” Н. Поппера я узнал подробную историю создания Биткоина – первой криптовалюты мира.
Прочитав статью А. Мичурина, “RSA-шифрование на пальцах”, я узнал, как работает алгоритм шифрования RSA и как его можно реализовать на языке программирования C++.
Личный вклад состоит в изучении возможностей технологии WinSock, реализация собственного алгоритма шифрования для передачи данных, реализация технологии Блокчейна, изучение возможностей языка C++.
Раздел 1. Теоретическая часть
Для начала, надо разобраться, какую систему цифровых переводов используют современные банки.
Электронный перевод средств (Electronic Funds Transfer, сокр. EFT) – электронный перевод с одного банковского счёта на другой. EFT работает через сеть финансовых учреждений, подключенных друг к другу для перевода средств с одного банковского счета на другой. Чтобы осуществить перевод, отправитель должен предоставить номер своего счёта, номер счёта получателя и сумму перевода. Транзакция обрабатывается привлеченными банками и может длиться от нескольких дней до нескольких минут, в зависимости от выбранного типа перевода.
EFT – собирательный термин, который относится к ряду различных типов переводов. Выделяют несколько основных:
переводы через банкомат (ATM);
переводы по телефону;
переводы по QR-коду;
прямые дебетовые платежи, с помощью которых бизнес взымает денежные средства со счёта покупателя для оплаты товаров и услуг;
банковские переводы через международную сеть SWIFT;
мгновенные переводы;
Система EFT достаточно быстра, позволяет мгновенно в реальном времени отправлять платежи с одних банковских счетов на другие. Но такие переводы часто облагаются высокой комиссией, и, что самое главное, банки, принимающие участие в денежном переводе, будут всегда знать о суммах перевода, отправителях и получателях, что не даёт EFT право называться анонимной системой платежей. Но чем же можно заменить классическую систему перевода средств?
Выходом из этой ситуации может являться система Блокчейн (Blockchain).
Блокчейн - непрерывная последовательная цепочка блоков (другими словами, связный список), содержащих какую-либо информацию. Главной особенностью блокчейна является связь между блоками не только с помощью нумерации, но и тем, что каждый блок цепочки содержит свою собственную хэш-сумму и хэш-сумму предыдущего блока. Изменение любой информации в блоке изменит и его хэш-сумму.
Тут стоит упомянуть непосредственно о хешировании. Оно представляет собой преобразование любого объема информации в уникальный набор символов постоянной длины. Этот набор символов и называется хэшем. Каждый такой набор символов будет уникальным для каждого массива входящей информации. Это значит, что даже при незначительном изменении входной информации, её хэш будет полностью меняться. Важной особенностью хэша является необратимость. Это означает, что хэш-функция не позволяет восстанавливать исходный массив информации из строки хэша. Данная особенность делает хэш одной из важнейших составляющих современной криптографии и алгоритма Блокчейна.
Изначально технология Блокчейна не разрабатывалась, как технология для проведения транзакций между пользователями. Впервые протокол, подобный блокчейну, предложил американский криптограф Дэвид Чаум в своей диссертации 1982 года «Компьютерные системы, созданные, поддерживаемые и пользующиеся доверием взаимно подозрительных групп». Далее, С. Хабер и У. Скотт Сторнетта в 1991 году в своей работе описали криптографически защищённую цепочку блоков. Математики преследовали цель внедрить систему, в которой временны́е метки документов нельзя было бы подделать. В 1992 году Хабер, Сторнетта и Дейв Бейер включили в свою технологию древо хешей, что повысило её эффективность, позволив собирать несколько сертификатов документов в один блок. Поняв коммерческий потенциал разрабатываемой технологии, исследователи создали сервис временных меток под названием Surety, чтобы привести свою схему в действие.
В 2008 году разработчик под псевдонимом Сатоши Накамото (реальная личность человека или группы, работающей под этим псевдонимом, до сих пор остаётся неизвестной) предложил общий алгоритм системы Биткоин, ключевым элементом которой была система из непрерывной последовательной цепочки блоков информации, названной blockchain. Принципиальным отличием от всех предыдущих вариантов подобных технологий стало объединение цепного хэша с формальным механизмом выработки консенсуса о корректности очередного блока, что позволило во всей системе отказаться от необходимости верификации информации доверенным агентом (администратором) и система в целом стала децентрализованной. В 2009 году была запущена первая версия криптовалюты биткойн с реализацией блокчейна, который обеспечивает хранение всех транзакций в системе.
Преимущества Блокчейна:
Децентрализация. Цепочка блоков работает при помощи сети участников, исключая необходимость задействования централизованного управления и посредников в виде банков. Это обеспечивает безопасный, прозрачный, открытый и, что самое главное, анонимный доступ к информации и управлению системой.
Прозрачность. Так как блокчейн является публичным реестром, все транзакции видны для всех участников сети. Это повышает доверие и открытость в отношениях между участниками. Это может являться и недостатком блокчейна, ведь любой человек может просмотреть данные о транзакции, но в отличие от вышеупомянутой системы EFT, в блокчейне хранятся лишь адреса участников транзакций и сумма перевода; никаких имён, фамилий и банковских счетов.
Безопасность и надёжность. Как уже было сказано выше, блокчейн использует криптографию для обеспечения безопасности транзакций и передаваемых данных и имеет высокую устойчивость к атакам и сбоям. Каждый блок связан с предыдущим с использованием хэш-функций, что максимально затрудняет возможность изменения информации.
Таким образом, можно сказать, что у блокчейна практически нет недостатков, за исключением возможности осуществления атак, для обеспечения защиты от которых потребляется большое количество энергии, но об этом мы поговорим уже в практической части проекта.
Неотъемлемой частью работы алгоритма Блокчейна, как уже было сказано выше, является шифрование. Существует два основных вида криптографических алгоритмов шифрования: симметричный и ассиметричный. Они отличаются тем, что в симметричных алгоритмах для шифрования и дешифрования используется один и тот же криптографический ключ, а в ассиметричном шифровании используется два ключа: открытый и закрытый. Получатель генерирует пару ключей. Открытый ключ передаётся по незащищённым каналам связи от получателя отправителю, чтобы последний смог зашифровать по нему данные. Второй ключ (закрытый) остаётся у получателя, который расшифровывает по нему информацию. Такой подход решает главную проблему симметричного метода шифрования, при котором для кодирования и расшифровки используется один и тот же ключ. Если передать такой ключ по незащищённым каналам, его могут перехватить и получить доступ к зашифрованным данным. В ассиметричном же методе злоумышленник сможет получить только открытый ключ, который используется для шифрования, но не для расшифровки сообщений.
Таким образом, ассиметричный метод шифрования на сегодняшний день является лучшим вариантом для безопасной передачи данных, но такой метод намного медленнее симметричного, поэтому во многих криптосистемах применяются и те, и другие алгоритмы.
Раздел 2. Практическая часть
Изучение огромного пласта теории закончено, что позволяет приступить к работе по созданию программного обеспечения. Но до этого необходимо определиться с языком, который лучше всего подойдёт для решения поставленных задач.
Мной был выбран язык C++ и Visual Studio как среда разработки. Данный язык выбран за обширное количество возможностей и библиотек, которые позволяют писать более эффективный и оптимизированный код.
Для начала нужно определиться с концепциями разработки. Практическая часть моего проекта делится на три части, на отдельно друг от друга функционирующих приложения. Данную концепцию было решено назвать Server to Client/Miner. Главным из трёх приложений является Сервер. Он связывает всех клиентов и майнеров воедино, а также является одной из нод блокчейна, но об этом мы поговорим далее. Все клиенты и майнеры подключаются к серверу, обмениваются с ним данными при помощи библиотеки WinSock.
WinSock, в двух словах, - интерфейс, созданный для разработки сетевых приложений под ОС Windows. Он определяет, как именно приложения будут получать доступ к сетевым службам, а именно к системе протоколов TCP/IP. Работа WinSock основана на, так называемых, сокетах, или розетках. Каждое устройство в проекте (Device) получает свой сокет, в который входит IP-адрес, порт и семейство адресов. С помощью сокетов устройства могут взаимодействовать между собой и обмениваться пакетами, содержащими определённое количество байт.
Для обеспечения шифрования в проекте мной был выбран алгоритм шифрования RSA, так как он наиболее надежный из алгоритмов ассиметричного шифрования. Для его реализации с нуля был создан класс RSA, содержащий несколько методов для генерации простых чисел, создания ключей, а также несколько математических функций, вроде расширенного алгоритма Евклида и быстрого возведения в степень по модулю.
При включении любого устройства, генерируется пара ключей, открытый ключ из которых передаётся по сети.
Как же работает сам блокчейн? Он работает на основе сети, состоящей из, так называемых, нод (nod англ.). Нода (или иначе узел) – это точка в блокчейн-сети, основная функция которой сводится к распределению данных между другими узлами. Это нужно для передачи информации внутри блокчейна с одновременным сохранением эффекта децентрализации. Технически, нода – это компьютер (сервер) с установленным криптовалютным кошельком, который синхронизирован с другими такими же компьютерами. Связка таких узлов образует блокчейн. Использование подобной сети дает возможность быстро распределять большие потоки данных.
Зачастую почти каждая нода хранит копию блокчейна. В блоки цепочки записываются транзакции, получаемые от пользователей. В каждом блоке генерируется хэш из всех данных, находящихся в блоке. Под данными подразумеваются транзакции, номер блока и хэш предыдущего блока.
Тут же возникает проблема. Ведь пользователь может изменить данные в каком-то блоке (например, изменить получателя транзакции на себя) и пересчитать хэш этого блока. Но хэш блока, в котором пользователь поменял данные, находится в хэше следующего (тут отчётлива видна взаимосвязь между блоками). Если пользователь пересчитает хэши всех последующих блоков, то блокчейн окажется корректен, а его новая транзакция без проблем останется внутри цепочки.
Чтобы решить эту проблему и не позволить посторонним лицам изменять данные в блокчейне, можно использовать алгоритм ProofofWork (PoW). Этот алгоритм не позволяет просто взять и записать новый хэш, потому что остальные участники блокчейна не примут блок с новым хэшем без проделывания определённого количества работы. Работа заключается в том, чтобы перебирать числа, пока хэш блока, содержащего данные блока и это число не будет начинаться с определённого количества нулей. Чем больше нулей, тем выше сложность, потому что вероятность получить блок с одним нулём в начале равна 1к10, а вероятность получить блок с двумя нулями 1к100, с тремя нулями 1к1000 и так далее. То есть, чтобы найти хэш блока со сложностью 3 надо в среднем перебрать тысячу чисел.
Тут как-раз в игру вступают майнеры, потому что вся безопасность алгоритма Proof of Work строится на том, что именно майнеры, а не обычные пользователи, будут искать блоки быстрее тех, кто попытается изменить в них информацию, потому что у них вместе взятых больше мощности, чем у человека, который в одиночку хочет изменить данные в блокчейне. А также, цепочка блоков, которая хранится у майнеров, будет длиннее, а значит пользователи будут считать их цепочку верной, а злоумышленников отбрасывать, потому что у них копия блокчейна будет намного короче.
Но в данном алгоритме проявляется один из главных недостатков блокчейна – возможность проведения “Атаки 51”. Она заключается в том, что если у пользователя, пытающегося изменить данные в блокчейне, будет больше 50% сети (то есть больше, чем у остальных майнеров вместе взятых), то его цепочка блоков будет расти быстрее, а значит этот пользователь сможет изменить данные в блокчейне, а позже догнать и перегнать всех майнеров. Тогда все остальные пользователи будут считать правильным его копию блокчейна.
В проекте узлами сети является сервер и майнеры. При запуске сервера, создаётся оригинальная копия блокчейна. Но, как мы уже выяснили, для корректной работы всей сети недостаточно только одного сервера. Нужны майнеры. И чем больше, тем лучше.
Сервер хранит оригинальную копию блокчейна. Он, как уже было сказано выше, связывает вместе все устройства. К нему одновременно могут подключатся и обычные клиенты, и майнеры. Через сервер все они могут обмениваться пакетами данных. Для обмена данными с помощью WinSock в моём проекте был создан класс Package, в котором происходит отправка и получение пакетов, шифрование и преобразования массива данных в удобный в работе тип данных string.
Каждый пакет состоит из двух частей: метаинформация и, собственно, все передаваемые данные. В метаинформации хранится код пакета, например, s для системных пакетов (system), t для транзакций (transactions), b для пакетов, связанных с блокчейном (blockchain) и так далее. После кода идёт специальный номер пакета. Он нужен для того, чтобы для каждого типа пакета определять различные подпакеты. Например, t100 для отправки транзакции, t900 для отправки информации о том, что транзакция записана в блокчейны сервера и майнеров успешно.
Майнеры подключаются к серверу и скачивают к себе оригинальную копию блокчейна. После завершения скачивания, майнер начинает “добывать” блок, то есть перебирать числа, пока хэш всего блока не будет начинаться с 5 нулей (в своём проекте я решил использовать сложность лишь в 5 нулей, но при масштабировании её с лёгкостью можно изменить, жертвуя большим временем на добычу). После добычи блока, он отправляется на сервер, и если данные блока корректны, записывается в главный блокчейн и рассылается другим майнерам, которые не успели добыть этот блок. После этой операции добыча в каждом из майнеров начинается заново.
Клиент – ещё одно приложение моего проекта. Клиентская часть уже имеет свой интерфейс и функционал, адаптированный для обычных пользователей. В этот проект также интегрирована полноценная система авторизации и аккаунтов. При запуске клиентского приложения, система предлагает пользователю авторизоваться, либо создать новый аккаунт. Все аккаунты хранятся на сервере в виде текстовых файлов, в каждом из которых хранится хэш пароля, ID аккаунта и текущий баланс). Для обеспечения защиты, пароли передаются и сравниваются только в хэшах, чтобы избежать утечки паролей. На устройстве клиента ничего не хранится, все данные передаются с помощью уже вышеупомянутых сокетов по сети (собственно, как и на устройстве майнера). При успешной авторизации, пользователю предлагается провести транзакцию. И тут проявляется ещё одна важная технология проекта.
Пакет с транзакцией – самый важный пакет из всех. При его потере и изменении, есть вероятность, что в блокчейн запишется неправильная информация. Для безопасности и защиты от подмены, используется цифровая подпись. Цифровая подпись нужна для проверки целостности передаваемого пакета. Система подписи заключается в отправке не одного, а сразу двух пакетов. Если второй – это уже всем нам знакомый обычный пакет, то предшествующий ему – это пакет с хэшем данных второго пакета. Получатель сравнивает полученный в первом пакете хэш с полученными данными, и, если хэши различаются, это значит, что данные были потеряны, либо изменены.
Полученные сервером транзакции записываются в последний незаконченный блок цепочки (блок, хэш которого в данный момент ищут майнеры), а также отправляются всем майнерам, которые, после получения, добывают блоки уже с изменёнными данными.
Заключение
В результате проведённой работы, мы узнали о современных способах передавать денежные средства по сети, подробно разобрали концепцию и алгоритм работы сети блокчейн, а также немного затронули темы шифрования, работы с сетями и пакетами.
В ходе реализации исследовательской работы выполнены все поставленные задачи:
Написана система передачи данных через сеть, с использованием технологии WinSock;
Написан алгоритм шифрования для передачи данных между приложениями;
Реализована технология Блокчейна без использования сторонних библиотек;
Реализована система Сервер-Клиент/Майнер с аутентификацией клиентов и хранением паролей на сервере.
В практической части мной были созданы три различных консольных приложения: Сервер, Клиент и Майнер. Мы разобрали, какую функцию выполняет каждый из типов устройств, узнали поподробнее о системе майнинга и алгоритме Proof of Work.
Созданное мной программное обеспечение гарантирует целостность и безопасность передаваемых данных и удовлетворяет всем нормам криптобезопасности. Оно может быть использовано даже теми, кто далёк от области крипто транзакций и криптографии. С помощью неё можно за доли секунды совершить транзакцию в любую точку мира анонимно, безопасно и без каких-либо посредников. Только отправитель, получатель и узел сети.
Работа над созданием проекта позволила мне лучше познакомиться с концепцией блокчейна и криптографией. Я считаю, что проект достигнул поставленной цели и решает все поставленные ранее задачи.
Далее я планирую продолжить работу над проектом, потому что у него есть огромный потенциал. При масштабировании проекта, его можно применять для решения промышленных и коммерческих задач. Например, чтобы быстро передавать денежные средства в большом объёме анонимно, не опасаясь, что они пропадут или отправятся не тому.
Список литературы
Н. Поппер, “Цифровое золото: невероятная история Биткойна, или Как идеалисты и бизнесмены изобретают деньги заново”
А. Генкин, А. Михеев, “Блокчейн: Как это работает и что ждет нас завтра”
Википедия. “Блокчейн”,
https://en.wikipedia.org/wiki/Blockchain
А. Мичурин, RSA-шифрование на пальцах,
http://www.michurin.net/computer-science/rsa.html
Википедия, “Доказательство выполнения работы”,
https://en.wikipedia.org/wiki/Proof_of_work
“Winsock для всех”,
https://club.shelek.ru/viewart.php?id=35
В. Федотова, Б. Емельянов, Л. Типнер, “Понятие блокчейн и возможности его использования”,
https://cyberleninka.ru/article/n/ponyatie-blokcheyn-i-vozmozhnosti-ego-ispolzovaniya