পাইথন ব্যবহার করে একটি সাধারণ ব্লকচেইন তৈরি করুন
ব্লকচেইন হল নির্দিষ্ট রেকর্ডের একটি টাইম-স্ট্যাম্পযুক্ত ডিসেন্ট্রালাইজড সিরিজ যাতে যেকোন আকারের ডেটা থাকতে পারে। এটি বিশ্বব্যাপী ছড়িয়ে ছিটিয়ে থাকা কম্পিউটারগুলোর একটি বৃহৎ নেটওয়ার্ক দ্বারা নিয়ন্ত্রিত হয় এবং এখানে কোনো একক মালিকানা বা কেন্দ্রীয় কর্তৃপক্ষ নেই। প্রতিটি ব্লককে হ্যাশিং প্রযুক্তি ব্যবহার করে একে অপরের সাথে সুরক্ষিত এবং সংযুক্ত করা হয় যা একে একজন অননুমোদিত ব্যক্তির দ্বারা বিকৃত হওয়া থেকে রক্ষা করে।
যেভাবে পাইথন ব্যবহার করে ব্লকচেইন তৈরি করা হয় তার পাশাপাশি নতুন ব্লক মাইন এবং পুরো ব্লকচেইন প্রদর্শন করা হয়ঃ
- ডেটা JSON ফরম্যাটে সংরক্ষণ করা হবে যা প্রয়োগ করা খুব সহজ এবং পড়া সহজ। ডেটা একটি ব্লকে সংরক্ষণ করা হয় এবং ব্লকে একাধিক ডেটা থাকে। প্রতি মিনিটে একাধিক ব্লক যোগ করা হয় এবং একটি থেকে অন্যটিকে আলাদা করতে আমরা ফিঙ্গারপ্রিন্টিং ব্যবহার করব।
- আঙ্গুলের ছাপ হ্যাশ ব্যবহার করে যাচাই করা হবে, এক্ষেত্রে আমরা SHA২৫৬ হ্যাশিং অ্যালগরিদম ব্যবহার করব। প্রতিটি ব্লকের নিজস্ব হ্যাশ থাকবে এবং পূর্ববর্তী ফাংশনেরও হ্যাশ থাকবে যাতে এটিকে টেম্পার করা না যায়।
- প্রতিটি ব্লককে আগের এবং পরবর্তী ব্লকের সাথে হ্যাশ দিয়ে সংযুক্ত করা হবে।
- নতুন ব্লকের মাইনিং কাজ সফলভাবে হলেই কেবল সেটি যাচাই হবে।
- ব্লকটি সফলভাবে মাইন করার পর ব্লকটি চেইনে যুক্ত করা হবে।
- কোনো প্রকারের হস্তক্ষেপ রোধ করার জন্য চেইনের বৈধতা অবশ্যই পরীক্ষা করা উচিত।
- তারপরে ওয়েব অ্যাপটি ফ্লাস্ক ব্যবহার করে তৈরি করা হবে এবং ব্যবহারকারীর প্রয়োজন অনুসারে সর্বজনীনভাবে স্থাপন করা হবে।
পাইথন কোডটিঃ
# Python program to create Blockchain
# For timestamp import datetime
# Calculating the hash # in order to add digital # fingerprints to the blocks import hashlib
# To store data # in our blockchain import json
# Flask is for creating the web # app and jsonify is for # displaying the blockchain from flask import Flask, jsonify
class Blockchain:
# This function is created # to create the very first # block and set its hash to "0" def __init__(self): self.chain = [] self.create_block(proof=1, previous_hash='0')
# This function is created # to add further blocks # into the chain def create_block(self, proof, previous_hash): block = {'index': len(self.chain) + 1, 'timestamp': str(datetime.datetime.now()), 'proof': proof, 'previous_hash': previous_hash} self.chain.append(block) return block
# This function is created # to display the previous block def print_previous_block(self): return self.chain[-1]
# This is the function for proof of work # and used to successfully mine the block def proof_of_work(self, previous_proof): new_proof = 1 check_proof = False
while check_proof is False: hash_operation = hashlib.sha256( str(new_proof**2 - previous_proof**2).encode()).hexdigest() if hash_operation[:5] == '00000': check_proof = True else: new_proof += 1
return new_proof
def hash(self, block): encoded_block = json.dumps(block, sort_keys=True).encode() return hashlib.sha256(encoded_block).hexdigest()
def chain_valid(self, chain): previous_block = chain[0] block_index = 1
while block_index < len(chain): block = chain[block_index] if block['previous_hash'] != self.hash(previous_block): return False
previous_proof = previous_block['proof'] proof = block['proof'] hash_operation = hashlib.sha256( str(proof**2 - previous_proof**2).encode()).hexdigest()
if hash_operation[:5] != '00000': return False previous_block = block block_index += 1
return True
# Creating the Web # App using flask app = Flask(__name__)
# Create the object # of the class blockchain blockchain = Blockchain()
# Mining a new block
@app.route('/mine_block', methods=['GET']) def mine_block(): previous_block = blockchain.print_previous_block() previous_proof = previous_block['proof'] proof = blockchain.proof_of_work(previous_proof) previous_hash = blockchain.hash(previous_block) block = blockchain.create_block(proof, previous_hash)
response = {'message': 'A block is MINED', 'index': block['index'], 'timestamp': block['timestamp'], 'proof': block['proof'], 'previous_hash': block['previous_hash']}
return jsonify(response), 200
# Display blockchain in json format
@app.route('/get_chain', methods=['GET']) def display_chain(): response = {'chain': blockchain.chain, 'length': len(blockchain.chain)} return jsonify(response), 200
# Check validity of blockchain
@app.route('/valid', methods=['GET']) def valid(): valid = blockchain.chain_valid(blockchain.chain)
if valid: response = {'message': 'The Blockchain is valid.'} else: response = {'message': 'The Blockchain is not valid.'} return jsonify(response), 200
# Run the flask server locally app.run(host='127.0.0.1', port=5000) |
আউটপুট
আউটপুট (mine_block):
{ "index":2, "message":"A block is MINED", "previous_hash":"2d83a826f87415edb31b7e12b35949b9dbf702aee7e383cbab119456847b957c", "proof":533, "timestamp":"2020-06-01 22:47:59.309000" } |
আউটপুট (get_chain):
{ "chain":[{"index":1, "previous_hash":"0", "proof":1, "timestamp":"2020-06-01 22:47:05.915000"},{"index":2, "previous_hash":"2d83a826f87415edb31b7e12b35949b9dbf702aee7e383cbab119456847b957c", "proof":533, "timestamp":"2020-06-01 22:47:59.309000"}], "length":2 } |
আউটপুট (valid):
{"message":"The Blockchain is valid."} |
সম্পূর্ণ ব্যাখ্যা:
১.কোডটি প্রয়োজনীয় লাইব্রেরি থেকে তথ্য নিয়ে শুরু করে।
২. হ্যাশলিব লাইব্রেরি ব্লকচেইনের প্রতিটি ব্লকের জন্য একটি ডিজিটাল ফিঙ্গারপ্রিন্ট গণনা করতে ব্যবহৃত হয়।
৩. এই ফিঙ্গারপ্রিন্ট তারপর হ্যাশের মধ্যে সংরক্ষণ করা হয়।
৪. এরপরে একটি ব্লকচেইন, ওয়েব অ্যাপ তৈরি করতে প্রয়োজনীয় ডেটা ইমপোর্ট করে।
৫. এর মধ্যে রয়েছে ফ্লাস্ক ওয়েব অ্যাপ্লিকেশন ফ্রেমওয়ার্ক এবং JSON লাইব্রেরি।
৬. অবশেষে, ব্লকচেইন ক্লাস তৈরি হয়।
৭. ব্লকচেইন ক্লাসে দুটি প্রধান ফাংশন রয়েছে: অ্যানালাইজ এবং ক্রিয়েট ব্লকচেইনওয়েবঅ্যাপ।
৮. প্রথম ফাংশন কোড বিশ্লেষণ করে এবং পাইথনের স্ট্যান্ডার্ড ক্লাস এবং মডিউলের উপর ভিত্তি করে এটির একটি অবজেক্ট মডেল তৈরি করে।
৯.দ্বিতীয় ফাংশনটি এই অবজেক্ট মডেলের উপর ভিত্তি করে একটি ফ্লাস্ক ওয়েব অ্যাপ্লিকেশন তৈরি করে এবং এখানে ব্লকচেইন তৈরি করার জন্য প্রয়োজনীয় সমস্ত ডেটা সঞ্চয় করা হয় (প্রতিটি ব্লকের জন্য ডিজিটাল আঙ্গুলের ছাপ সহ)।
১০. আপনি যখন এই প্রোগ্রামটি রান করবেন, তখন আপনাকে নিজের সম্পর্কে কিছু তথ্য (আপনার নাম, ইমেইল ঠিকানা, ইত্যাদি) লিখতে বলা হবে।
১১. একবার এই তথ্য প্রবেশ করানো হলে, আপনি আপনার নিজের ব্যক্তিগত ব্লকচেইন দেখতে সক্ষম হবেন।
১২. কোডটি একটি পাইথন প্রোগ্রাম তৈরি করে যা একটি ব্লকচেইন তৈরি করবে।
১৩.কোডটি প্রথমে একটি ব্লকচেইন তৈরির জন্য প্রয়োজনীয় লাইব্রেরি ইমপোর্ট করে।
১৪. এর পরে, এটি ব্লকগুলিতে ডিজিটাল আঙ্গুলের ছাপ যুক্ত করার জন্য হ্যাশ গণনা করে।
১৫.অবশেষে, এটি JSON ব্যবহার করে ব্লকচেইনে ডেটা সঞ্চয় করে।
১৬.কোডটি self.chain নামে একটি খালি তালিকা তৈরি করে শুরু হয়।
১৭.কোডটি তারপর create_block নামে একটি ফাংশন তৈরি করে, যা দুটি আর্গুমেন্ট নেয়: প্রমাণ এবং পূর্ববর্তী_হ্যাশ।
১৮.create_block ফাংশনটি প্রথমে চেইনের ব্লকের সূচী গণনা করে (অর্থাৎ, এটি len(self.chain) এর মানের সাথে 1 যোগ করে)।
১৯.তারপর এটি datetime.datetime.now() এ টাইমস্ট্যাম্প সেট করে এবং ব্লক ভেরিয়েবলে এই ব্লকের জন্য প্রমাণ এবং পূর্ববর্তী_হ্যাশ মান সংরক্ষণ করে।
২০.অবশেষে, self.chain এই নতুন ব্লক অবজেক্টের সাথে আপডেট করা হয়।
২১.এর পরে, কোডটি print_previous_block নামে একটি ফাংশন তৈরি করে যা self.chain[-1] এর বিষয়বস্তু প্রিন্ট করে, যা বর্তমানে len(self.chain) + 1 – 1 এর সমান হিসাবে সেট করা হয়েছে কারণ চেইনে কতগুলো ব্লক রয়েছে। এই মুহুর্তে (শৃঙ্খলের শেষ ব্লকের সূচক 0 )।
২২.এখন চলুন এক নজরে দেখে নেওয়া যাক কিভাবে এই ফাংশনগুলি একসাথে কাজ করে: আপনি যখন create_block() কল করেন, তখন এটি দুটি আর্গুমেন্ট প্রদান করেঃ প্রমাণ এবং পূর্ববর্তী_হ্যাশ (যা উভয়ই পাইথন অবজেক্ট)।
২৩.এটি create_block কে বলে যে তার ব্লক ভেরিয়েবলের (প্রুফ এবং পূর্ববর্তী_হ্যাশ) ভিতরে কোন ডেটা সংরক্ষণ করা উচিত।
২৪.কোডটি প্রথমে self.chain নামে একটি খালি তালিকা তৈরি করে।
২৫.এর পরে, এটি create_block নামে একটি ফাংশন তৈরি করে যা দুটি আর্গুমেন্ট নেয়: প্রমাণ এবং পূর্ববর্তী_হ্যাশ।
২৬.এই ফাংশনের উদ্দেশ্য হল ব্লকচেইনে একটি নতুন ব্লক তৈরি করা এবং ব্লক অবজেক্টের মধ্যে তার তথ্য সংরক্ষণ করা।
২৭.কোডের পরবর্তী অংশটি স্ক্রিনে পূর্ববর্তী ব্লক প্রদর্শনের জন্য দায়ী।
২৮.এটি print_previous_block ফাংশন ব্যবহার করে করা হয় যা একটি আর্গুমেন্ট নেয়: self.chain[-1]।
২৯.অবশেষে, এই কোডের শেষ অংশটি কাজের প্রমাণ সম্পাদনের জন্য দায়ী।
৩০.কোডটি ব্লকচেইনের ক্লাসের একটি উদাহরণ তৈরি করে শুরু হয়।
৩১.এই শ্রেণীটি ব্লকচেইন সম্পর্কে পূর্ববর্তী ব্লক এবং প্রমাণ সহ তথ্য সংরক্ষণ করে।
৩২.কোডটি তারপর একটি নতুন ব্লক তৈরি করতে কাজের প্রমাণ বা প্রুফ ফাংশন ব্যবহার করে।
৩৩.নতুন ব্লকে একটি প্রমাণ এবং হ্যাশ রয়েছে যা পূর্ববর্তী ব্লক এবং প্রমাণের উপর নির্ভর করে।
৩৪.অবশেষে, কোডটি ব্লকচেইনের বর্তমান অবস্থা প্রিন্ট করে এবং এটি অ্যাক্সেস করার জন্য URL প্রদান করে।
৩৫.প্রুফ অফ ওয়ার্ক ফাংশনটি ব্লকচেইন নেটওয়ার্কে নতুন ব্লক তৈরি করতে ব্যবহৃত হয়।
৩৬.এটি একটি ক্রিপ্টোগ্রাফিক অ্যালগরিদম যেখানে একটি নতুন ব্লক তৈরি করার জন্য একটি কঠিন সমস্যা সমাধানের প্রয়োজন পড়ে।
৩৭.এই সমস্যার অসুবিধা সামঞ্জস্য করা হয়েছে যাতে একটি নতুন ব্লক তৈরি করতে যে গড় পরিমাণ সময় লাগবে, তা নির্বিশেষে যে কোনও নির্দিষ্ট সময়ে কতজন লোক নেটওয়ার্কে মাইন করছে।
৩৮. কোডটি ব্লকচেইনে একটি নতুন ব্লক তৈরি করে।
৩৯.এই ব্লকে বর্তমান মাইনারদের কাজের প্রমাণের সাথে আগের ব্লকের হ্যাশ থাকে।
৪০. মাইনার তারপর এই ব্লকটিকে কনসোলে প্রিন্ট করে এবং এটিকে পূর্ববর্তী_ব্লক নামক একটি ভেরিয়েবলে সংরক্ষণ করে।
৪১.পরবর্তীতে, তারা নতুন ব্লকের জন্য একটি নতুন হ্যাশের জন্য কাজের প্রমাণ বা প্রুফ ব্যবহার করে।
৪২. অবশেষে, তারা এই হ্যাশটিকে পূর্ববর্তী_প্রুফ নামে একটি ভেরিয়েবলে সংরক্ষণ করে এবং প্রমাণের মান এই নতুন তৈরি করা হ্যাশের সমান হতে সেট করে।
৪৩. কোডটি প্রয়োজনীয় লাইব্রেরি ইমপোর্ট করা শুরু করে।
৪৪. এর পরে, এটি ব্লকচেইন ক্লাসের একটি উদাহরণ তৈরি করে।
৪৫.এই ক্লাসে ব্লকচেইন সম্পর্কে সমস্ত তথ্য রয়েছে, যেমন এর দৈর্ঘ্য, সূচক এবং প্রমাণ।
৪৬.এরপরে, ব্লকচেইনটি বৈধ কিনা তা দেখতে কোডটি পরীক্ষা করা হয় ।
৪৭. যদি এটি বৈধ হয়, কোডটি একটি বার্তা সহ একটি প্রতিক্রিয়া প্রদান করে যেখানে বলা হয় যে ব্লকচেইন বৈধ৷
৪৮. অন্যথায়, কোডটি একটি বার্তা সহ একটি প্রতিক্রিয়া প্রদান করে, যা বলে যে ব্লকচেইন বৈধ নয়।
৪৯. অবশেষে, ডিসপ্লে_চেইন() পদ্ধতি ব্যবহার করে কোডটি json ফরম্যাটে অনস্ক্রিনে ব্লকচেইন প্রদর্শন করে।
৫০. কোডটি ব্লকচেইনকে json ফরম্যাটে প্রদর্শন করবে।
৫১.এটি ব্লকচেইনের বৈধতাও পরীক্ষা করবে।
৫২. ব্লকচেইন বৈধ হলে, এটি একটি বার্তা দেবে যা বলে যে ব্লকচেইন বৈধ।
৫৩. ব্লকচেইন বৈধ না হলে, এটি একটি বার্তা ফেরত দেবে, যা বলে যে ব্লকচেইন বৈধ নয়।
এখনি কোডটি পরীক্ষা করে দেখুন আর সামনে এমন আরও জ্ঞানমুলক ব্লগ পড়ার জন্য আমাদের পেইজে চোখ রাখুন।