Автор оригинала: Kumar Chandrakant.
1. Обзор
В этом уроке мы познакомимся с основными концепциями технологии блокчейн. Мы также реализуем базовое приложение на Java, которое фокусируется на концепциях.
Далее мы обсудим некоторые передовые концепции и практическое применение этой технологии.
2. Что Такое Блокчейн?
Итак, давайте сначала разберемся, что же такое блокчейн…
Ну, он прослеживает свое происхождение до белой книги , опубликованной Сатоши Накамото на биткойне , еще в 2008 году.
Блокчейн-это децентрализованный реестр информации . Он состоит из блоков данных, соединенных с помощью криптографии. Он принадлежит к сети узлов, подключенных через общедоступную сеть. Мы поймем это лучше, когда позже попытаемся создать базовый учебник.
Есть некоторые важные атрибуты, которые мы должны понять, поэтому давайте рассмотрим их:
- Защита от несанкционированного доступа: В первую очередь, данные как часть блока защищены от несанкционированного доступа . На каждый блок ссылается криптографический дайджест, обычно известный как хэш, что делает блок защищенным от несанкционированного доступа.
- Децентрализованный: весь блокчейн полностью децентрализован по всей сети. Это означает, что нет главного узла, и каждый узел в сети имеет одну и ту же копию.
- Прозрачный: Каждый узел, участвующий в сети , проверяет и добавляет новый блок в свою цепочку через консенсус с другими узлами. Следовательно, каждый узел имеет полную видимость данных.
3. Как Работает Блокчейн?
Теперь давайте разберемся, как работает блокчейн.
Фундаментальными единицами блокчейна являются блоки . Один блок может инкапсулировать несколько транзакций или другие ценные данные:
3.1. Майнинг блока
Мы представляем блок хэш-значением. Генерация хэш-значения блока называется “майнингом” блока. Майнинг блока, как правило, требует больших вычислительных затрат, поскольку он служит “доказательством работы”.
Хэш блока обычно состоит из следующих данных:
- В первую очередь хэш блока состоит из транзакций, которые он инкапсулирует
- Хэш также состоит из временной метки создания блока
- Он также включает в себя nonce, произвольное число, используемое в криптографии
- Наконец, хэш текущего блока также включает в себя хэш предыдущего блока
Несколько узлов в сети могут конкурировать за добычу блока одновременно. Помимо генерации хэша, узлы также должны проверить, что транзакции, добавляемые в блок, являются законными. Первый, кто добудет блок, выиграет гонку!
3.2. Добавление блока в блокчейн
В то время как майнинг блока является вычислительно дорогостоящим, проверка того, что блок является законным, относительно намного проще . Все узлы в сети участвуют в проверке недавно добытого блока.
Таким образом, недавно добытый блок добавляется в блокчейн на основе консенсуса узлов.
Теперь существует несколько консенсусных протоколов, которые мы можем использовать для проверки. Узлы в сети используют один и тот же протокол для обнаружения вредоносной ветви цепочки. Следовательно, вредоносная ветвь, даже если она будет введена, вскоре будет отклонена большинством узлов.
4. Базовый блокчейн на Java
Теперь у нас достаточно контекста, чтобы начать создавать базовое приложение на Java.
Наш простой пример здесь проиллюстрирует основные понятия мы только что видели. Приложение производственного уровня влечет за собой множество соображений, которые выходят за рамки этого руководства. Однако позже мы коснемся некоторых продвинутых тем.
4.1. Реализация блока
Во-первых, нам нужно определить простой POJO, который будет содержать данные для нашего блока:
public class Block { private String hash; private String previousHash; private String data; private long timeStamp; private int nonce; public Block(String data, String previousHash, long timeStamp) { this.data = data; this.previousHash = previousHash; this.timeStamp = timeStamp; this.hash = calculateBlockHash(); } // standard getters and setters }
Давайте разберемся, что мы здесь упаковали:
- Хэш предыдущего блока, важная часть для построения цепочки
- Фактические данные, любая информация, имеющая ценность, например контракт
- Временная метка создания этого блока
- Nonce, который является произвольным числом, используемым в криптографии
- Наконец, хэш этого блока, вычисленный на основе других данных
4.2. Вычисление хэша
Теперь, как мы вычисляем хэш блока? Мы использовали метод вычисления хэша блока , но еще не видели его реализации. Прежде чем мы реализуем этот метод, стоит потратить некоторое время, чтобы понять, что именно является хэшем.
Хэш-это результат чего-то, известного как хэш-функция. A хэш-функция сопоставляет входные данные произвольного размера с выходными данными фиксированного размера . Хэш довольно чувствителен к любому изменению входных данных, каким бы незначительным оно ни было.
Более того, невозможно получить входные данные обратно только из его хэша. Эти свойства делают хэш-функцию весьма полезной в криптографии.
Итак, давайте посмотрим, как мы можем сгенерировать хэш нашего блока в Java:
public String calculateBlockHash() { String dataToHash = previousHash + Long.toString(timeStamp) + Integer.toString(nonce) + data; MessageDigest digest = null; byte[] bytes = null; try { digest = MessageDigest.getInstance("SHA-256"); bytes = digest.digest(dataToHash.getBytes(UTF_8)); } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) { logger.log(Level.SEVERE, ex.getMessage()); } StringBuffer buffer = new StringBuffer(); for (byte b : bytes) { buffer.append(String.format("%02x", b)); } return buffer.toString(); }
Здесь происходит довольно много вещей, давайте разберемся в них подробнее:
- Во-первых, мы объединяем различные части блока, чтобы сгенерировать хэш из
- Затем мы получаем экземпляр хэш-функции SHA-256 из Дайджеста сообщений
- Затем мы генерируем хэш-значение наших входных данных, которое представляет собой массив байтов
- Наконец, мы преобразуем массив байтов в шестнадцатеричную строку, хэш обычно представляется в виде 32-значного шестнадцатеричного числа
4.3. Мы уже Добыли Блок?
Пока все звучит просто и элегантно, за исключением того факта, что мы еще не добыли блок. Так что же именно влечет за собой майнинг блока, который уже некоторое время захватил воображение разработчиков!
Ну, майнинг блока означает решение вычислительно сложной задачи для блока. В то время как вычисление хэша блока несколько тривиально, найти хэш, начинающийся с пяти нулей, нет. Еще сложнее было бы найти хэш, начинающийся с десяти нулей, и мы получим общее представление.
Итак, как именно мы можем это сделать? Честно говоря, решение гораздо менее причудливое! Именно с помощью грубой силы мы пытаемся достичь этой цели. Мы используем здесь nonce:
public String mineBlock(int prefix) { String prefixString = new String(new char[prefix]).replace('\0', '0'); while (!hash.substring(0, prefix).equals(prefixString)) { nonce++; hash = calculateBlockHash(); } return hash; }
Давайте посмотрим, что мы здесь пытаемся сделать.:
- Мы начинаем с определения префикса, который мы хотим найти
- Затем мы проверяем, нашли ли мы решение
- Если нет, мы увеличиваем nonce и вычисляем хэш в цикле
- Цикл продолжается до тех пор, пока мы не сорвем джекпот
Мы начинаем со значения по умолчанию nonce здесь и увеличиваем его на единицу. Но есть более сложные стратегии для запуска и увеличения nonce в реальных приложениях. Кроме того, мы не проверяем наши данные здесь, что обычно является важной частью.
4.4. Давайте рассмотрим пример
Теперь, когда мы определили наш блок вместе с его функциями, мы можем использовать его для создания простого блокчейна. Мы сохраним это в ArrayList :
Listblockchain = new ArrayList<>(); int prefix = 4; String prefixString = new String(new char[prefix]).replace('\0', '0');
Кроме того, мы определили префикс из четырех, что фактически означает, что мы хотим, чтобы наш хэш начинался с четырех нулей.
Давайте посмотрим, как мы можем добавить блок здесь:
@Test public void givenBlockchain_whenNewBlockAdded_thenSuccess() { Block newBlock = new Block( "The is a New Block.", blockchain.get(blockchain.size() - 1).getHash(), new Date().getTime()); newBlock.mineBlock(prefix); assertTrue(newBlock.getHash().substring(0, prefix).equals(prefixString)); blockchain.add(newBlock); }
4.5. Верификация блокчейна
Как узел может подтвердить, что блокчейн действителен? Хотя это может быть довольно сложно, давайте подумаем о простой версии:
@Test public void givenBlockchain_whenValidated_thenSuccess() { boolean flag = true; for (int i = 0; i < blockchain.size(); i++) { String previousHash = i==0 ? "0" : blockchain.get(i - 1).getHash(); flag = blockchain.get(i).getHash().equals(blockchain.get(i).calculateBlockHash()) && previousHash.equals(blockchain.get(i).getPreviousHash()) && blockchain.get(i).getHash().substring(0, prefix).equals(prefixString); if (!flag) break; } assertTrue(flag); }
Итак, здесь мы делаем три конкретные проверки для каждого блока:
- Сохраненный хэш текущего блока на самом деле является тем, что он вычисляет
- Хэш предыдущего блока, хранящийся в текущем блоке, является хэшем предыдущего блока
- Текущий блок был добыт
5. Некоторые Передовые Концепции
Хотя наш базовый пример раскрывает основные концепции блокчейна, он, безусловно, не является полным. Чтобы применить эту технологию на практике, необходимо учесть несколько других соображений.
Хотя невозможно подробно описать все из них, давайте рассмотрим некоторые из важных:
5.1. Проверка транзакций
Вычисление хэша блока и поиск нужного хэша – это всего лишь одна часть майнинга. Блок состоит из данных, часто в виде нескольких транзакций. Они должны быть проверены, прежде чем их можно будет сделать частью блока и добыть.
Типичная реализация блокчейна устанавливает ограничение на то, сколько данных может быть частью блока . Он также устанавливает правила проверки транзакции . В процессе проверки участвуют несколько узлов сети.
5.2. Альтернативный Консенсусный протокол
Мы видели, что алгоритм консенсуса, такой как “Доказательство работы”, используется для добычи и проверки блока. Однако это не единственный алгоритм консенсуса, доступный для использования.
Существует несколько других алгоритмов консенсуса на выбор , таких как Доказательство ставки, Доказательство авторитета и Доказательство веса. Все это имеет свои плюсы и минусы. Какой из них использовать, зависит от типа приложения, которое мы намерены разработать.
5.3. Вознаграждение за добычу полезных ископаемых
Блокчейн-сеть обычно состоит из добровольных узлов. Итак, почему кто-то хочет внести свой вклад в этот сложный процесс и сохранить его законным и растущим?
Это происходит потому, что узлы вознаграждаются за проверку транзакций и майнинг блока . Эти награды, как правило, в виде монет, связанных с приложением. Но приложение может решить, что вознаграждение будет чем-то ценным.
5.4. Типы узлов
Блокчейн полностью полагается на свою сеть для работы. Теоретически сеть полностью децентрализована, и каждый узел равен. Однако на практике сеть состоит из нескольких типов узлов.
В то время как полный узел имеет полный список транзакций, легкий узел имеет только частичный список . Кроме того, не все узлы участвуют в проверке и валидации.
5.5. Безопасная связь
Одной из отличительных черт технологии блокчейн является ее открытость и анонимность. Но как он обеспечивает безопасность транзакций, осуществляемых внутри? Это основано на криптографии и инфраструктуре открытых ключей .
Инициатор транзакции использует свой закрытый ключ для его защиты и прикрепляет его к открытому ключу получателя. Узлы могут использовать открытые ключи участников для проверки транзакций.
6. Практическое применение блокчейна
Таким образом, блокчейн кажется захватывающей технологией, но она также должна оказаться полезной. Эта технология существует уже некоторое время, и – излишне говорить – она оказалась разрушительной во многих областях.
Его применение во многих других областях активно продолжается. Давайте разберемся в самых популярных приложениях:
- Валюта : Это, безусловно, самое старое и наиболее широко известное использование блокчейна, благодаря успеху Биткойна. Они обеспечивают безопасные и свободные от трений деньги людям по всему миру без какого-либо вмешательства центральной власти или правительства.
- Идентичность : Цифровая идентичность быстро становится нормой в современном мире. Однако это связано с проблемами безопасности и вмешательством. Блокчейн неизбежно революционизирует эту область с помощью полностью безопасных и защищенных от несанкционированного доступа идентификационных данных.
- Здравоохранение : Отрасль здравоохранения загружена данными, в основном обрабатываемыми центральными органами власти. Это снижает прозрачность, безопасность и эффективность обработки таких данных. Технология блокчейн может обеспечить систему без какой-либо третьей стороны, чтобы обеспечить столь необходимое доверие.
- Правительство : Это, возможно, область, которая хорошо открыта для разрушения технологией блокчейн. Правительство, как правило, находится в центре нескольких гражданских служб, которые часто обременены неэффективностью и коррупцией. Блокчейн может помочь установить гораздо лучшие отношения между правительством и гражданами.
7. Инструменты торговли
Хотя наша базовая реализация здесь полезна для выявления концепций, нецелесообразно разрабатывать продукт на блокчейне с нуля. К счастью, сейчас это пространство созрело, и у нас есть несколько весьма полезных инструментов для начала.
Давайте рассмотрим некоторые из популярных инструментов для работы в этом пространстве:
- Solidity : Solidity – это статически типизированный и объектно-ориентированный язык программирования, предназначенный для написания смарт-контрактов. Его можно использовать для написания смарт-контрактов на различных блокчейн-платформах, таких как Ethereum . Remix VIDEO : Remix-это мощный
- инструмент с открытым исходным кодом для написания смарт-контрактов в солидности. Это позволяет пользователю писать смарт – контракты прямо из браузера. Truffle Suite : Truffle предоставляет
- кучу инструментов для запуска разработчика в разработке распределенных приложений. Это включает в себя Трюфель, Ганаш и морось. Ethlint/Solium : Solium позволяет разработчикам гарантировать, что их
- смарт-контракты, написанные на Солидности, свободны от проблем стиля и безопасности . Solium также помогает в устранении этих проблем. Паритет : Паритет помогает в
- настройке среды разработки для смарт-контракта на Etherium. Он обеспечивает быстрый и безопасный способ взаимодействия с блокчейном.
8. Заключение
Подводя итог, в этом уроке мы рассмотрели основные концепции технологии блокчейн. Мы поняли, как сеть добывает и добавляет новый блок в блокчейн. Кроме того, мы реализовали основные концепции в Java. Мы также обсудили некоторые передовые концепции, связанные с этой технологией.
Наконец, мы закончили с некоторыми практическими приложениями блокчейна, а также доступными инструментами.
Как всегда, код можно найти на GitHub .