Melaksanakan Blockchain Mudah di Java

1. Gambaran keseluruhan

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

Selanjutnya, kita akan membincangkan beberapa konsep lanjutan dan aplikasi praktikal teknologi ini.

2. Apa itu Blockchain?

Oleh itu, mari kita fahami apa sebenarnya blockchain…

Nah, ia mengesan asalnya kembali ke kertas putih yang diterbitkan oleh Satoshi Nakamoto di Bitcoin, pada tahun 2008.

Blockchain adalah lejar maklumat yang terdesentralisasi . Ia terdiri daripada blok data yang dihubungkan melalui penggunaan kriptografi. Ia tergolong dalam rangkaian nod yang disambungkan melalui rangkaian awam. Kami akan memahami perkara ini dengan lebih baik apabila kami berusaha membina tutorial asas di kemudian hari.

Terdapat beberapa sifat penting yang mesti kita fahami, jadi mari kita lalui:

  • Tamper-proof: Pertama dan terpenting, data sebagai sebahagian daripada blok adalah bukti tamper . Setiap blok dirujuk oleh ringkasan kriptografi, yang biasanya dikenal sebagai hash, menjadikan blok tersebut tidak tahan.
  • Desentralisasi: Seluruh blockchain benar-benar terdesentralisasi di seluruh rangkaian. Ini bermaksud bahawa tidak ada nod utama, dan setiap simpul dalam rangkaian mempunyai salinan yang sama.
  • Telus: Setiap nod yang mengambil bahagian dalam rangkaian mengesahkan dan menambahkan blok baru ke rantaiannya melalui persetujuan dengan nod lain. Oleh itu, setiap nod mempunyai keterlihatan data yang lengkap.

3. Bagaimana Blockchain Berfungsi?

Sekarang, mari kita fahami bagaimana blockchain berfungsi.

Unit asas blockchain adalah blok . Satu blok boleh merangkumi beberapa transaksi atau data berharga lain:

3.1. Melombong Blok

Kami mewakili blok dengan nilai hash. Menjana nilai hash blok dipanggil "melombong" blok. Melombong blok biasanya mahal untuk dilakukan kerana berfungsi sebagai "bukti kerja".

Hash dari blok biasanya terdiri daripada data berikut:

  • Terutamanya, hash blok terdiri daripada urus niaga yang disusunnya
  • Hash juga terdiri daripada cap waktu penciptaan blok tersebut
  • Ini juga termasuk nombor bukan, nombor sewenang-wenang yang digunakan dalam kriptografi
  • Akhirnya, hash blok semasa juga merangkumi hash blok sebelumnya

Pelbagai nod dalam rangkaian dapat bersaing untuk menambang blok pada masa yang sama. Selain menghasilkan hash, node juga harus mengesahkan bahawa transaksi yang ditambahkan di blok itu sah. Yang pertama melombong memenangi perlumbaan!

3.2. Menambah Blok ke dalam Blockchain

Walaupun penambangan blok adalah mahal secara komputasi, mengesahkan bahawa blok itu sah adalah lebih mudah . Semua nod dalam rangkaian mengambil bahagian dalam mengesahkan blok yang baru dilombong.

Oleh itu, blok yang baru dilombong ditambahkan ke dalam blockchain pada persetujuan nod.

Kini, terdapat beberapa protokol konsensus yang dapat kami gunakan untuk pengesahan. Nod dalam rangkaian menggunakan protokol yang sama untuk mengesan cabang rantai berbahaya. Oleh itu, cabang berbahaya walaupun diperkenalkan akan segera ditolak oleh sebahagian besar nod.

4. Blockchain asas di Java

Sekarang kita mempunyai cukup konteks untuk mula membangun aplikasi dasar di Java.

Contoh ringkas kami di sini akan menggambarkan konsep asas yang baru kita lihat. Aplikasi bertaraf pengeluaran memerlukan banyak pertimbangan yang berada di luar skop tutorial ini. Akan tetapi, kita akan menyentuh beberapa topik lanjutan di kemudian hari.

4.1. Melaksanakan Blok

Pertama, kita perlu menentukan POJO ringkas 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 fahami apa yang telah kami bungkus di sini:

  • Hash dari blok sebelumnya, bahagian penting untuk membina rantai
  • Data sebenar, maklumat yang mempunyai nilai, seperti kontrak
  • Cap waktu penciptaan blok ini
  • Nonce, yang merupakan nombor sewenang-wenang yang digunakan dalam kriptografi
  • Akhirnya, hash blok ini, dikira berdasarkan data lain

4.2. Mengira Hash

Sekarang, bagaimana kita mengira hash blok? Kami telah menggunakan kaedah calculateBlockHash tetapi belum melihat pelaksanaannya. Sebelum kita melaksanakan kaedah ini, perlu meluangkan masa untuk memahami apa sebenarnya hash.

