كيف تصنع عملة معماة خاصة بك باستخدام بايثون

مع الارتفاع الحالي في العملات المشفرة ، تخلق blockchain ضجة في عالم التكنولوجيا. لقد اجتذبت هذه التكنولوجيا الكثير من الاهتمام بشكل أساسي بسبب قدرتها على ضمان الأمن ، وفرض اللامركزية ، وتسريع العمليات للعديد من الصناعات - وخاصة الصناعة المالية.

في الأساس ، تعد blockchain قاعدة بيانات عامة توثق بشكل لا رجعة فيه وتوثق حيازة الأصول الرقمية ونقلها. تستند العملات الرقمية ، مثل Bitcoin و Ethereum ، إلى هذا المفهوم. Blockchain هي تقنية مثيرة يمكنك استخدامها لتحويل إمكانيات تطبيقاتك.

في الآونة الأخيرة ، رأينا الحكومات والمنظمات والأفراد يستخدمون تقنية blockchain لإنشاء عملاتهم المشفرة - وتجنب التخلف عن الركب. والجدير بالذكر أنه عندما اقترح Facebook عملته الرقمية الخاصة ، المسماة Libra ، أثار الإعلان الكثير من المياه في جميع أنحاء العالم.

ماذا لو كنت تستطيع أيضًا أن تحذو حذوها وأن تنشئ نسختك الخاصة من العملة المشفرة؟

فكرت في هذا وقررت تطوير خوارزمية تنشئ عملة مشفرة.

قررت الاتصال بـ cryptocurrency fccCoin .

في هذا البرنامج التعليمي ، سأقوم بتوضيح العملية خطوة بخطوة التي استخدمتها لبناء العملة الرقمية (استخدمت المفاهيم الموجهة للكائنات في لغة برمجة Python).

فيما يلي المخطط الأساسي لخوارزمية blockchain لإنشاء fccCoin :

class Block: def __init__(): #first block class pass def calculate_hash(): #calculates the cryptographic hash of every block class BlockChain: def __init__(self): # constructor method pass def construct_genesis(self): # constructs the initial block pass def construct_block(self, proof_no, prev_hash): # constructs a new block and adds it to the chain pass @staticmethod def check_validity(): # checks whether the blockchain is valid pass def new_data(self, sender, recipient, quantity): # adds a new transaction to the data of the transactions pass @staticmethod def construct_proof_of_work(prev_proof): # protects the blockchain from attack pass @property def last_block(self): # returns the last block in the chain return self.chain[-1] 

الآن ، اسمحوا لي أن أشرح ما يحدث ...

1. بناء أول فئة بلوك

يتكون blockchain من عدة كتل مرتبطة ببعضها البعض (يبدو هذا مألوفًا ، أليس كذلك؟).

يحدث تسلسل الكتل بحيث إذا تم العبث بإحدى الكتل ، تصبح بقية السلسلة غير صالحة.

عند تطبيق المفهوم أعلاه ، قمت بإنشاء فئة الكتلة الأولية التالية:

import hashlib import time class Block: def __init__(self, index, proof_no, prev_hash, data, timestamp=None): self.index = index self.proof_no = proof_no self.prev_hash = prev_hash self.data = data self.timestamp = timestamp or time.time() @property def calculate_hash(self): block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) return hashlib.sha256(block_of_string.encode()).hexdigest() def __repr__(self): return "{} - {} - {} - {} - {}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) 

كما ترى من الكود أعلاه ، قمت بتعريف وظيفة __init __ () ، والتي سيتم تنفيذها عند بدء فئة Block ، تمامًا كما هو الحال في أي فئة Python أخرى.

لقد قدمت المعلمات التالية لوظيفة البدء:

  • self - يشير هذا إلى مثيل فئة Block ، مما يجعل من الممكن الوصول إلى الأساليب والسمات المرتبطة بالفئة ؛
  • index - هذا يتتبع موقع الكتلة داخل blockchain ؛
  • proof_no - هذا هو الرقم الناتج أثناء إنشاء كتلة جديدة (تسمى التعدين) ؛
  • prev_hash - يشير هذا إلى تجزئة الكتلة السابقة داخل السلسلة ؛
  • البيانات — تعطي سجلاً لجميع المعاملات المنجزة ، مثل الكمية المشتراة ؛
  • الطابع الزمني — هذا يضع طابعًا زمنيًا للمعاملات.

