بلاک چین چیست؟
با یک مثال ساده از دنیای واقعی به سراغ اموزش برنامه نویسی بلاک چین میرویم. فرض کنید من در سر کلاس درس، برگه امتحانم را بالا بگیرم تا به دیگر دانشجویان حاضر در کلاس، تقلب برسانم. دانشجویان هم از برگه امتحانی من، عکس میگیرند تا از آن استفاده کنند. آیا اگر من بعد از انجام دادن این کار، پشیمان شوم؛ پشیمانی سودی دارد؟!
متاسفانه باید بگویم که خیر؛ مگر این که گوشی تک تک دانشجویان را بگیرم و عکس را از تلفن همراه هر کدام پاک کنم که عملاً این کار و آن هم در سر جلسه امتحان، غیرممکن است. عملکرد بلاک چین، کاملاً مشابه این مثال میباشد.
در بیان علمی، بلاک چین فناوری ثبت اطلاعات و گزارشگیری از آن به صورت دائمی، امن و بدون امکان دستکاری یا تغییر است که به صورت زنجیرهای از رکوردها به نام بلوک در کنار یکدیگر قرار میگیرند و درواقع به صورت یک پایگاه داده بر روی تمام کامپیوترهای متصل به شبکه توزیع میشوند.
نحوه زنجیر شدن هر کدام از بلوکها به یکدیگر، با روش هشینگ یا رمزنگاری انجام میگیرد که با بالابردن امنیت بلاک چین، آن را به یک دیتابیس قدرتمند تبدیل کرده و بارها به کاربران خود ثابت کرده است که هر نوع تراکنشی در بلاک چین قابل ردیابی است. در ادامه اموزش برنامه نویسی بلاک چین، شما را با نحوه معماری آن و روش کدنویسی در محیط برنامه نویسی پایتون آشنا خواهیم کرد.
کاربردهای بلاک چین
با فراهم شدن زیرساختهای هوش مصنوعی و اینترنت اشیا، فناوری غیرمتمرکز بلاک چین، میتواند کاربردهای وسیعتری در دنیای امروز داشته باشد. در زیر به چهار مورد از کاربردهای مهم بلاک چین در انواع صنایع مختلف و نتایج استفاده از آنها اشاره خواهیم کرد.
- سیستم رایگیری الکترونیک: به کار بردن بلاک چین در این سیستم، نیاز به نیروی انسانی را کاهش داد و امکان تقلب در رای گیری را به صفر رساند. سرعت و دقت شمارش آرا را افزایش داده و به این ترتیب، باعث صرفه جویی در زمان و هزینه شد.
- سیستم اطلاعات درمان الکترونیک: به کمک بلاک چین و با تشکیل پرونده مراقبت بیمار، فرآیند ثبت اطلاعات سلامت و ارائه سوابق درمانی بیمار، همواره قابل بروزرسانی و پیگیری شد. در نتیجه شرکتهای بیمهای، داروخانهها و دیگر شرکتهای مرتبط توانستند به افراد مبتلا به امراض خاص، خدمات ویژه مطلوب ارائه دهند.
- سیستم تولید و حمل و نقل کارخانجات: در این سیستم، کارخانجات و شرکتها توانستند با استفاده از تکنولوژی بلاک چین و ثبت اطلاعات تولید و تحویل کالا به صورت مرحله به مرحله، اولاً فرآیند کنترل کیفیت کالا را مدیریت کرده و ثانیا اصالت کالای خود را تضمین کنند. مشتریان هم با افزایش تقاضا از این سیستم شفاف، استقبال کردند.
- سیستم فناوری مالی و ارزهای دیجیتال غیرمتمرکز: به کمک تکنولوژی بلاک چین، در این صنعت اولاً امکان تاسیس بانکداری بدون شعبه فراهم گردید. ثانیاً مدیریت تراکنشهای مالی هوشمند و برگشت ناپذیر فراهم شد تا نه تنها سرعت و دقت محاسبات و تراکنشها افزایش یابد بلکه یک واحد پول، فقط یک بار خرج شود. این سیستم در صنعت تجارت آنلاین خالق غولهای بزرگی همچون بیت کوین است.
پیشنیازهای اموزش برنامه نویسی بلاک چین
احتمالا از خودتان بپرسید که قبل از اموزش بلاک چین چه مهارتهایی بیاموزیم؟ اولاً قبل از شروع کدنویسی بلاک چین، باید زبان برنامه نویسی پایتون را بیاموزید و اطلاعات کافی نسبت به عملکرد درخواستهای HTTP داشته باشید. ثانیاً باید نرم افزارهای مورد نیاز را نصب کنید. در این آموزش، از محیط برنامه نویسی پایتون، کتابخانه Requests و کلاینت HTTP استفاده کردهایم.
کلاینت استفاده شده Postman میباشد ولی شما میتوانید از کلاینتهای دیگر هم استفاده کنید. اگر مایل هستید زبان برنامه نویسی پایتون را بیاموزید پیشنهاد میکنیم به آموزشهای پایتون فرادرس مراجعه کنید.
برای شروع سه مرحله زیر را دنبال کنید.
- به محیط Python.Org رفته و آخرین نسخه نرم افزار پایتون را دانلود و نصب کنید.
- با استفاده از ابزار مدیریت پکیج Pip پایتون به سادگی کتابخانه Requests قابل نصب میباشد. برای نصب از دستور Pip استفاده کنید.
pip install Flask==0.12.2 requests==2.18.4
pip install Requests==2.18.4
- ابزار Postman هم از آدرس اینترنتی https://www.postman.com/downloads/ در دسترس خواهدبود.
مراحل برنامه نویسی بلاک چین
برای شروع برنامه نویسی در اموزش برنامه نویسی بلاک چین، طی چند مرحله، آموزشهای مقدماتی لازم را ارائه میدهیم که برای افراد مبتدی بسیار مناسب بوده و یادگیری آن آسان میباشد. شما هم اگر یک فرد مبتدی هستید؛ مراحل زیر را با دقت دنبال کنید.
مرحله اول – ایجاد کلاس خالی بلاک چین
با استفاده از یک IDE پایتون مثل PyCharm یک فایل جدید به نام Blockchain.Py بسازید. توجه داشته باشید که این فایل تا آخر با شما همراه خواهد بود و همواره برای کدنویسی از آن استفاده خواهید کرد. برای ادامه باید اولاً با استفاده از تکه کد زیر، یک کلاس بلاک چین ایجاد کنید.
def __init__(self): self.chain = [] self.current_transactions = []
دوماً از تابع زیر برای ایجاد بلوک در داخل کلاس ساخته شده و اضافه کردن آن به زنجیره فرضی استفاده میکنیم.
def new_block(self): # Creates a new Block and adds it to the chain
حال اگر بخواهیم بر روی بلوک ساخته شده، تراکنش انجام دهیم؛ از تابع زیر استفاده میکنیم.
def new_transaction(self): # Adds a new transaction to the list of transactions
در این مرحله از تابع هشینگ برای رمزنگاری تراکنش ایجاد شده، استفاده میکنیم؛ برای این منظور، تکه کد زیر را داریم.
@staticmethod def hash(block): # Hashes a Block
در آخر، یه یک تابع برای فراخوانی آخرین بلوک نیاز خواهیم داشت که در زیر آورده شده است.
@property def last_block(self): # Returns the last Block in the chain
به همین راحتی و با کنار هم چیدن تکه کدهای ذکر شده در داخل فایل Blockchain.Py، یک پایگاه داده توزیع شده با قابلیت ثبت و کدینگ پیوسته اطلاعات، خواهید داشت که در آینده زنجیرهای از بلوکها با انواع تراکنشهای رمزنگاری شده را مدیریت خواهد کرد.
در ادامه اموزش برنامه نویسی بلاک چین، کلاس خالی بلاک چین را مشاهده میکنید.
class Blockchain(object): def __init__(self): self.chain = [] self.current_transactions = [] def new_block(self): # This function creates a new Block and adds it to the chain pass def new_transaction(self): # This function adds a new transaction to the list of transactions pass @staticmethod def hash(block): # This function hashes a Block pass @property def last_block(self): # This function returns the last Block in the chain pass
مرحله دوم – آشنایی کامل با معماری بلاک چین
هر کدام از بلوکهای ایجاد شده، ساختاری شبیه به شکل زیر دارد که در آن اندیس هر بلوک، زمان ایجاد آن، اطلاعات ثبت شده، هش بلوک حاضر و ماقبل نوشته میشود.
در شکل زیر، شما یک زنجیره کوچک از بلوکها را مشاهده میکنید که امنیت خود را با روش هشینگ تأمین میکنند به این صورت که در یک حمله سایبری، حتی اگر حمله کننده موفق به تخریب بلوک اول شود؛ به دلیل وجود رمزنگاری هش، بلوکهای دیگر قابل دسترسی و تخریب نخواهند بود و این روش دلیلی بر غیرقابل تغییر بودن زنجیره بلاک چین است. به این معنا که هیچ مخربی نمیتواند دادهای به زنجیره اضافه کرده یا از آن حذف کند.
برای تکمیل اموزش برنامه نویسی بلاک چین و درک بهتر معماری آن، به مثال زیر توجه کنید.
block = { 'index': 1, 'timestamp': 1506057125.900785, 'transactions': [ { 'sender': "8527147fe1f5426f9dd545de4b27ee00", 'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f", 'amount': 5, } ], 'proof': 324984774000, 'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" }
اگر فرض کنیم که در مثال بالا یک پیام رد و بدل میشود؛ این مثال، ساختار یک سینگل بلوک با اندیس یک را نشان میدهد که در آن مشخصات گیرنده و فرستنده پیام همراه با اطلاعات پیام قرار دارد. در آن این بلوک، هش بلوک قبلی هم آمده است.
مرحله سوم – ساخت بلوک حاوی تراکنش
همان طور که قبلا هم در اموزش برنامه نویسی بلاک چین گفته شد؛ برای اضافه کردن تراکنش جدید به بلوک کلاس ایجاد شده، به متدی نیاز داریم که ابتدا یک تراکنش به زنجیره اضافه کند؛ سپس اندیس بلوکی که به آن تراکنش اضافه شده را برگرداند. تابعی که برای این منظور معرفی خواهیم کرد؛ دارای سه متغییر فرستنده تراکنش، گیرنده تراکنش و مقدار تراکنش انجام شده میباشد. به کدهای زیر بادقت توجه کنید تا نحوه عمل کردن این متد را بیاموزید.
class Blockchain(object): ... def new_transaction(self, sender, recipient, amount): """ Creates a new transaction to go into the next mined Block :param sender: <str> Address of the Sender :param recipient: <str> Address of the Recipient :param amount: <int> Amount :return: <int> The index of the Block that will hold this transaction """ self.current_transactions.append({ 'sender': sender, 'recipient': recipient, 'amount': amount, }) return self.last_block['index'] + 1
مرحله چهارم – افزودن بلوکهای جدید به زنجیره
با استفاده از یک Genesis Block میتوان بلوکهای جدید به زنجیره بلاک چین اضافه نمود. نام دیگر Genesis Block بلوک سازنده میباشد. علاوه بر آن، متدهایی مثل ()new_block() ،new_transaction و ()hash هم نیاز است تا بتوانیم بلوکهای بیشتری در زنجیره اضافه کنیم.
در زیر، کدهای مربوط به اضافه کردن بلوکهای جدید آورده شده است. با اضافه کردن توضیحات در لابه لای تکه کدها سعی کردیم تا آموزش را مرحله به مرحله به صورت عملی پیش ببریم.
import hashlib import json from time import time class Blockchain(object): def __init__(self): self.current_transactions = [] self.chain = [] # Create the genesis block self.new_block(previous_hash=1, proof=100) def new_block(self, proof, previous_hash=None): """ Create a new Block in the Blockchain :param proof: <int> The proof given by the Proof of Work algorithm :param previous_hash: (Optional) <str> Hash of previous Block :return: <dict> New Block """ block = { 'index': len(self.chain) + 1, 'timestamp': time(), 'transactions': self.current_transactions, 'proof': proof, 'previous_hash': previous_hash or self.hash(self.chain[-1]), } # Reset the current list of transactions self.current_transactions = [] self.chain.append(block) return block def new_transaction(self, sender, recipient, amount): """ Creates a new transaction to go into the next mined Block :param sender: <str> Address of the Sender :param recipient: <str> Address of the Recipient :param amount: <int> Amount :return: <int> The index of the Block that will hold this transaction """ self.current_transactions.append({ 'sender': sender, 'recipient': recipient, 'amount': amount, }) return self.last_block['index'] + 1 @property def last_block(self): return self.chain[-1] @staticmethod def hash(block): """ Creates a SHA-256 hash of a Block :param block: <dict> Block :return: <str> """ # We must make sure that the Dictionary is Ordered, or we'll have inconsistent hashes block_string = json.dumps(block, sort_keys=True).encode() return hashlib.sha256(block_string).hexdigest()
مرحله پنجم – اعتبار سنجی، تایید تراکنش جاری و جایگاه بلاک جدید
کاوش در بلوکهای جدید با استفاده از الگوریتم PoW یا اثبات کار انجام میشود که بخشی از کلاس بلاک چین را تشکیل میدهد و میتوان گفت که روش اثبات کار در راستای فرآیند رمزنگاری هش بوده و یک چالش برای ماینرها است که اگر ماینر بتواند چالش پیش رو یعنی فرآیند اعتبارسنجی و تایید تراکنش را پشت سر بگذارد؛ بلوک بعدی تایید میشود. برای آشنایی بیشتر با دستگاه ماینر میتوانید از مقاله استخراج بیت کوین فرادرس استفاده کنید.
به عنوان مثال PoW رمز ارز بیت کوین Hashcash است و بررسی میکند که زنجیره بلاک چین شبکه بین کوین بر اساس الگوی از پیش تعیین شده کار میکند یا نه.
تابع Proof of work در زیر آورده شده است. در این پیاده سازی از الگوریتم، خواسته شده که عدد P فرضی را بیابد؛ به گونهای که بعد از ترکیب با هش بلوک قبل، یک هش با چهار صفر مقدم تولید کند.
import hashlib import json from time import time from uuid import uuid4 class Blockchain(object): ... def proof_of_work(self, last_proof): """ Simple Proof of Work Algorithm: - Find a number p' such that hash(pp') contains leading 4 zeroes, where p is the previous p' - p is the previous proof, and p' is the new proof :param last_proof: <int> :return: <int> """ proof = 0 while self.valid_proof(last_proof, proof) is False: proof += 1 return proof @staticmethod def valid_proof(last_proof, proof): """ Validates the Proof: Does hash(last_proof, proof) contain 4 leading zeroes? :param last_proof: <int> Previous Proof :param proof: <int> Current Proof :return: <bool> True if correct, False if not. """ guess = f'{last_proof}{proof}'.encode() guess_hash = hashlib.sha256(guess).hexdigest() return guess_hash[:4] == "0000"
هر بلاک چین با توجه به موضوع آن، دارای پیچیدگی اثبات کارکرد مختص به خود است. تعداد صفرهای مقدم، میزان پیچیدگی هش را تعیین میکنند و به سادگی با افزودن تعداد صفرهای بیشتر متوجه میشوید که زمان لازم برای اجرای الگوریتم PoW و پیدا کردن راهکار حل پیچیدگی مسئله، افزایش مییابد. برای تنظیم میزان سختی الگوریتم، میتوان تعداد صفرهای مقدم کم یا زیاد کرد اما توجه داشته باشید که هر چه هش پیچیدهتر باشد؛ بلاک چین تولیدشده امنتر خواهدبود.
کلام آخر درمورد اموزش برنامه نویسی بلاک چین
مخاطبان عزیز، بنده به شما تبریک میگویم چرا که با طی کردن مراحل بالا، یک کلاس تقریباً کامل بلاک چین را ساختهاید و میتوانید با استفاده از درخواستهای HTTP با آن ارتباط برقرار کنید. همانطور که گفتیم برای کار با بلاک چین نیازمند یادگیری زبان پایتون هستید. چنانچه پایتون را یاد گرفتهاید و میخواهید با فرصتهای شغلی زبان برنامه نویسی پایتون آشنا شوید میتوانید مقاله معرفی ۱۰ شغل مهم و پردرآمد را مطالعه کنید.
امیدوارم آموزشهای بنده تا به این مرحله برای شما مفید باشد و جذابیت این بحث، باعث شود تا در پستهای تکمیلی اموزش برنامه نویسی بلاک چین، تیم برنامه نویسی پی استور را همراهی کنید. موفق و پیروز باشید.