1. Översikt
I denna handledning lär vi oss de grundläggande begreppen blockchain-teknik. Vi implementerar också en basapplikation i Java som fokuserar på begreppen.
Vidare diskuterar vi några avancerade koncept och praktiska tillämpningar av denna teknik.
2. Vad är Blockchain?
Så låt oss först förstå vad blockchain exakt är ...
Tja, det spårar sitt ursprung tillbaka till den vitbok som Satoshi Nakamoto publicerade på Bitcoin redan 2008.
Blockchain är en decentraliserad informationsbok . Den består av datablock som är anslutna genom kryptografi. Det tillhör ett nätverk av noder som är anslutna via det offentliga nätverket. Vi förstår detta bättre när vi försöker bygga en grundläggande handledning senare.
Det finns några viktiga attribut som vi måste förstå, så låt oss gå igenom dem:
- Sabotagesäker: Först och främst är data som en del av ett block manipuleringssäkert . Varje block refereras av en kryptografisk sammandragning, allmänt känd som en hash, vilket gör blocket manipuleringssäkert.
- Decentraliserad: Hela blockkedjan är helt decentraliserad över nätverket. Det betyder att det inte finns någon huvudnod och att varje nod i nätverket har samma kopia.
- Transparent: Varje nod som deltar i nätverket validerar och lägger till ett nytt block i sin kedja genom konsensus med andra noder. Därför har varje nod fullständig synlighet för data.
3. Hur fungerar Blockchain?
Låt oss nu förstå hur blockchain fungerar.
De grundläggande enheterna i en blockkedja är block . Ett enda block kan inkapsla flera transaktioner eller annan värdefull data:

3.1. Mining a Block
Vi representerar ett block med ett hashvärde. Att generera hashvärdet för ett block kallas "bryta" blocket. Att bryta ett block är vanligtvis beräkningsvärt dyrt att göra eftersom det fungerar som ”bevis på arbete”.
Hashet för ett block består vanligtvis av följande data:
- I första hand består hash av ett block av de transaktioner som det inkapslar
- Hashet består också av tidsstämpeln för blockets skapande
- Det innehåller också ett nonce, ett godtyckligt nummer som används i kryptografi
- Slutligen inkluderar hash för det aktuella blocket även hash för föregående block
Flera noder i nätverket kan tävla om att bryta blocket samtidigt. Förutom att generera hash måste noder också verifiera att de transaktioner som läggs till i blocket är legitima. Den första som bryter ett block vinner loppet!
3.2. Lägga till ett block i Blockchain
Även om det är beräkningsbart dyrt att bryta ett block är det relativt mycket enklare att verifiera att ett block är legitimt . Alla noder i nätverket deltar i verifieringen av ett nyminerat block.

