Внедряване на прост блокчейн в Java

1. Общ преглед

В този урок ще научим основните концепции на блокчейн технологията. Ще внедрим и основно приложение в Java, което се фокусира върху концепциите.

Освен това ще обсъдим някои съвременни концепции и практически приложения на тази технология.

2. Какво е блокчейн?

И така, нека първо разберем какво точно представлява блокчейн ...

Е, той води своя произход от бялата книга, публикувана от Сатоши Накамото за Биткойн, през 2008 г.

Blockchain е децентрализирана книга с информация . Състои се от блокове от данни, свързани чрез използването на криптография. Той принадлежи към мрежа от възли, свързани през публичната мрежа. Ще разберем това по-добре, когато по-късно се опитаме да изградим основен урок.

Има някои важни атрибути, които трябва да разберем, така че нека да ги разгледаме:

  • Защита срещу фалшификация: На първо място, данните като част от блок са защитени от фалшифициране . Всеки блок се препраща от криптографски дайджест, известен като хеш, което прави блока непроменен.
  • Децентрализирано: Цялата блокчейн е напълно децентрализирана в мрежата. Това означава, че няма главен възел и всеки възел в мрежата има едно и също копие.
  • Прозрачно: Всеки възел, участващ в мрежата, проверява и добавя нов блок към своята верига чрез консенсус с други възли. Следователно всеки възел има пълна видимост на данните.

3. Как работи Blockchain?

Сега нека разберем как работи блокчейнът.

Най- основните единици на blockchain са блокове . Един блок може да капсулира няколко транзакции или други ценни данни:

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. Изчисляване на хеш

Сега, как да изчислим хеш на блок? Използвахме метод CalcuBlockHash, но все още не сме видели изпълнение. Преди да приложим този метод, струва си да отделите малко време, за да разберете какво всъщност е хеш.

Хеш е изход на нещо, известно като хеш функция. А хеш функция карти входни данни от произволен размер на изходни данни за фиксиран размер . Хешът е доста чувствителен към всяка промяна във входните данни, колкото и малка да е тази.

Освен това е невъзможно да получите обратно входните данни само от неговия хеш. Тези свойства правят хеш функцията доста полезна в криптографията.

И така, нека видим как можем да генерираме хеш на нашия блок в 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 от MessageDigest
  • След това генерираме хеш стойност на нашите входни данни, която е байтов масив
  • И накрая, трансформираме байтовия масив в шестнадесетичен низ, хеш обикновено се представя като 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 тук и я увеличаваме с единица. Но има по- сложни стратегии за стартиране и увеличаване на даден момент в реални приложения. Освен това тук не проверяваме данните си, което обикновено е важна част.

4.4. Нека пуснем примера

Сега, когато дефинирахме нашия блок заедно с неговите функции, можем да го използваме, за да създадем проста блокчейн. Ще съхраним това в ArrayList :

List blockchain = 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. Протокол за алтернативен консенсус

Видяхме, че консенсус алгоритъм като „Доказване на работа“ се използва за добиване и валидиране на блок. Това обаче не е единственият консенсус алгоритъм, който се използва.

There are several other consensus algorithms to choose from, like Proof of Stake, Proof of Authority, and Proof of Weight. All of these have their pros and cons. Which one to use depends upon the type of application we intend to design.

5.3. Mining Reward

A blockchain network typically consists of voluntary nodes. Now, why would anyone want to contribute to this complex process and keep it legit and growing?

This is because nodes are rewarded for verifying the transactions and mining a block. These rewards are typically in the form of coin associated with the application. But an application can decide the reward to be anything of value.

5.4. Node Types

A blockchain completely relies on its network to operate. In theory, the network is completely decentralized, and every node is equal. However, in practice, a network consists of multiple types of nodes.

While a full node has a complete list of transactions, a light node only has a partial list. Moreover, not all nodes participate in verification and validation.

5.5. Secure Communication

One of the hallmarks of blockchain technology is its openness and anonymity. But how does it provide security to transactions being carried within? This is based on cryptography and public key infrastructure.

The initiator of a transaction uses their private key to secure it and attach it to the public key of the recipient. Nodes can use the public keys of the participants to verify transactions.

6. Practical Applications of Blockchain

So, blockchain seems to be an exciting technology, but it also must prove useful. This technology has been around for some time now and – needless to say – it has proved to be disruptive in many domains.

Its application in many other areas is being actively pursued. Let's understand the most popular applications:

  • Currency: This is by far the oldest and most widely known use of blockchain, thanks to the success of Bitcoin. They provide secure and frictionless money to people across the globe without any central authority or government intervention.
  • Identity: Digital identity is fast becoming the norm in the present world. However, this is mired by security issues and tampering. Blockchain is inevitable in revolutionizing this area with completely secure and tamper-proof identities.
  • Healthcare: Healthcare industry is loaded with data, mostly handled by central authorities. This decreases transparency, security, and efficiency in handling such data. Blockchain technology can provide a system without any third party to provide much-needed trust.
  • Government: This is perhaps an area which is well open to disruption by the blockchain technology. Government is typically at the center of several citizen services which are often laden with inefficiencies and corruption. Blockchain can help establish much better government-citizen relations.

7. Tools of the Trade

While our basic implementation here is useful to elicit the concepts, it's not practical to develop a product on blockchain from scratch. Thankfully, this space has matured now, and we do have some quite useful tools to start from.

Let's go through some of the popular tools to work within this space:

  • Solidity: Solidity is a statically-typed and object-oriented programming language designed for writing smart contracts. It can be used to write smart contracts on various blockchain platforms like Ethereum.
  • Remix IDE: Remix is a powerful open-source tool to write smart contracts in Solidity. This enables the user to write smart contracts right from the browser.
  • Truffle Suite: Truffle provides a bunch of tools to get a developer up and started in developing distributed apps. This includes Truffle, Ganache, and Drizzle.
  • Ethlint/Solium: Solium allows developers to ensure that their smart contracts written on Solidity is free from style and security issues. Solium also helps in fixing these issues.
  • Паритет: Паритетът помага при създаването на среда за разработка на интелигентен договор на Etherium. Той осигурява бърз и сигурен начин за взаимодействие с блокчейна.

8. Заключение

За да обобщим, в този урок преминахме през основните концепции на блокчейн технологията. Разбрахме как мрежата добива и добавя нов блок в блокчейна. Освен това внедрихме основните концепции в Java. Обсъдихме и някои от модерните концепции, свързани с тази технология.

Накрая завършихме с някои практически приложения на блокчейн и с наличните инструменти.

Както винаги, кодът може да бъде намерен в GitHub.