اگر چه بلاک چین در نگاه اول پیچیده به نظر میرسد اما مفهوم سادهای در پشت آن نهفته است. بدون شک به کاربردن عملی آن میتواند به فهم بهتر این تکنولوژی کمک کند. در این مقاله به صورت تصویری آموزش داده میشود که چگونه میتوان با چند خط کدنویسی یک بلاک چین ساده را ایجاد کرد.
ایجاد یک بلاک چین : مفهوم اساسی بلاک چین (Blockchain) بسیار ساده است: یک پایگاه داده توزیعشده که به طور پیوسته فهرستی رو به رشد از سوابق مرتبشده را حفظ میکند.
بلاک چین واژهای است که معمولا با نام بیت کوین و/یا اتریوم همراه شده است اما بلاک چین فراتر از این دو رمز ارز است. بلاک چین تکنولوژی پشت این رمز ارزها و پشت هر رمز ارز دیگری است.
دیگر موارد استفاده بسیاری برای بلاک چین وجود دارد، مثلاً بازیها (کریپتوکیتیز (CryptoKitties)) یا همچنین بلاک چین+IOT (اینترنت اشیا) و اینها تنها نقطهی آغاز برای این تکنولوژی هستند.
بلاک چین، همانطور که نامش میگوید، زنجیرهای از بلوکها است. به همین خاطر، ما اولین کلاس داده، یا همان اولین بلوک، را به شکل زیر داریم.
?
در این مرحله، بلوک من دارای صفتهای زیر است:
احتمالاً چند نکته جالب در تصویر به چشمتان خواهد خورد، به همین خاطر در اینجا کمی درباره آنها توضیح میدهم:
بنابراین این یک زنجیره معتبر است، اگر بلوک تغییر پیدا کرد، بلوک فعلی متوجه خواهد شد و خودش را نامعتبر میکند و اگر هر یک از بلوکهای قبلی تغییر یافت، زنجیره متوجه خواهد شد و تمام زنجیره نامعتبر خواهد شد. این مفهومی است که دادههای ذخیرهشده در بلاک چین را تغییرناپذیر میکند.
خب حالا اگر کلاس داده دوم یا همان بلاک چین را در نظر بگیریم، به این شکل است:
بنابراین کلاس بلاک چین، بلوکها را ایجاد کرده و به دنبال هر گونه مشکل در زنجیره میگردد و این کلاس مسئول ذخیرهی یک فایل 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 ("\nBlock #" + str(self.index)
+ "\nData: " + str(self.data)
+ "\nTimeStamp: " + str(self.timestamp)
+ "\nBlock Hash: " + str(self.hash)
+ "\nBlock Previous Hash: " + str(self.previousHash)
+"\n---------------")
class BlockChain:
def __init__(self, file="block.chain"):
self.chain = [Block(0, "Genesis")]
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("Not saved the chain!")
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("","").update(dic) for dic in data["chain"]]
def main():
blockchain = BlockChain()
blockchain.generateBlock("Hello World!")
blockchain.generateBlock(3)
blockchain.generateBlock({"account": 123123, "mount": 100})
print(blockchain.printBlockChain())
print ("Chain valid? " + str(blockchain.isChainValid()))
blockchain.save()
blockchain.chain[1].data = "Hello Darkness my old friend!"
print(blockchain.printBlockChain())
print ("Chain valid? " + str(blockchain.isChainValid()))
blockchain.save()
test = BlockChain()
test.open()
print(test.printBlockChain())
print ("Chain valid? " + str(test.isChainValid()))
test.save()
if __name__ == '__main__':
main()
در این نسخه از بلاک چین، ما الگوریتم « اثبات کار » (Proof of Work) را پیادهسازی نکردیم، ایدهی آن این است که ابتدا بلاک چین را ایجاد کرده و تضمین کنید که زنجیره یکپارچه است. این قدم بعدی من خواهد بود.