Således läggs ett nyminerat block till blockkedjan på nodernas konsensus .
Nu finns det flera konsensusprotokoll tillgängliga som vi kan använda för verifiering. Noderna i nätverket använder samma protokoll för att upptäcka skadlig gren av kedjan. Därför kommer en skadlig gren, även om den införs, snart att avvisas av majoriteten av noderna.
4. Grundläggande blockchain i Java
Nu har vi tillräckligt med sammanhang för att börja bygga en grundläggande applikation i Java.
Vårt enkla exempel här illustrerar de grundläggande begreppen vi just såg. En applikation av produktionskvalitet innebär många överväganden som ligger utanför ramen för denna handledning. Vi kommer dock att beröra några avancerade ämnen senare.
4.1. Implementering av ett block
För det första måste vi definiera en enkel POJO som kommer att innehålla data för vårt block:
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 }
Låt oss förstå vad vi har packat här:
- Hash av föregående block, en viktig del för att bygga kedjan
- De faktiska uppgifterna, all information som har värde, som ett kontrakt
- Tidsstämpeln för skapandet av detta block
- En nonce, vilket är ett godtyckligt nummer som används i kryptografi
- Slutligen, hash för detta block, beräknat baserat på andra data
4.2. Beräkning av Hash
Hur beräknar vi hash för ett block? Vi har använt en metod för att beräkna BlockHash men har inte sett någon implementering ännu. Innan vi implementerar den här metoden är det värt att spendera lite tid på att förstå vad som är en hash.
En hash är en utgång av något som kallas en hash-funktion. En hash-funktion kartlägger indata med godtycklig storlek till utdata med fast storlek . Hashet är ganska känsligt för alla förändringar i indata, hur liten som än kan vara.
Dessutom är det omöjligt att få tillbaka indata bara från dess hash. Dessa egenskaper gör hash-funktionen ganska användbar i kryptografi.
Så, låt oss se hur vi kan generera hash för vårt block i 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(); }
En hel del saker händer här, låt oss förstå dem i detalj:
- Först sammanfogar vi olika delar av blocket för att generera en hash från
- Sedan får vi en instans av SHA-256-hashfunktionen från MessageDigest
- Sedan genererar vi hashvärdet för våra indata, vilket är en byte-array
- Slutligen omvandlar vi byte-arrayen till en hexsträng, en hash representeras vanligtvis som ett 32-siffrigt hexnummer
4.3. Har vi brytt blocket ännu?
Allt låter enkelt och elegant hittills, förutom det faktum att vi inte har brytt blocket ännu. Så vad exakt innebär att bryta ett block, vilket har fångat utvecklarnas fantasi under en tid nu!
Att bryta ett block innebär att man löser en beräkningsmässigt komplex uppgift för blocket. Medan beräkning av hash för ett block är något trivialt är det inte att hitta hash som börjar med fem nollor. Ännu mer komplicerat skulle vara att hitta en hash som börjar med tio nollor, och vi får en allmän uppfattning.
Så, hur kan vi exakt göra detta? Ärligt talat är lösningen mycket mindre snygg! Det är med grov kraft som vi försöker uppnå detta mål. Vi använder nonce här:
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; }
Låt oss se vad vi försöker göra här är:
- Vi börjar med att definiera prefixet vi vill hitta
- Sedan kontrollerar vi om vi har hittat lösningen
- Om inte ökar vi nonce och beräknar hash i en slinga
- Slingan fortsätter tills vi träffar jackpotten
Vi börjar med standardvärdet för nonce här och ökar det med ett. Men det finns mer sofistikerade strategier för att starta och öka en nonce i verkliga applikationer. Vi verifierar inte heller våra uppgifter här, vilket vanligtvis är en viktig del.
4.4. Låt oss köra exemplet
Nu när vi har definierat vårt block tillsammans med dess funktioner kan vi använda detta för att skapa en enkel blockchain. Vi lagrar detta i en ArrayList :
List blockchain = new ArrayList(); int prefix = 4; String prefixString = new String(new char[prefix]).replace('\0', '0');
Dessutom har vi definierat ett prefix på fyra, vilket effektivt betyder att vi vill att vår hash ska börja med fyra nollor.
Låt oss se hur vi kan lägga till ett block här:
@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-verifiering
Hur kan en nod verifiera att en blockchain är giltig? Även om detta kan vara ganska komplicerat, låt oss tänka på en enkel 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); }
Så här gör vi tre specifika kontroller för varje block:
- Den lagrade hash för det aktuella blocket är faktiskt vad den beräknar
- Hashet för det föregående blocket som är lagrat i det aktuella blocket är hashet för det tidigare blocket
- Det aktuella blocket har bryts
5. Några avancerade begrepp
Medan vårt grundläggande exempel tar fram de grundläggande begreppen för en blockchain är det verkligen inte komplett. För att använda denna teknik praktiskt måste flera andra överväganden tas med i beräkningen.
Även om det inte är möjligt att detaljera dem alla, låt oss gå igenom några av de viktiga:
5.1. Transaktionsverifiering
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.
- Paritet: Paritet hjälper till att ställa in utvecklingsmiljön för smarta kontrakt på Etherium. Det ger ett snabbt och säkert sätt att interagera med blockchain.
8. Slutsats
För att sammanfatta, i denna handledning, gick vi igenom de grundläggande begreppen blockchain-teknik. Vi förstod hur en nätverksgruva och lägger till ett nytt block i blockchain. Vidare implementerade vi de grundläggande begreppen i Java. Vi diskuterade också några av de avancerade begreppen relaterade till denna teknik.
Slutligen slutade vi med några praktiska tillämpningar av blockchain och såväl som tillgängliga verktyg.
Som alltid kan koden hittas på GitHub.