الطريقة الثانية في الفصل ، calculate_hash ، ستولد تجزئة الكتل باستخدام القيم المذكورة أعلاه. يتم استيراد وحدة SHA-256 إلى المشروع للمساعدة في الحصول على تجزئة الكتل.

بعد إدخال القيم في خوارزمية تجزئة التشفير ، ستعيد الوظيفة سلسلة 256 بت تمثل محتويات الكتلة.

هذه هي الطريقة التي يتم بها تحقيق الأمان في blockchains - سيكون لكل كتلة تجزئة وستعتمد التجزئة على تجزئة الكتلة السابقة.

على هذا النحو ، إذا حاول شخص ما اختراق أي كتلة في السلسلة ، فستحتوي الكتل الأخرى على تجزئات غير صالحة ، مما يؤدي إلى تعطيل شبكة blockchain بأكملها.

في النهاية ، ستبدو الكتلة كما يلي:

{ "index": 2, "proof": 21, "prev_hash": "6e27587e8a27d6fe376d4fd9b4edc96c8890346579e5cbf558252b24a8257823", "transactions": [ {'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1} ], "timestamp": 1521646442.4096143 } 

2. بناء فئة Blockchain

الفكرة الرئيسية لـ blockchain ، تمامًا كما يوحي الاسم ، تتضمن "ربط" عدة كتل ببعضها البعض.

لذلك ، سأقوم ببناء فئة Blockchain والتي ستكون مفيدة في إدارة أعمال السلسلة بأكملها. هذا هو المكان الذي ستحدث فيه معظم الإجراءات.

و Blockchain سوف يكون من الدرجة أساليب المساعد المختلفة لإنجاز المهام المختلفة في blockchain.

اسمحوا لي أن أشرح دور كل من الأساليب في الفصل.

أ. طريقة البناء

تضمن هذه الطريقة إنشاء مثيل لـ blockchain.

class BlockChain: def __init__(self): self.chain = [] self.current_data = [] self.nodes = set() self.construct_genesis() 

فيما يلي أدوار سماته:

  • سلسلة self.chain - هذا المتغير يحافظ على جميع الكتل ؛
  • self.current_data - يحافظ هذا المتغير على جميع المعاملات المكتملة في الكتلة ؛
  • self.construct_genesis () - ستهتم هذه الطريقة ببناء الكتلة الأولية.

ب. بناء كتلة التكوين

يتطلب blockchain على construct_genesis طريقة لبناء كتلة الأولي في السلسلة. في اتفاقية blockchain ، تعتبر هذه الكتلة خاصة لأنها ترمز إلى بداية blockchain.

في هذه الحالة ، دعنا نبنيها ببساطة عن طريق تمرير بعض القيم الافتراضية إلى التابع construct_block .

لقد أعطيت كل من proof_no و prev_hash بقيمة صفر ، على الرغم من أنه يمكنك تقديم أي قيمة تريدها.

def construct_genesis(self): self.construct_block(proof_no=0, prev_hash=0) def construct_block(self, proof_no, prev_hash): block = Block( index=len(self.chain), proof_no=proof_no, prev_hash=prev_hash, data=self.current_data) self.current_data = [] self.chain.append(block) return block 

ج. بناء كتل جديدة

و construct_block يستخدم طريقة لخلق كتل جديدة في blockchain.

إليك ما يحدث مع السمات المختلفة لهذه الطريقة:

  • index - يمثل هذا طول سلسلة blockchain ؛
  • proof_nor & prev_hash - تمررها طريقة المتصل ؛
  • البيانات - تحتوي على سجل لجميع المعاملات التي لم يتم تضمينها في أي كتلة على العقدة ؛
  • self.current_data - يُستخدم لإعادة تعيين قائمة المعاملات على العقدة. إذا تم إنشاء كتلة وتم تخصيص المعاملات لها ، تتم إعادة تعيين القائمة لضمان إضافة المعاملات المستقبلية إلى هذه القائمة. وستتم هذه العملية بشكل مستمر.
  • self.chain.append () - تربط هذه الطريقة الكتل المنشأة حديثًا بالسلسلة ؛
  • إرجاع — أخيرًا ، يتم إرجاع كائن كتلة مبني.

د. التحقق من الصلاحية

تعتبر طريقة check_validity مهمة في تقييم سلامة blockchain وضمان عدم وجود الحالات الشاذة.

كما ذكرنا سابقًا ، تعد التجزئة ضرورية لأمن blockchain ، حيث سيؤدي أدنى تغيير في الكائن إلى إنشاء تجزئة جديدة تمامًا.

لذلك ، تستخدم طريقة check_validity هذه عبارات if للتحقق مما إذا كانت تجزئة كل كتلة صحيحة.

كما يتحقق أيضًا مما إذا كانت كل كتلة تشير إلى الكتلة السابقة الصحيحة ، من خلال مقارنة قيمة تجزئتها. إذا كان كل شيء صحيحًا ، فإنه يعود صحيحًا ؛ وإلا ، فإنها ترجع خطأ.

@staticmethod def check_validity(block, prev_block): if prev_block.index + 1 != block.index: return False elif prev_block.calculate_hash != block.prev_hash: return False elif not BlockChain.verifying_proof(block.proof_no, prev_block.proof_no): return False elif block.timestamp <= prev_block.timestamp: return False return True 

ه. إضافة بيانات المعاملات

و new_data يستخدم طريقة لإضافة بيانات المعاملات إلى كتلة. انها طريقة بسيطة جدا: أنها تقبل المعلمات الثلاث (تفاصيل المرسل وتفاصيل المتلقي، والكمية)، وإلحاق بيانات المعاملات إلى self.current_data القائمة.

في أي وقت يتم إنشاء كتلة جديدة، يتم تخصيص هذه القائمة إلى أن كتلة وإعادة مرة أخرى كما هو موضح في construct_block الأسلوب.

بمجرد إضافة بيانات المعاملة إلى القائمة ، يتم إرجاع فهرس الكتلة التالية التي سيتم إنشاؤها.

يتم حساب هذا المؤشر بإضافة 1 إلى فهرس الكتلة الحالية (وهو الأخير في blockchain). ستساعد البيانات المستخدم في إرسال المعاملة في المستقبل.

def new_data(self, sender, recipient, quantity): self.current_data.append({ 'sender': sender, 'recipient': recipient, 'quantity': quantity }) return True 

F. إضافة إثبات العمل

إثبات العمل هو مفهوم يمنع إساءة استخدام blockchain. ببساطة ، هدفه هو تحديد الرقم الذي يحل مشكلة بعد إجراء قدر معين من العمل الحسابي.

إذا كان مستوى صعوبة تحديد الرقم مرتفعًا ، فإنه لا يشجع على إرسال البريد العشوائي والتلاعب في blockchain.

في هذه الحالة ، سنستخدم خوارزمية بسيطة تثني الناس عن تعدين الكتل أو إنشاء الكتل بسهولة.

@staticmethod def proof_of_work(last_proof): '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes f is the previous f' f' is the new proof ''' proof_no = 0 while BlockChain.verifying_proof(proof_no, last_proof) is False: proof_no += 1 return proof_no @staticmethod def verifying_proof(last_proof, proof): #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes? guess = f'{last_proof}{proof}'.encode() guess_hash = hashlib.sha256(guess).hexdigest() return guess_hash[:4] == "0000" 

ز. الحصول على آخر كتلة

Lastly, the latest_blockmethod is a helper method that assists in obtaining the last block in the blockchain. Remember that the last block is actually the current block in the chain.

@property def latest_block(self): return self.chain[-1] 

Let’s sum everything together

Here is the entire code for creating the fccCoin cryptocurrency.

You can also get the code on this GitHub repository.

import hashlib import time class Block: def __init__(self, index, proof_no, prev_hash, data, timestamp=None): self.index = index self.proof_no = proof_no self.prev_hash = prev_hash self.data = data self.timestamp = timestamp or time.time() @property def calculate_hash(self): block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) return hashlib.sha256(block_of_string.encode()).hexdigest() def __repr__(self): return "{} - {} - {} - {} - {}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) class BlockChain: def __init__(self): self.chain = [] self.current_data = [] self.nodes = set() self.construct_genesis() def construct_genesis(self): self.construct_block(proof_no=0, prev_hash=0) def construct_block(self, proof_no, prev_hash): block = Block( index=len(self.chain), proof_no=proof_no, prev_hash=prev_hash, data=self.current_data) self.current_data = [] self.chain.append(block) return block @staticmethod def check_validity(block, prev_block): if prev_block.index + 1 != block.index: return False elif prev_block.calculate_hash != block.prev_hash: return False elif not BlockChain.verifying_proof(block.proof_no, prev_block.proof_no): return False elif block.timestamp <= prev_block.timestamp: return False return True def new_data(self, sender, recipient, quantity): self.current_data.append({ 'sender': sender, 'recipient': recipient, 'quantity': quantity }) return True @staticmethod def proof_of_work(last_proof): '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes f is the previous f' f' is the new proof ''' proof_no = 0 while BlockChain.verifying_proof(proof_no, last_proof) is False: proof_no += 1 return proof_no @staticmethod def verifying_proof(last_proof, proof): #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes? guess = f'{last_proof}{proof}'.encode() guess_hash = hashlib.sha256(guess).hexdigest() return guess_hash[:4] == "0000" @property def latest_block(self): return self.chain[-1] def block_mining(self, details_miner): self.new_data( sender="0", #it implies that this node has created a new block receiver=details_miner, quantity= 1, #creating a new block (or identifying the proof number) is awarded with 1 ) last_block = self.latest_block last_proof_no = last_block.proof_no proof_no = self.proof_of_work(last_proof_no) last_hash = last_block.calculate_hash block = self.construct_block(proof_no, last_hash) return vars(block) def create_node(self, address): self.nodes.add(address) return True @staticmethod def obtain_block_object(block_data): #obtains block object from the block data return Block( block_data['index'], block_data['proof_no'], block_data['prev_hash'], block_data['data'], timestamp=block_data['timestamp']) 

Now, let’s test our code to see if it works.

blockchain = BlockChain() print("***Mining fccCoin about to start***") print(blockchain.chain) last_block = blockchain.latest_block last_proof_no = last_block.proof_no proof_no = blockchain.proof_of_work(last_proof_no) blockchain.new_data( sender="0", #it implies that this node has created a new block recipient="Quincy Larson", #let's send Quincy some coins! quantity= 1, #creating a new block (or identifying the proof number) is awarded with 1 ) last_hash = last_block.calculate_hash block = blockchain.construct_block(proof_no, last_hash) print("***Mining fccCoin has been successful***") print(blockchain.chain) 

It worked!

Here is the output of the mining process:

***Mining fccCoin about to start*** [0 - 0 - 0 - [] - 1566930640.2707076] ***Mining fccCoin has been successful*** [0 - 0 - 0 - [] - 1566930640.2707076, 1 - 88914 - a8d45cb77cddeac750a9439d629f394da442672e56edfe05827b5e41f4ba0138 - [{'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}] - 1566930640.5363243] 

Conclusion

There you have it!

That’s how you could create your own blockchain using Python.

Let me say that this tutorial just demonstrates the basic concepts for getting your feet wet in the innovative blockchain technology.

إذا تم نشر هذه العملة كما هي ، فلن تتمكن من تلبية متطلبات السوق الحالية لعملة رقمية مستقرة وآمنة وسهلة الاستخدام.

لذلك ، لا يزال من الممكن تحسينه عن طريق إضافة ميزات إضافية لتعزيز قدراته في التعدين وإرسال المعاملات المالية.

ومع ذلك ، فهي نقطة انطلاق جيدة إذا قررت جعل اسمك معروفًا في عالم التشفير المذهل.

إذا كان لديك أي تعليقات أو أسئلة ، يرجى نشرها أدناه.

سعيد (التشفير) الترميز!