161 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			161 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								title: Basic blockchain implementation
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Basic blockchain implementation using ArrayList of Java
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> This's a very basic implementation to get knowledge about blockchain.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Quick explanation:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Blockchain is a list of blocks with "every block contain verified content of the previous block".
							 | 
						||
| 
								 | 
							
								Then we use collision-free attribute of the cryptographic hash function to verify "the content of the previous block".
							 | 
						||
| 
								 | 
							
								This example will use SHA256 hash function, and use built-in ArrayList type of Java.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Basic struture:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A block include at least header and data.
							 | 
						||
| 
								 | 
							
								A header contain the verified information of the previous block, or the bash code in this case.
							 | 
						||
| 
								 | 
							
								The very first block is called GENESIS block, with the bash code is the its code.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> We can see blockhain is data struture base on another struture.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Note:
							 | 
						||
| 
								 | 
							
								 - Since we're using Java, for quickly, the example will use public attribute instead of getter and setter methods.
							 | 
						||
| 
								 | 
							
								 - Data in blockchain could be changed, but it will take a greate cost will the big data.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Hash library
							 | 
						||
| 
								 | 
							
								We's use the built-in library
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								import java.security.*;
							 | 
						||
| 
								 | 
							
								public class Sha
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  public static String hash256(String data) //throws NoSuchAlgorithmException 
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    try
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      MessageDigest md = MessageDigest.getInstance("SHA-256");
							 | 
						||
| 
								 | 
							
								      md.update(data.getBytes());
							 | 
						||
| 
								 | 
							
								      return bytesToHex(md.digest());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    catch(Exception e)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      System.out.println(e.toString());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return "ERROR";
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  public static String bytesToHex(byte[] bytes) 
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    StringBuffer result = new StringBuffer();
							 | 
						||
| 
								 | 
							
								    for (byte byt : bytes) result.append(Integer.toString((byt & 0xff) + 0x100, 16).substring(1));
							 | 
						||
| 
								 | 
							
								    return result.toString();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Create Block
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Every block with contain a header is hash code of the previous block.
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								public class Block
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  //Header
							 | 
						||
| 
								 | 
							
								  public String previousHash;
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  //Data
							 | 
						||
| 
								 | 
							
								  public String data;
							 | 
						||
| 
								 | 
							
								  public Block(String _data, String _previousHash)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    this.data = _data;
							 | 
						||
| 
								 | 
							
								    this.previousHash = _previousHash;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  public String getHash()
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    return Sha.hash256(this.previousHash + this.data);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  public String toString()
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    return String.format(" dataValue:\t %s\n previousHash:\t %s\n currrentHash:\t %s\n", this.data, this.previousHash, this.getHash());
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								## Create Blockchain
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								import java.util.*;
							 | 
						||
| 
								 | 
							
								public class Blockchain
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  public List<Block> blocks;
							 | 
						||
| 
								 | 
							
								  public void add(String _data)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    Block previousBlock = this.blocks.get(this.blocks.size()-1);
							 | 
						||
| 
								 | 
							
								    this.blocks.add(new Block(_data, previousBlock.getHash()));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  public Blockchain()
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    this.blocks = new ArrayList<Block>();
							 | 
						||
| 
								 | 
							
								    this.blocks.add(new Block("GENESIS", Sha.hash256("GENESIS")));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Using
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								import java.util.*;
							 | 
						||
| 
								 | 
							
								public class BlockchainDemo
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  public static void main(String args[])
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    //Generate datas
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    List<String> datas = new ArrayList<String>();
							 | 
						||
| 
								 | 
							
								    for(int i=0; i<=10; i++)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      datas.add(Integer.toString(i));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    //Add blocks in to blockchain with the created datas
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    Blockchain blockchain = new Blockchain();
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    datas.forEach(_data -> blockchain.add(_data));
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    blockchain.blocks.forEach(_block -> System.out.println(_block.toString()));
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Verify the blockchain
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This function will verify if our Blockchain is "trusted", that meant not any block updated
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								public static boolean verify(Blockchain _blockchain)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  Blockchain.Block previousBlock = _blockchain.blocks.get(0);
							 | 
						||
| 
								 | 
							
								  boolean res = true;
							 | 
						||
| 
								 | 
							
								  for(int i = 1; i < _blockchain.blocks.size(); i++)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    Blockchain.Block currentBlock = _blockchain.blocks.get(i);
							 | 
						||
| 
								 | 
							
								    if ( !previousBlock.getHash().equals(currentBlock.previousHash) )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      System.out.println("\t\tBROKEN");
							 | 
						||
| 
								 | 
							
								      res = false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    System.out.println(currentBlock.toString());
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								    previousBlock = _blockchain.blocks.get(i);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return res;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 |