آموزش ایجاد بلاکچین با زبان برنامه نویسی پایتون

زمان مطالعه: 5 دقیقه

ایجاد بلاکچین با پایتون کار چندان سختی نیست. هر کسی که با برنامه‌نویسی Python آشنا باشد، با کمی مطالعه و تحقیق می‌تواند یک شبکه بلاکچینی ایجاد کند. در این مقاله مراحل ایجاد بلاکچین با زبان برنامه نویسی پایتون را بررسی خواهیم کرد و قبل از آن نیز با ماهیت شبکه‌های زنجیره‌ای آشنا می‌شویم.

بلاکچین چیست و چگونه مدیریت می‌شود؟

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

چگونگی ایجاد بلاکچین با پایتون

برای ایجاد بلاکچین با پایتون داده‌ها در قالب JSON ذخیره می‌شود که پیاده‌سازی و خواندن آن بسیار آسان است. داده‌ها در یک بلاک نگهداری می‌شوند و هر بلاک حاوی داده‌های مختلفی است. هر دقیقه یک یا چند بلاک به شبکه اضافه خواهد شد و برای متمایزسازی آنها از فناوری فینگرپرینت (fingerprinting) استفاده می‌شود.

فناوری fingerprinting با استفاده از هش پیاده‌سازی می‌شود. برای خاص بودن بلاک‌ها، الگوریتم هش SHA256 مورد استفاده قرار می‌گیرد. هر بلاک حاوی هش مخصوص به خود و همچنین هش تابع قبلی است. بدین ترتیب امکان دستکاری اطلاعات میسر نخواهد بود.

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

استخراج بلاک جدید با استفاده از الگوریتم اثبات کار (PoW) صورت می‌گیرد. برای سخت‌تر شدن استخراج بلاک‌ها، مسائل به صورتی پیچیده و دشوار طراحی می‌شود تا سرعت ماین و حل کردن بلاک‌های جدید تنظیم شود.

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

در نهایت برنامه تحت وب با استفاده از فلسک (Flask) ساخته می‌شود و سفارشی‌سازی شبکه با توجه به نیاز کاربران اکوسیستم مورد نظر انجام خواهد شد. بدین ترتیب ایجاد بلاک چین با پایتون به طور موفقیت‌آمیز انجام خواهد شد.

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

کدهای موردنیاز برای طراحی یک سیستم کوچک و ایجاد بلاکچین با پایتون به شرح زیر است:

ابتدا چند کتابخانه را جهت استفاده در کدها ایمپورت می‌کنیم:

import datetimeبرای محاسبات زمانی و به دست آوردن تاریخ و ساعت استفاده می‌شود.

import hashlibبرای محاسبات هش استفاده می‌شود و رمزنگاری‌ها را در بلاک‌ها قرار می‌دهد.

import JSONبرای کارکردن با نوع داده json استفاده می‌شود.

from flask import Flask, jsonifyفلسک برای برنامه‌نویسی برنامه‌های تحت وب کاربرد دارد. همچنین از jsonify برای نمایش بلاکچین ایجادشده استفاده می‌شود. در ادامه کلاس blockchain را داریم که شامل توابع زیر است.

def __init__(self):
self.chain = []
self.create_block(proof=1, previous_hash="0")
این تابع اولین بلاک را ایجاد می‌کند.

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
این تابع بلاک‌های بعدی را با بلاکچین ادغام و آنها را در بلاکچین قرار می‌دهد.

def print_previous_block(self):
return self.chain[-1]
برای نمایش بلاک قبلی استفاده می‌شود.

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
این تابع وظیفه دارد تا زنجیرۀ ایجادشده را بازبینی کند و صحت آن را بسنجد.

app = Flask(__name__)سپس به وسیله‌ flask یک وب اپلیکیشن ایجاد می‌کنیم.

blockchain = Blockchain()کلاس بلاکچین را فراخوانی می‌کنیم.

@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),
یک آدرس با نام mine_block ایجاد می‌کنیم که این آدرس پس از اتمام کدها از طریق مروگر قابل فراخوانی است. سپس تابعی برای استخراج بلاک‌ها ایجاد می‌کنیم که با آدرس /mine_block فراخوانی و عمل می‌کند.

app.route('/get_chain', methods=['GET'])@
def display_chain():
response = {'chain': blockchain.chain,
'length': len(blockchain.chain)}
return jsonify(response), 200
یک آدرس با نام get_chain ایجاد می‌کنیم. همراه با تابع display_chain زمانی که این آدرس فراخوانی شود، تابع متصل به آدرس بلاکچین ایجادشده را در مرورگر نمایش می‌دهد.

@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),
یک آدرس دیگر با نام valid ایجاد می‌کنیم که تابع valid را فراخوانی می‎‌کند. این تابع وظیفه بررسی صحت بلاکچین با استفاده از تابع chain_valid را دارد. در صورت درستی پیام تأیید و در صورت نادرست بودن پیام عدم تأیید به کاربر نمایش داده می‌شود.

app.run(host="127.0.0.1", port=5000)در آخر با دستور فوق وب اپلیکیشن را اجرا می‌کنیم. در مرورگر خود آدرس زیر را وارد می‌‎کنیم:

Localhost:5000سپس آدرس‌هایی را که در کدها ایجاد کردیم، به ترتیب و مرحله به مرحله در انتهای آدرس وارد می‌کنیم. نتیجۀ سیستم بلاکچین ما به این صورت خواهد بود:

{
"index":2,
"message":"A block is MINED",
"previous_hash":"2d83a826f87415edb31b7e12b35949b9dbf702aee7e383cbab119456847b957c",
"proof":533,
"timestamp":"2020-06-01 22:47:59.309000"
}
خروجی آدرس mine_block

{
"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
}
خروجی آدرس get_chain

{"message":"The Blockchain is valid."}خروجی آدرس valid

خلاصه مطلب

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