Menerapkan Blockchain Sederhana di Java

1. Ikhtisar

Dalam tutorial ini, kita akan mempelajari konsep dasar teknologi blockchain. Kami juga akan menerapkan aplikasi dasar di Java yang berfokus pada konsep.

Selanjutnya, kita akan membahas beberapa konsep lanjutan dan aplikasi praktis dari teknologi ini.

2. Apa Itu Blockchain?

Jadi, pertama-tama mari kita pahami apa sebenarnya blockchain itu…

Nah, ini melacak asalnya kembali ke whitepaper yang diterbitkan oleh Satoshi Nakamoto di Bitcoin, pada tahun 2008.

Blockchain adalah buku besar informasi yang terdesentralisasi . Ini terdiri dari blok data yang terhubung melalui penggunaan kriptografi. Itu milik jaringan node yang terhubung melalui jaringan publik. Kami akan memahami ini dengan lebih baik saat kami mencoba membuat tutorial dasar nanti.

Ada beberapa atribut penting yang harus kita pahami, jadi mari kita bahas:

  • Bukti kerusakan: Pertama dan terpenting, data sebagai bagian dari blok adalah bukti kerusakan . Setiap blok direferensikan oleh intisari kriptografik, umumnya dikenal sebagai hash, yang membuat blok tersebut tahan gangguan.
  • Terdesentralisasi: Seluruh blockchain sepenuhnya terdesentralisasi di seluruh jaringan. Artinya tidak ada node master, dan setiap node di jaringan memiliki salinan yang sama.
  • Transparan: Setiap node yang berpartisipasi dalam jaringan memvalidasi dan menambahkan blok baru ke rantainya melalui konsensus dengan node lain. Oleh karena itu, setiap node memiliki visibilitas data yang lengkap.

3. Bagaimana Cara Kerja Blockchain?

Sekarang, mari kita pahami cara kerja blockchain.

Unit dasar dari blockchain adalah blok . Satu blok dapat merangkum beberapa transaksi atau data berharga lainnya:

3.1. Menambang Blok

Kami mewakili blok dengan nilai hash. Menghasilkan nilai hash dari sebuah blok disebut "menambang" blok tersebut. Menambang blok biasanya mahal secara komputasi untuk dilakukan karena berfungsi sebagai "bukti kerja".

Hash dari sebuah blok biasanya terdiri dari data berikut:

  • Terutama, hash dari sebuah blok terdiri dari transaksi yang dienkapsulasi
  • Hash juga terdiri dari stempel waktu pembuatan blok
  • Ini juga termasuk nonce, nomor acak yang digunakan dalam kriptografi
  • Terakhir, hash dari blok saat ini juga menyertakan hash dari blok sebelumnya

Beberapa node dalam jaringan dapat bersaing untuk menambang blok pada saat yang bersamaan. Selain menghasilkan hash, node juga harus memverifikasi bahwa transaksi yang ditambahkan di blok itu sah. Yang pertama menambang blok memenangkan perlombaan!

3.2. Menambahkan Blok ke Blockchain

Meskipun menambang blok mahal secara komputasi, memverifikasi bahwa sebuah blok sah relatif lebih mudah . Semua node dalam jaringan berpartisipasi dalam memverifikasi blok yang baru ditambang.

Dengan demikian, blok yang baru ditambang ditambahkan ke dalam blockchain berdasarkan konsensus dari node.

Sekarang, ada beberapa protokol konsensus yang tersedia yang dapat kita gunakan untuk verifikasi. Node di jaringan menggunakan protokol yang sama untuk mendeteksi cabang rantai yang berbahaya. Oleh karena itu, cabang yang berbahaya meskipun diperkenalkan akan segera ditolak oleh sebagian besar node.

4. Blockchain Dasar di Java

Sekarang kita memiliki cukup konteks untuk mulai membangun aplikasi dasar di Java.

Contoh sederhana kami di sini akan mengilustrasikan konsep dasar yang baru saja kita lihat. Aplikasi tingkat produksi memerlukan banyak pertimbangan yang berada di luar cakupan tutorial ini. Kami, bagaimanapun, akan menyentuh beberapa topik lanjutan nanti.

4.1. Menerapkan Blok

Pertama, kita perlu mendefinisikan POJO sederhana yang akan menyimpan data untuk blok kita:

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 }

