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