ব্লকচেইন হচ্ছে তথ্যের একটি ডিসেন্ট্রালাইজড খাতা বা লেজার। ব্লকচেইনকে ক্রিপ্টোগ্রাফি ব্যবহার করে সংযুক্ত ডেটা ব্লক নিয়ে গঠিত একটি চেইন ও বলা যেতে পারে।

ব্লকচেইন এর কিছু গুরুত্বপূর্ণ বৈশিষ্ট্যঃ

✅টেম্পার-প্রুফঃ 

ব্লকচেইনের সর্বপ্রথম বৈশিষ্ট্য হলো, ব্লকের প্রতিটি ডেটা টেম্পার-প্রুফ। প্রতিটি ব্লককে একটি ক্রিপ্টোগ্রাফিক ডাইজেস্ট দ্বারা বর্ণনা করা হয়, যা একটি হ্যাশ নামেও পরিচিত। এই হ্যাশই  ব্লকটিকে টেম্পার-প্রুফ করে তোলে।

✅ডিসেন্ট্রালাইজডঃ

 ব্লকচেইনের পুরো নেটওয়ার্কটি সম্পূর্ণ ডিসেন্ট্রালাইজড । এর মানে হল যে কোনও মাস্টার নোড নেই এবং নেটওয়ার্কের প্রতিটি নোডের কাছেই একই অনুলিপি রয়েছে।

✅স্বচ্ছতাঃ

  নেটওয়ার্কে অংশগ্রহণকারী প্রতিটি নোড যাচাই করে এবং অন্যান্য নোডের সাথে কনসেন্সাস অ্যালগরিদমের মাধ্যমে একটি নতুন ব্লক যোগ করে । সুতরাং, প্রতিটি নোডের কাছেই সম্পূর্ণ ডেটা  দৃশ্যমান। 

ব্লকচেইনের মৌলিক একক হল ব্লক । একটি একক ব্লক বেশ কয়েকটি লেনদেন বা অন্যান্য মূল্যবান ডেটা নিজের মধ্যে রাখতে পারে। 

জাভাতে বেসিক ব্লকচেইন

একটি ব্লক বাস্তবায়ন

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

}

  • পূর্ববর্তী ব্লকের হ্যাশ, চেইন তৈরি করার জন্য একটি গুরুত্বপূর্ণ অংশ। 
  • এটি ব্লক তৈরির একটি টাইমস্ট্যাম্প। 
  • এখানে একটি নন্স(nonce) রয়েছে, যা ক্রিপ্টোগ্রাফিতে ব্যবহৃত একটি বিধিবহির্ভূত(arbitrary)সংখ্যা। 
  • এই ব্লকের হ্যাশ, অন্যান্য তথ্যের উপর ভিত্তি করে গণনা করা হয়। 

হ্যাশ গণনা করা

একটি হ্যাশ ফাংশন প্রথমে নির্দিষ্ট আকারের আউটপুট ডেটা থেকে ইচ্ছামত ইনপুট ডেটা ম্যাপ করে । মজার ব্যাপার হলো হ্যাশ, ইনপুট ডেটার যেকোনো পরিবর্তনের জন্য যথেষ্ট সংবেদনশীল, তা যতই ছোট হোক না কেন।

তাছাড়া, হ্যাশ থেকে ইনপুট ডেটা ফিরে পাওয়া অসম্ভব। এই বৈশিষ্ট্যগুলি হ্যাশ ফাংশনকে ক্রিপ্টোগ্রাফিতে বেশ উপযোগী করে তোলে।

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();

}

  • প্রথমে, আমরা একটি হ্যাশ তৈরি করতে ব্লকের বিভিন্ন অংশ সংযুক্ত করব। 
  • তারপর, আমরা MessageDigest থেকে SHA-256 হ্যাশ ফাংশনের একটি উদাহরণ পেয়ে যাবো।
  • তারপর, ইনপুট ডেটার হ্যাশ মান তৈরি করা যেতে পারে , যা একটি বাইট অ্যারে (byte array)। 
  • অবশেষে, আমরা বাইট অ্যারেকে একটি হেক্স স্ট্রিং-এ রূপান্তরিত করবো, একটি হ্যাশকে সাধারণত ৩২-সংখ্যার হেক্স নম্বর (32-digit hex number) হিসাবে উপস্থাপিত হয়।

ব্লক মাইনিং 

ব্লক মাইনিং এর অর্থ একটি গণনাগতভাবে জটিল কাজ সমাধান করা। 

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;

}

আমরা যে উপসর্গটি বা prefix খুঁজে পেতে চাই তা সংজ্ঞায়িত করবো। তারপর আমরা সমাধান খুঁজে পেয়েছি কিনা তা পরীক্ষা করে দেখবো।  যদি তা না পাই তাহলে আমরা ননস (nonce) বৃদ্ধি করবো যা লুপে হ্যাশ গণনা শুরু করবে, কাঙ্ক্ষিত ফলাফল না আসা পর্যন্ত লুপটি চলতে থাকবে।

কোডটি যেভাবে রান হয়

এখন যেহেতু আমরা আমাদের ব্লককে এর ফাংশন সহ সংজ্ঞায়িত করেছি, তাহলে আমরা একটি সাধারণ ব্লকচেইন তৈরি করতে এটি ব্যবহার করতে পারি। আমরা এটি একটি ArrayList এ সংরক্ষণ করব :

List blockchain = new ArrayList<>();

int prefix = 4;

String prefixString = new String(new char[prefix]).replace('\0', '0');

এবার দেখা যাক, কিভাবে আমরা এতে একটি ব্লক যোগ করতে পারি:

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

}

 ব্লকচেইন যাচাইকরণ

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

}

প্রতিটি ব্লকের জন্য আমাদের তিনটি বিষয়ে নিশ্চিত করতে হবে:

১.বর্তমান ব্লকের সংরক্ষিত হ্যাশ আসলেই এই মানটি গণনা করছে কিনা

২.বর্তমান ব্লকে সংরক্ষিত আগের ব্লকের হ্যাশটি কি আসলেই তার পূর্ববর্তী ব্লকের হ্যাশ কিনাজ

৩.বর্তমান ব্লকটি মাইন করা হয়েছে কিনাযা

জাভার টুকটাক জ্ঞান থাকলে কিন্তু, আপনিও ঠিক এভাবেই কোড লিখে একটি ব্লকচেইন তৈরি করে ফেলতে পারেন।