سارینا حیدری
سارینا حیدری
خواندن ۶ دقیقه·۵ سال پیش

ایجاد یک بلاک چین با کمتر از 100 خط کد نویسی با زبان پایتون


اگر چه بلاک چین در نگاه اول پیچیده به نظر می‌رسد اما مفهوم ساده‌ای در پشت آن نهفته است. بدون شک به کاربردن عملی آن می‌تواند به فهم بهتر این تکنولوژی کمک کند. در این مقاله به صورت تصویری آموزش داده می‌شود که چگونه می‌توان با چند خط کدنویسی یک بلاک چین ساده را ایجاد کرد.

ایجاد یک بلاک چین : مفهوم اساسی بلاک چین (Blockchain) بسیار ساده است , یک پایگاه داده توزیع‌شده که به طور پیوسته فهرستی رو به رشد از سوابق مرتب‌شده را حفظ می‌کند.

بلاک چین واژه‌ای است که معمولا با نام بیت کوین و/یا اتریوم همراه شده است اما بلاک چین فراتر از این دو رمز ارز است. بلاک چین تکنولوژی پشت این رمز ارزها و پشت هر رمز ارز دیگری است.

دیگر موارد استفاده‌ بسیاری برای بلاک چین وجود دارد، مثلاً بازی‌ها (کریپتوکیتیز (CryptoKitties)) یا همچنین بلاک چین+IOT (اینترنت اشیا) و این‌ها تنها نقطه‌ی آغاز برای این تکنولوژی هستند.

یک تصویر ساده درباره‌ مفهوم بلاک چین
یک تصویر ساده درباره‌ مفهوم بلاک چین

بلاک چین، همانطور که نامش می‌گوید، زنجیره‌ای از بلوک‌ها است. به همین خاطر، ما اولین کلاس داده، یا همان اولین بلوک، را به شکل زیر داریم.

در این مرحله، بلوک من دارای صفت‌های زیر است:

  • شاخص (index) – شاخص بلاک نشان‌دهنده‌ی موقعیت آن در زنجیره است.
  • برچسب زمان (timestamp) – روز و زمانی که بلوک به بلاک چین اضافه شده است.
  • داده (data) – ارزش داده، به عبارت دیگر، آنچه می‌خواهید ذخیره کنید.
  • هش قبلی (previous hash) – هش مربوط به بلوک با شاخص -1
  • هش (hash) – هش مربوط به همین بلوک

احتمالاً چند نکته‌ جالب در تصویر به چشمتان خواهد خورد، به همین خاطر در اینجا کمی درباره‌ آن‌ها توضیح می‌دهم:

  • بیشتر سعی کنید به صورت شی‌گرا برنامه‌نویسی کنید. تابع isValid برای هر بلوک به این سوال پاسخ می‌دهد که آیا آن بلاک معتبر است.
  • سازنده (constructor) همه‌ی چیزهای داخل بلوک را تعریف می‌کند.
  • تابع « update » برای به‌روزرسانی دیکشنری (dict) هنگام خواندن از یک فایل است. این کار برای ذخیره‌ی داده به منظور استفاده‌های بعدی در آینده صورت می‌گیرد.
  • محاسبه‌ی هش برای فایل‌های از پیش ذخیره‌شده‌ صورت می‌گیرد تا همیشه به کدگذاری مشابهی تبدیل شوند، زیرا کدگذاری‌های مختلف، کاراکترهای متفاوتی داشته و کاراکترهای متفاوت، هش‌های متفاوتی ایجاد می‌کنند.

بنابراین این یک زنجیره‌ معتبر است، اگر بلوک تغییر پیدا کرد، بلوک فعلی متوجه خواهد شد و خودش را نامعتبر می‌کند و اگر هر یک از بلوک‌های قبلی تغییر یافت، زنجیره متوجه خواهد شد و تمام زنجیره نامعتبر خواهد شد. این مفهومی است که داده‌های ذخیره‌شده در بلاک چین را تغییرناپذیر می‌کند.

