자바로 간단한 블록 체인 구현

1. 개요

이 튜토리얼에서는 블록 체인 기술의 기본 개념을 배웁니다. 또한 개념에 초점을 맞춘 기본 애플리케이션을 Java로 구현할 것입니다.

또한이 기술의 몇 가지 고급 개념과 실제 적용에 대해 설명합니다.

2. 블록 체인이란?

자, 먼저 블록 체인이 정확히 무엇인지 이해합시다 ...

글쎄요, 그것은 2008 년에 비트 코인에 사토시 나카 모토가 출판 한 백서로 거슬러 올라갑니다.

블록 체인은 분산 된 정보 원장입니다 . 암호화를 사용하여 연결된 데이터 블록으로 구성됩니다. 공용 네트워크를 통해 연결된 노드 네트워크에 속합니다. 나중에 기본 튜토리얼을 만들려고 할 때 이것을 더 잘 이해할 것입니다.

우리가 이해해야 할 몇 가지 중요한 속성이 있으므로 살펴 보겠습니다.

  • 변조 방지 : 무엇보다도 블록의 일부인 데이터는 변조 방지가 가능 합니다. 모든 블록은 일반적으로 해시라고하는 암호화 다이제스트에 의해 참조되어 블록이 변조되지 않도록합니다.
  • 탈 중앙화 : 전체 블록 체인은 네트워크를 통해 완전히 분산 됩니다. 이는 마스터 노드가 없으며 네트워크의 모든 노드가 동일한 사본을 가지고 있음을 의미합니다.
  • 투명성 : 네트워크에 참여하는 모든 노드 는 다른 노드와의 합의통해 새로운 블록을 검증하고 체인에 추가합니다 . 따라서 모든 노드는 데이터에 대한 완전한 가시성을 갖습니다.

3. 블록 체인은 어떻게 작동합니까?

이제 블록 체인이 어떻게 작동하는지 이해해 봅시다.

블록 체인기본 단위는 블록 입니다. 단일 블록은 여러 트랜잭션 또는 기타 중요한 데이터를 캡슐화 할 수 있습니다.

3.1. 블록 채굴

해시 값으로 블록을 나타냅니다. 블록의 해시 값을 생성하는 것을 블록 "채굴"이라고 합니다. 블록 채굴은 "작업 증명"역할을하므로 일반적으로 계산 비용이 많이 듭니다.

블록의 해시는 일반적으로 다음 데이터로 구성됩니다.

  • 주로 블록의 해시는 캡슐화하는 트랜잭션으로 구성됩니다.
  • 해시는 블록 생성 타임 스탬프로 구성됩니다.
  • 또한 암호화에 사용되는 임의의 숫자 인 임시 값도 포함됩니다.
  • 마지막으로 현재 블록의 해시는 이전 블록의 해시도 포함합니다.

네트워크의 여러 노드가 동시에 블록 을 채굴하기 위해 경쟁 할 수 있습니다 . 해시를 생성하는 것 외에도 노드는 블록에 추가되는 트랜잭션이 합법적인지 확인해야합니다. 블록을 먼저 채굴 한 사람이 경주에서 승리합니다!

3.2. 블록 체인에 블록 추가

블록 채굴은 계산 비용이 많이 들지만 블록이 합법적인지 확인하는 것은 상대적으로 훨씬 쉽습니다 . 네트워크의 모든 노드는 새로 채굴 된 블록을 확인하는 데 참여합니다.

따라서 새로 채굴 된 블록이 노드 의 합의 에 따라 블록 체인에 추가 됩니다.

이제 검증에 사용할 수있는 몇 가지 합의 프로토콜이 있습니다. 네트워크의 노드는 동일한 프로토콜을 사용하여 체인의 악의적 인 분기를 감지합니다. 따라서 악의적 인 브랜치가 도입 되더라도 곧 대부분의 노드에서 거부됩니다.

4. 자바의 기본 블록 체인

이제 우리는 자바로 기본 애플리케이션을 구축하기위한 충분한 컨텍스트를 얻었습니다.

여기에있는 간단한 는 방금 본 기본 개념을 설명합니다 . 프로덕션 등급 애플리케이션에는이 자습서의 범위를 벗어난 많은 고려 사항이 수반됩니다. 그러나 나중에 몇 가지 고급 주제를 다룰 것입니다.

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. 해시 계산