Mari kita pahami apa yang telah kita kemas di sini:

  • Hash dari blok sebelumnya, merupakan bagian penting untuk membangun rantai
  • Data aktual, informasi apa pun yang bernilai, seperti kontrak
  • Stempel waktu pembuatan blok ini
  • Nonce, yang merupakan angka acak yang digunakan dalam kriptografi
  • Terakhir, hash dari blok ini, dihitung berdasarkan data lain

4.2. Menghitung Hash

Sekarang, bagaimana kita menghitung hash dari sebuah blok? Kami telah menggunakan metode menghitungBlockHash tetapi belum melihat implementasinya. Sebelum menerapkan metode ini, ada baiknya meluangkan waktu untuk memahami apa itu hash.

Hash adalah keluaran dari sesuatu yang dikenal sebagai fungsi hash. Sebuah fungsi hash peta input data ukuran sewenang-wenang untuk output data dari ukuran tetap . Hash cukup sensitif terhadap perubahan apa pun dalam data masukan, betapapun kecilnya.

Selain itu, tidak mungkin mendapatkan kembali data masukan hanya dari hashnya. Properti ini membuat fungsi hash cukup berguna dalam kriptografi.

Jadi, mari kita lihat bagaimana kita dapat menghasilkan hash dari blok kita di 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(); }

Cukup banyak hal yang terjadi di sini, mari kita pahami secara detail:

  • Pertama, kami menggabungkan berbagai bagian blok untuk menghasilkan hash
  • Kemudian, kami mendapatkan instance dari fungsi hash SHA-256 dari MessageDigest
  • Kemudian, kami menghasilkan nilai hash dari data input kami, yang merupakan array byte
  • Akhirnya, kami mengubah array byte menjadi string hex, hash biasanya direpresentasikan sebagai nomor hex 32 digit

4.3. Sudahkah Kita Menambang Blok itu?

Semuanya terdengar sederhana dan elegan sejauh ini, kecuali fakta bahwa kami belum menambang blok tersebut. Jadi apa sebenarnya yang memerlukan penambangan blok, yang telah menarik perhatian pengembang untuk beberapa waktu sekarang!

Nah, menambang blok berarti menyelesaikan tugas kompleks secara komputasi untuk blok tersebut. Meskipun menghitung hash sebuah blok agak sepele, menemukan hash yang dimulai dengan lima nol bukanlah hal yang mudah. Yang lebih rumit adalah menemukan hash yang dimulai dengan sepuluh nol, dan kita mendapatkan gambaran umum.

Jadi, bagaimana tepatnya kita bisa melakukan ini? Jujur saja, solusinya jauh lebih tidak mewah! Dengan kekuatan kasar kami berusaha mencapai tujuan ini. Kami menggunakan nonce di sini:

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

Mari kita lihat apa yang coba kami lakukan di sini adalah:

  • Kita mulai dengan mendefinisikan awalan yang ingin kita temukan
  • Kemudian kami memeriksa apakah kami telah menemukan solusinya
  • Jika tidak, kita menambah nonce dan menghitung hash dalam satu lingkaran
  • Perulangan terus berlanjut sampai kita mendapatkan jackpot

Kami mulai dengan nilai default nonce di sini dan menambahnya satu per satu. Tetapi ada strategi yang lebih canggih untuk memulai dan meningkatkan nonce dalam aplikasi dunia nyata. Selain itu, kami tidak memverifikasi data kami di sini, yang biasanya merupakan bagian penting.

4.4. Mari Jalankan Contoh

Sekarang kita telah menentukan blok kita beserta fungsinya, kita dapat menggunakan ini untuk membuat blockchain sederhana. Kami akan menyimpan ini di ArrayList :

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

Selain itu, kami telah menetapkan awalan empat, yang secara efektif berarti kami ingin hash kami dimulai dengan empat angka nol.

Mari kita lihat bagaimana kita bisa menambahkan satu blok di sini:

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

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.
  • Parity: Parity membantu dalam menyiapkan lingkungan pengembangan untuk kontrak pintar di Etherium. Ini menyediakan cara cepat dan aman untuk berinteraksi dengan blockchain.

8. Kesimpulan

Singkatnya, dalam tutorial ini, kami membahas konsep dasar teknologi blockchain. Kami memahami bagaimana jaringan menambang dan menambahkan blok baru di blockchain. Selanjutnya, kami menerapkan konsep dasar di Jawa. Kami juga membahas beberapa konsep lanjutan terkait teknologi ini.

Akhirnya, kami menyelesaikan beberapa aplikasi praktis dari blockchain dan juga alat yang tersedia.

Seperti biasa, kode dapat ditemukan di GitHub.