Hash adalah output dari sesuatu yang dikenali sebagai fungsi hash. A fungsi hash memetakan data input saiz sewenang-wenangnya untuk data output saiz tetap . Hash ini cukup sensitif terhadap perubahan data input, walau sekecil mana pun.

Lebih-lebih lagi, mustahil untuk mendapatkan kembali data input hanya dari hashnya. Sifat-sifat ini menjadikan fungsi hash cukup berguna dalam kriptografi.

Oleh itu, mari kita lihat bagaimana kita dapat menghasilkan hash 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(); }

Banyak perkara yang berlaku di sini, mari kita fahami secara terperinci:

  • Pertama, kami menggabungkan bahagian-bahagian blok yang berbeza untuk menghasilkan hash dari
  • Kemudian, kita mendapat contoh fungsi hash SHA-256 dari MessageDigest
  • Kemudian, kami menjana nilai hash data input kami, yang merupakan susunan bait
  • Akhirnya, kita mengubah susunan bait menjadi rentetan heks, hash biasanya ditunjukkan sebagai nombor heks 32 digit

4.3. Sudahkah Kami Melombong Blok?

Semuanya terdengar sederhana dan elegan setakat ini, kecuali hakikat bahawa kami belum melombong blok itu. Jadi apa sebenarnya yang memerlukan penambangan blok, yang telah menarik minat pemaju untuk beberapa waktu sekarang!

Oleh itu, melombong blok bermaksud menyelesaikan tugas komputasi yang kompleks untuk blok tersebut. Walaupun mengira hash blok agak remeh, mencari hash bermula dengan lima nol tidak. Yang lebih rumit adalah mencari hash bermula dengan sepuluh nol, dan kita mendapat idea umum.

Jadi, bagaimana sebenarnya kita boleh melakukan ini? Sejujurnya, penyelesaiannya lebih kurang mewah! Dengan kekuatan kasar kita berusaha untuk mencapai matlamat 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 lihat apa yang cuba kita lakukan di sini ialah:

  • Kita mulakan dengan menentukan awalan yang ingin kita cari
  • Kemudian kami periksa sama ada kami menemui jalan penyelesaiannya
  • Sekiranya tidak, kita akan menambahkan nilai bukan dan mengira hash dalam satu gelung
  • Gelung berterusan sehingga kita berjaya mendapatkan jackpot

Kami bermula dengan nilai lalai bukan di sini dan menaikkannya satu per satu. Tetapi ada strategi yang lebih canggih untuk memulakan dan meningkatkan nonce dalam aplikasi dunia nyata. Kami juga tidak mengesahkan data kami di sini, yang biasanya merupakan bahagian penting.

4.4. Mari Jalankan Contohnya

Sekarang setelah blok kami ditentukan bersama fungsinya, kami dapat menggunakannya untuk membuat blockchain sederhana. Kami akan menyimpannya dalam ArrayList :

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

Selain itu, kami telah menentukan awalan empat, yang bermaksud bahawa kami mahu hash kami dimulakan dengan empat sifar.

Mari lihat bagaimana kita dapat menambahkan 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. Pengesahan Blockchain

Bagaimana nod boleh mengesahkan bahawa blockchain itu sah? Walaupun ini agak rumit, mari kita fikirkan versi mudah:

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

Jadi, di sini kami membuat tiga pemeriksaan khusus untuk setiap blok:

  • Hash yang tersimpan pada blok semasa sebenarnya adalah apa yang dikira
  • Hash dari blok sebelumnya yang disimpan di blok semasa adalah hash dari blok sebelumnya
  • Blok semasa telah dilombong

5. Beberapa Konsep Lanjutan

Walaupun contoh asas kami menunjukkan konsep asas blockchain, itu pasti tidak lengkap. Untuk memanfaatkan teknologi ini secara praktikal, beberapa pertimbangan lain perlu diambil kira.

Walaupun tidak mungkin memperincikan semuanya, mari kita teliti beberapa perkara penting:

5.1. Pengesahan Transaksi

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 mengatur persekitaran pembangunan untuk kontrak pintar di Etherium. Ia menyediakan cara yang cepat dan selamat untuk berinteraksi dengan blockchain.

8. Kesimpulannya

Kesimpulannya, dalam tutorial ini, kami membahas konsep asas teknologi blockchain. Kami memahami bagaimana rangkaian melombong dan menambah blok baru di blockchain. Selanjutnya, kami menerapkan konsep asas di Jawa. Kami juga membincangkan beberapa konsep lanjutan yang berkaitan dengan teknologi ini.

Akhirnya, kami menyelesaikan beberapa aplikasi praktikal blockchain dan juga alat yang ada.

Seperti biasa, kodnya boleh didapati di GitHub.