Простая реализация блокчейна на Java
1 Обзор
В этой статье мы изучим основные концепции технологии блокчейн. Базовое приложение также будет реализовано с использованием Java на основе концепций.
Далее мы обсудим некоторые передовые концепции и практическое применение этой технологии.
2. Что такое блокчейн?
Итак, давайте сначала разберемся, что же такое блокчейн...
Его происхождение можно проследить до 2008 года.Белая книга, опубликованная Сатоши Накамото о биткойнах.
Блокчейн — это децентрализованный реестр информации.Он состоит из блоков данных с использованием криптографического соединения. Он принадлежит к сети узлов, соединенных общедоступной сетью. Когда мы позже попытаемся создать базовый учебник, мы лучше поймем это.
Есть несколько важных свойств, которые мы должны понимать, поэтому давайте рассмотрим их:
- Защита от несанкционированного доступа [криптографический дайджест]: Прежде всего, ** данные как часть блока защищены от несанкционированного доступа. **На каждый блок ссылается криптографический дайджест, часто называемый хешем, что делает блок защищенным от несанкционированного доступа.
- Децентрализованный [децентрализованный]: **Вся цепочка блоков полностью децентрализована** в сети. Это означает, что нет главного узла, и каждый узел в сети имеет идентичную копию.
- Прозрачный [прозрачный, очевидный]: каждый узел, участвующий в сети, **проверяет и добавляет новый блок** в свою цепочку на основе консенсуса с другими узлами. Таким образом, каждый узел имеет полную видимость данных.
3. Как работает блокчейн?
Теперь давайте разберемся, как работает блокчейн.
Базовая единица блокчана является блок.Множество пакета может блокировать транзакцию или другие ценные данные:
![img](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/13/16e6203d469d2372~tplv-t2oaga2asx-image.image)
Мы представляем блок с хеш-значением.Хэш сгенерированного блока называется «добытым» блоком.. Майнинг блока обычно требует больших вычислительных ресурсов, потому что он действует как «доказательство работы».
Хэш-значение блока обычно состоит из следующих данных:
- Во-первых, хэш блока состоит из инкапсулированных транзакций.
- Хэш также состоит из временной метки создания блока.
- Он также включает одноразовый номер, произвольное число, используемое в пароле.
- Наконец, хеш текущего блока также включает в себя хэш предыдущего блока.
Несколько узлов в сети могут добывать блоки данных одновременно.. Помимо генерации хэшей, узлы также должны проверять легитимность транзакций, добавленных в блоки. Выкопайте блок первым и выиграйте игру!
3.2 Добавление блоков в блокчейн
Когда майнинг блока требует больших вычислительных ресурсов,Проверить легальность блокировки относительно просто. Все узлы в сети участвуют в проверке недавно добытых блоков.
![img](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/13/16e6203d9536ed02~tplv-t2oaga2asx-image.image)
Следовательно, когда узлы согласуютсяДобавить недавно добытые блоки в блокчейнсередина.
Теперь мы можем использовать несколько согласованных протоколов для проверки. Узлы в сети используют один и тот же протокол для обнаружения вредоносных ответвлений цепочки. Поэтому, даже если будет введен вредоносный форк, большинство узлов быстро отклонят его.
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 Вычисление хеша
Теперь, как мы вычисляем хэш блока? Как мы используемcalculateBlockHash, но еще не видел реализации. Перед реализацией этого метода стоит уделить время тому, чтобы понять, что такое хэш.
Хэш — это результат хэш-функции.Хэш-функция преобразует входные данные произвольного размера в выходные данные фиксированного размера.. Хеширование очень чувствительно к любым изменениям входных данных, какими бы незначительными они ни были.
Кроме того, невозможно получить входные данные только из его хэша. Эти свойства делают хеш-функции очень полезными в криптографии.
Итак, давайте посмотрим, как генерируется хэш блока в 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();
}
Здесь много чего происходит, давайте посмотрим поближе:
- Во-первых, мы объединяем разные части блока для создания хэша.
- Затем мы начинаем сMessageDigestПолучите экземпляр хеш-функции SHA-256 в
- Затем мы генерируем хэш входных данных, который представляет собой массив байтов.
- Наконец, мы преобразуем массив байтов в шестнадцатеричную строку, хэш обычно представляется как 32-битное шестнадцатеричное число.
4.3 Мы копаем?
Пока все очень просто и изящно, за исключением того, что мы не раскопали. Так что именно нужно копать блок, это на время привлекло фантазии разработчика!
следовательно,Майнинг блока означает решение вычислительно сложной задачи для блока.. Хотя вычисление хеша блока относительно просто, найти хэш, начинающийся с 5 нулей, не так просто. Сложнее найти хэш, начинающийся с 10 нулей, и мы получаем примерное представление.
Итак, что именно мы должны сделать? Честно говоря, это решение не так хорошо, как я думал! Делаем это грубой силой. Здесь мы используем одноразовый номер:
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 по умолчанию и увеличиваем его на 1. Однако в реальных приложениях их больше.Сложные стратегии для запуска и увеличения nonce. Кроме того, мы не проверяли наши данные, что часто является важной частью.
4.4 Запуск примера
Теперь, когда мы определили блок и его функции, мы можем использовать его для создания простой цепочки блоков. мы храним его вArrayListсередина:
List<Block> blockchain = new ArrayList<>();
int prefix = 4;
String prefixString = new String(new char[prefix]).replace('\0', '0');
Кроме того, мы определяем префикс 4, что на самом деле означает, что мы хотим, чтобы хэш начинался с 4 нулей.
Давайте посмотрим, как добавить блок здесь:
@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. Альтернативные консенсусные протоколы
Мы видим, что алгоритмы консенсуса, такие как «Proof of Work», используются для майнинга и проверки блоков. Однако это не единственный доступный алгоритм консенсуса.
иНесколько других алгоритмов консенсуса на выбор, такие как Proof of Stake, Proof of Authority и Proof of Weight. Все это имеет свои плюсы и минусы. Какой из них использовать, зависит от типа приложения, которое мы собираемся разработать.
5.3 Награды за майнинг
Сеть блокчейна обычно состоит из добровольных узлов. Итак, зачем кому-то хотеть вносить свой вклад в этот сложный процесс и поддерживать его законность и рост?
Это потому чтоУзлы вознаграждаются за проверку транзакций и майнинг блоков.. Эти награды обычно связаны с приложением в виде монет. Но приложение может решить, что вознаграждение является чем-то ценным.
5.4 Типы узлов
Блокчейны полностью полагаются на сеть для работы. Теоретически сеть полностью децентрализована, и все узлы равны. Однако на практике сеть состоит из нескольких типов узлов.
Несмотря на то чтоПолные узлы имеют полный список транзакций, а легкие узлы имеют только частичный список.. Также не все узлы участвуют в проверке и валидации.
5.5 Безопасная связь
Одной из отличительных черт технологии блокчейна является ее открытость и анонимность. Но как он обеспечивает безопасность внутренних транзакций? ЭтотНа основе шифрования и инфраструктуры открытого ключа.
Основатель транзакции использует закрытый ключ для ее защиты и добавляет его к открытому ключу получателя. Узлы могут использовать открытые ключи, которые участвуют в аутентификации транзакций.
6. Практическое применение блокчейна
Таким образом, блокчейн может показаться захватывающей технологией, но он также должен оказаться полезным. Эта технология существует уже некоторое время, и нет нужды говорить, что она оказалась прорывной во многих областях.
Его применение во многих других областях активно ведется. Давайте узнаем о самых популярных приложениях:
- валюта: Это, безусловно, старейшее и наиболее широко известное приложение блокчейна благодаря успеху Биткойн. Они предоставляют безопасные и беспрепятственные деньги людям по всему миру без какого-либо вмешательства центрального правительства или правительства.
- личность: Цифровая идентификация быстро становится нормой в современном мире. Однако это увязает в проблемах безопасности и взломе. Блокчейн неизбежно произведет революцию в этой области благодаря полностью безопасным и защищенным от несанкционированного доступа идентификационным данным.
- медицинская страховка: Отрасль здравоохранения наводнена данными, в основном обрабатываемыми центральным правительством. Это снижает прозрачность, безопасность и эффективность обработки таких данных. Технология блокчейн может обеспечить систему без какой-либо третьей стороны, обеспечивающей столь необходимое доверие.
- правительство: Это может быть область, которую легко нарушить технология блокчейна. Блокчейн позволяет улучшить отношения между правительством и гражданами. Правительство часто является центром нескольких агентств государственной службы, которые часто пронизаны неэффективностью и коррупцией.
7. Промышленные инструменты
Хотя базовая реализация, которую мы здесь имеем, полезна для выявления концепций, разработать продукт на блокчейне с нуля нереально. К счастью, эта область уже созрела, и у нас есть несколько очень полезных инструментов для начала работы.
Рассмотрим некоторые популярные инструменты, работающие в этой области:
- Solidity: СолидностьСтатически типизированный и объектно-ориентированный язык программирования., предназначенный для написания смарт-контрактов. Его можно использовать в чем-то вродеEthereumПишите смарт-контракты на таких различных блокчейн-платформах.
- Remix IDE: Ремикс — это инструмент, использующий солидностьМощный инструмент с открытым исходным кодом для написания смарт-контрактов. Это позволяет пользователям писать смарт-контракты прямо из браузера.
- Truffle Suite: Трюфель обеспечиваетМножество инструментов, которые помогут разработчикам начать работуРаспределенное приложение.
- Ethlint/Solium: Solium позволяет разработчикам убедиться, что ониСмарт-контракты, написанные на Solidity, не имеют проблем со стилем и безопасностью. В то же время Solium помогает справиться и с этими проблемами.
- Parity: Паритет помогаетНастроить среду разработки для смарт-контрактов на Эфириуме. Он обеспечивает быстрый и эффективный способ взаимодействия с блокчейном.
8. Заключение
В общем, в этом разделе мы узнали об основных концепциях технологии блокчейн. Мы понимаем, как сеть майнит и добавляет новые блоки в блокчейн. Кроме того, мы реализовали основные концепции на Java. Мы также обсудим некоторые дополнительные концепции, связанные с ним.
Наконец, мы суммируем некоторые практические применения блокчейна и доступные инструменты.
Как всегда, код можетна GitHubнайти на.
Оригинал: https://www.baeldung.com/java-blockchain
автор:Kumar Chandrakant
Переводчик: Королева
------
Сентябрьские льготы, обратите внимание на официальный аккаунт Ответ Backstage: 004, получите основные моменты перевода за август! Ответ прошлых льгот: 001, 002, 003, чтобы получить!