خب حالا اگر کلاس داده‌ دوم یا همان بلاک چین را در نظر بگیریم، به این شکل است

نابراین کلاس بلاک چین، بلوک‌ها را ایجاد کرده و به دنبال هر گونه مشکل در زنجیره می‌گردد و این کلاس مسئول ذخیره‌ی یک فایل JSON ساده و خواندن از روی آن است. اولین نسخه‌ی بلاک چین ما آماده است! \o/

تمامی کد در قسمت پایین قرار گرفته، شما می‌توانید آن را اجرا کرده و خروجی را ببینید.

#!/usr/bin/python3 # coding=UTF-8 # encoding=UTF-8 import json import os import hashlib import datetime class Block: def __init__(self, index, data, previousHash='00000'): self.index = index self.timestamp = str(datetime.datetime.now()) self.data = data self.previousHash = previousHash self.hash = self.calculateHash() def update(self, dic): self.__dict__=dic return self def calculateHash(self): return hashlib.sha256(str(self.index).encode('utf-8') + self.previousHash.encode('utf-8') + str(self.data).encode('utf-8') + self.timestamp.encode('utf-8')).hexdigest() def isValid(self): return self.hash == self.calculateHash() def printBlock(self): return (&quot\nBlock #&quot + str(self.index) + &quot\nData: &quot + str(self.data) + &quot\nTimeStamp: &quot + str(self.timestamp) + &quot\nBlock Hash: &quot + str(self.hash) + &quot\nBlock Previous Hash: &quot + str(self.previousHash) +&quot\n---------------&quot) class BlockChain: def __init__(self, file=&quotblock.chain&quot): self.chain = [Block(0, &quotGenesis&quot)] self.file=file def getLatestBlock(self): return self.chain[len(self.chain)-1] def getNextIndex(self): return self.getLatestBlock().index + 1 def generateBlock(self, data): self.chain.append(Block(self.getNextIndex(), data, self.getLatestBlock().hash)) def isChainValid(self): for i in range (1, len(self.chain)): if not self.chain[i].isValid(): return False if self.chain[i].previousHash != self.chain[i-1].hash: return False return True def printBlockChain(self): return ''.join([self.chain[i].printBlock() for i in range(1, len(self.chain))]) def save(self): if(self.isChainValid()): with open(self.file, 'w') as f: f.write(json.dumps(self, default=lambda obj: obj.__dict__)) else: print(&quotNot saved the chain!&quot) def open(self): if(os.path.exists(self.file)): with open(self.file) as f: data = json.load(f) self.__dict__ = data self.chain = [Block(&quot&quot,&quot&quot).update(dic) for dic in data[&quotchain&quot]] def main(): blockchain = BlockChain() blockchain.generateBlock(&quotHello World!&quot) blockchain.generateBlock(3) blockchain.generateBlock({&quotaccount&quot: 123123, &quotmount&quot: 100}) print(blockchain.printBlockChain()) print (&quotChain valid? &quot + str(blockchain.isChainValid())) blockchain.save() blockchain.chain[1].data = &quotHello Darkness my old friend!&quot print(blockchain.printBlockChain()) print (&quotChain valid? &quot + str(blockchain.isChainValid())) blockchain.save() test = BlockChain() test.open() print(test.printBlockChain()) print (&quotChain valid? &quot + str(test.isChainValid())) test.save() if __name__ == '__main__': main()

در این نسخه از بلاک چین، ما الگوریتم « اثبات کار » (Proof of Work) را پیاده‌سازی نکردیم، ایده‌ی آن این است که ابتدا بلاک چین را ایجاد کرده و تضمین کنید که زنجیره یکپارچه است. این قدم بعدی من خواهد بود.

منبع

ایجاد یک بلاک چینبرنامه نویسی بلاک چینبلاک چین
من اینجا هستم تا شما رو با دنیای بلاک چین و رمزارزها آشنا کنم.جدیدترین مطالب رو در سایت ما finmag.ir بخونید.
شاید از این پست‌ها خوشتان بیاید