이제 블록의 해시를 어떻게 계산할까요? 우리는 computeBlockHash 메소드를 사용 했지만 아직 구현을 보지 못했습니다. 이 방법을 구현하기 전에 해시가 정확히 무엇인지 이해하는 데 시간을 할애 할 가치가 있습니다.

해시는 해시 함수로 알려진 것의 출력입니다. 해시 함수는 고정 크기의 출력 데이터에 임의의 크기의 입력 데이터를 매핑한다 . 해시는 입력 데이터의 변경 사항에 매우 민감하지만 작을 수 있습니다.

Moreover, it's impossible to get the input data back just from its hash. These properties make the hash function quite useful in cryptography.

So, let's see how we can generate the hash of our block in 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(); }

Quite a lot of things happening here, let's understand them in detail:

  • First, we concatenate different parts of the block to generate a hash from
  • Then, we get an instance of the SHA-256 hash function from MessageDigest
  • Then, we generate the hash value of our input data, which is a byte array
  • Finally, we transform the byte array into a hex string, a hash is typically represented as a 32-digit hex number

4.3. Have We Mined the Block Yet?

Everything sounds simple and elegant so far, except for the fact that we've not mined the block yet. So what exactly entails mining a block, which has captured the fancy of developers for some time now!

Well, mining a block means solving a computationally complex task for the block. While calculating the hash of a block is somewhat trivial, finding the hash starting with five zeroes is not. Even more complicated would be to find a hash starting with ten zeroes, and we get a general idea.

So, how exactly can we do this? Honestly, the solution is much less fancy! It's with brute force that we attempt to achieve this goal. We make use of nonce here:

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; }

Let's see what we trying to do here are:

  • We start by defining the prefix we desire to find
  • Then we check whether we've found the solution
  • If not we increment the nonce and calculate the hash in a loop
  • The loop goes on until we hit the jackpot

We're starting with the default value of nonce here and incrementing it by one. But there are more sophisticated strategies to start and increment a nonce in real-world applications. Also, we're not verifying our data here, which is typically an important part.

4.4. Let's Run the Example

Now that we've our block defined along with its functions, we can use this to create a simple blockchain. We'll store this in an ArrayList:

List blockchain = new ArrayList(); int prefix = 4; String prefixString = new String(new char[prefix]).replace('\0', '0');

Additionally, we've defined a prefix of four, which effectively means that we want our hash to start with four zeroes.

Let's see how can we add a block here:

@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. Blockchain Verification

How can a node validate that a blockchain is valid? While this can be quite complicated, let's think about a simple version:

@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); }

So, here we're making three specific checks for every block:

  • The stored hash of the current block is actually what it calculates
  • The hash of the previous block stored in the current block is the hash of the previous block
  • The current block has been mined

5. Some Advanced Concepts

While our basic example brings out the basic concepts of a blockchain, it's certainly not complete. To put this technology into practical use, several other considerations need to be factored in.

While it's not possible to detail all of them, let's go through some of the important ones:

5.1. Transaction Verification

Calculating the hash of a block and finding the desired hash is just one part of mining. A block consists of data, often in the form of multiple transactions. These must be verified before they can be made part of a block and mined.

A typical implementation of blockchain sets a restriction on how much data can be part of a block. It also sets up rules on how a transaction can be verified. Multiple nodes in the network participate in the verification process.

5.2. Alternate Consensus Protocol

We saw that consensus algorithm like “Proof of Work” is used to mine and validate a block. However, this is not the only consensus algorithm available for use.

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.
  • 패리티 : 패리티 는 이더 리움 에서 스마트 계약위한 개발 환경을 설정하는 데 도움이됩니다 . 블록 체인과 상호 작용하는 빠르고 안전한 방법을 제공합니다.

8. 결론

요약하자면이 튜토리얼에서는 블록 체인 기술의 기본 개념을 살펴 보았습니다. 네트워크가 어떻게 채굴하고 블록 체인에 새 블록을 추가하는지 이해했습니다. 또한 Java로 기본 개념을 구현했습니다. 또한이 기술과 관련된 몇 가지 고급 개념에 대해서도 논의했습니다.

마지막으로, 우리는 블록 체인과 사용 가능한 도구의 실용적인 응용 프로그램을 마무리했습니다.

항상 그렇듯이 코드는 GitHub에서 찾을 수 있습니다.