۱۴۰۵ مهر ۶, دوشنبه
دلار آمریکا۲۴۳٬۴۱۵▲ ۳٫۵۸٪یورو۲۷۷٬۰۰۰▲ ۳٫۳۹٪درهم امارات۶۶٬۳۰۵▲ ۳٫۶۱٪سکه امامی۲۴۴٬۵۰۵٬۰۰۰▲ ۱٫۶۶٪طلای ۱۸ عیار (گرم)۲۴٬۳۱۹٬۰۰۰▲ ۱٫۷۵٪انس طلا۴٬۱۵۰ $▼ ۳٫۲۶٪تتر۲۴۴٬۴۵۶▲ ۳٫۲۴٪بیت‌کوین۸۲٬۶۵۳ $▼ ۲٫۴۱٪اتریوم۲٬۶۴۰ $▼ ۱٫۸۹٪سولانا۱۱۷٫۸۴ $▼ ۴٫۳۴٪اپل۳۴۱٫۰۷ $▲ ۱٫۵۳٪انویدیا۲۲۵٫۰۷ $▲ ۰٫۲۲٪مایکروسافت۵۱۶٫۱۷ $▲ ۳٫۶۶٪آلفابت (گوگل)۳۴۳٫۹۲ $▲ ۰٫۴۶٪تسلا۳۷۲٫۱۱ $▼ ۱٫۵۴٪شاخص نزدک۲۷٬۰۶۹ $▲ ۰٫۴۸٪
نرخ ارز

بلاکچین چیست؟ توضیح فنی برای برنامه‌نویس‌ها، از هش تا اجماع

بلاکچین چیست و زیر کاپوت چطور کار می‌کند؟ توضیح فنی بلاکچین برای برنامه‌نویس‌ها: هش، درخت مرکل، اجماع، حساب‌ها و یک پیاده‌سازی کوچک با پایتون.

کریپتو و بلاکچین۵ دقیقه مطالعه
بلاکچین چیست؟ توضیح فنی برای برنامه‌نویس‌ها، از هش تا اجماع
فهرست مطالب
  1. بلاکچین چیست؟ تعریف از نگاه یک برنامه‌نویس
  2. درون یک بلاک چه خبر است؟
  3. یک بلاکچین اسباب‌بازی با پایتون
  4. اجماع: چه کسی بلاک بعدی را می‌سازد؟
  5. حساب‌ها، تراکنش‌ها و امضای دیجیتال
  6. قرارداد هوشمند: بلاکچین به‌عنوان ماشین حالت
  7. محدودیت‌ها: چرا بلاکچین جادو نیست
  8. کی بلاکچین لازم نیست؟

بلاکچین چیست و چرا این‌همه درباره‌اش حرف می‌زنند؟ اگر برنامه‌نویس باشید، احتمالاً تعریف‌های کلی مثل «دفتر کل توزیع‌شده» قانعتان نمی‌کند. در این مقاله بلاکچین را همان‌طور که یک مهندس نرم‌افزار می‌بیند باز می‌کنیم: ساختار داده، رمزنگاری، مسئله اجماع و محدودیت‌ها؛ همراه با یک پیاده‌سازی کوچک در پایتون.

بلاکچین چیست؟ تعریف از نگاه یک برنامه‌نویس

از دید فنی، بلاکچین یک لاگ فقط‌افزودنی (Append-only Log) است که میان تعداد زیادی نود مستقل تکثیر می‌شود. هیچ نودی به دیگری اعتماد کامل ندارد و بعضی از آن‌ها ممکن است عمداً دروغ بگویند. با این حال، همه باید درباره یک چیز به توافق برسند: ترتیب تراکنش‌ها.

اگر با سیستم‌های توزیع‌شده آشنا باشید، این همان مسئله تکثیر ماشین حالت (State Machine Replication) است، با این تفاوت که باید در برابر خطای بیزانسی (Byzantine Fault) مقاوم باشد و شرکت در آن برای هر کسی آزاد است. بیت‌کوین در سال ۲۰۰۸ نخستین راه‌حل عملی این مسئله را در یک شبکه باز ارائه کرد.

سه جزء اصلی هر بلاکچین:

  1. ساختار داده: بلاک‌هایی که با هش به هم زنجیر شده‌اند.
  2. رمزنگاری: امضای دیجیتال برای اثبات مالکیت و هش برای یکپارچگی.
  3. سازوکار اجماع: قاعده‌ای که مشخص می‌کند چه کسی بلاک بعدی را می‌سازد و کدام نسخه از زنجیره معتبر است.

درون یک بلاک چه خبر است؟

هر بلاک دو بخش دارد: سربرگ (Header) و بدنه (Body). بدنه فهرست تراکنش‌هاست و سربرگ خلاصه‌ای فشرده از آن به‌علاوه ارجاع به گذشته:

فیلد سربرگ کاربرد
هش بلاک قبلی زنجیرکردن بلاک به تاریخچه
ریشه مرکل (Merkle Root) خلاصه رمزنگاری‌شده همه تراکنش‌های بلاک
مُهر زمانی (Timestamp) زمان تقریبی ساخت بلاک
نانس (Nonce) و سختی در اثبات کار، عددی که ماینر برای یافتن هش معتبر تغییر می‌دهد

هش: چسب زنجیره

تابع هش رمزنگاری‌شده مثل SHA-256 ورودی دلخواه را به خروجی ثابت ۲۵۶ بیتی تبدیل می‌کند؛ کوچک‌ترین تغییر ورودی، خروجی را کاملاً عوض می‌کند و از روی خروجی نمی‌توان به ورودی رسید. چون هر بلاک هش بلاک قبلی را در سربرگ خود دارد، دست‌کاری در یک تراکنش قدیمی هش آن بلاک را تغییر می‌دهد و در نتیجه ارجاع همه بلاک‌های بعدی نامعتبر می‌شود.

درخت مرکل

تراکنش‌ها جفت‌جفت هش می‌شوند، سپس هش‌ها دوباره جفت‌جفت هش می‌شوند تا به یک ریشه برسیم. مزیت این ساختار آن است که برای اثبات وجود یک تراکنش در بلاک، به‌جای همه تراکنش‌ها فقط به حدود log₂(n) هش نیاز است. کیف پول‌های سبک (Light Client) از همین ایده استفاده می‌کنند.

یک بلاکچین اسباب‌بازی با پایتون

کد زیر یک زنجیره ساده با اثبات کار ابتدایی می‌سازد و نشان می‌دهد چرا دست‌کاری در تاریخچه فوراً کشف می‌شود. این کد فقط برای آموزش است و نه شبکه دارد، نه امضا و نه اجماع واقعی:

import hashlib
import json
import time


def sha256(data: str) -> str:
    return hashlib.sha256(data.encode()).hexdigest()


class Block:
    def __init__(self, index, transactions, prev_hash, difficulty=4):
        self.index = index
        self.timestamp = time.time()
        self.transactions = transactions
        self.prev_hash = prev_hash
        self.nonce = 0
        self.hash = self.mine(difficulty)

    def header(self) -> str:
        return json.dumps({
            "index": self.index,
            "timestamp": self.timestamp,
            "transactions": self.transactions,
            "prev_hash": self.prev_hash,
            "nonce": self.nonce,
        }, sort_keys=True)

    def mine(self, difficulty: int) -> str:
        target = "0" * difficulty
        while True:
            h = sha256(self.header())
            if h.startswith(target):
                return h
            self.nonce += 1


def is_valid(chain) -> bool:
    for prev, curr in zip(chain, chain[1:]):
        if curr.prev_hash != prev.hash:
            return False
        if sha256(curr.header()) != curr.hash:
            return False
    return True


genesis = Block(0, [], "0" * 64)
chain = [genesis]
chain.append(Block(1, [{"from": "ali", "to": "sara", "amount": 5}], chain[-1].hash))
chain.append(Block(2, [{"from": "sara", "to": "reza", "amount": 2}], chain[-1].hash))

print(is_valid(chain))  # True
chain[1].transactions[0]["amount"] = 500  # tamper with history
print(is_valid(chain))  # False

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

اجماع: چه کسی بلاک بعدی را می‌سازد؟

در یک شبکه باز، هر کسی می‌تواند هزاران هویت جعلی بسازد (حمله Sybil). برای همین، حق پیشنهاد بلاک باید به منبعی کمیاب گره بخورد:

ویژگی اثبات کار (PoW) اثبات سهام (PoS)
منبع کمیاب انرژی و سخت‌افزار محاسباتی رمزارز قفل‌شده به‌عنوان وثیقه
نمونه بیت‌کوین اتریوم (از سپتامبر ۲۰۲۲)
جریمه رفتار بد هدررفتن هزینه برق و سخت‌افزار سوزاندن بخشی از وثیقه (Slashing)
زمان بلاک هدف حدود ۱۰ دقیقه در بیت‌کوین اسلات‌های ۱۲ ثانیه‌ای در اتریوم

در اتریوم، هر اعتبارسنج (Validator) برای فعال‌شدن ۳۲ اتر سپرده می‌گذارد، در هر اسلات یک نفر به‌صورت تصادفی بلاک را پیشنهاد می‌دهد و بقیه با رأی (Attestation) آن را تأیید می‌کنند. پس از گذشت دو دوره (Epoch)، بلاک‌ها نهایی (Finalized) می‌شوند و بازگرداندنشان مستلزم سوزاندن سهم بزرگی از کل وثیقه شبکه است.

حساب‌ها، تراکنش‌ها و امضای دیجیتال

مالکیت در بلاکچین یعنی داشتن کلید خصوصی. آدرس شما از کلید عمومی مشتق می‌شود و هر تراکنش با کلید خصوصی امضا می‌شود؛ بیت‌کوین و اتریوم هر دو از امضای ECDSA روی منحنی secp256k1 استفاده می‌کنند. نودها امضا را بررسی می‌کنند و اگر معتبر نباشد، تراکنش را رد می‌کنند.

دو مدل رایج برای نگهداری وضعیت وجود دارد:

  • مدل UTXO (بیت‌کوین): موجودی شما مجموع «خروجی‌های خرج‌نشده» است؛ هر تراکنش تعدادی از آن‌ها را مصرف و خروجی تازه تولید می‌کند.
  • مدل حساب (اتریوم): شبیه جدول بانکی؛ هر آدرس موجودی و nonce دارد و قراردادها علاوه بر آن کد و فضای ذخیره‌سازی دارند.

نتیجه عملی مهم: هر کسی کلید خصوصی شما را داشته باشد، صاحب دارایی شماست. به همین دلیل امنیت کلید، موضوع راهنمای جداگانه DevNA درباره کیف پول‌ها است.

قرارداد هوشمند: بلاکچین به‌عنوان ماشین حالت

اتریوم ایده بلاکچین را از «دفتر ثبت انتقال پول» به «کامپیوتر مشترک جهانی» گسترش داد. قرارداد هوشمند (Smart Contract) برنامه‌ای است که روی ماشین مجازی اتریوم (EVM) اجرا می‌شود و قواعد تغییر وضعیت را تعریف می‌کند. هر نود همان کد را با همان ورودی اجرا می‌کند و باید به همان نتیجه برسد؛ به همین دلیل اجرای قرارداد باید کاملاً قطعی (Deterministic) باشد.

برای جلوگیری از حلقه‌های بی‌پایان و سوءاستفاده، هر عملیات هزینه‌ای به نام گس (Gas) دارد. اگر می‌خواهید اولین قرارداد خودتان را بنویسید، آموزش قدم‌به‌قدم Solidity را دنبال کنید.

محدودیت‌ها: چرا بلاکچین جادو نیست

  • مقیاس‌پذیری: چون همه نودها همه تراکنش‌ها را اجرا می‌کنند، ظرفیت محدود است. لایه‌های دوم (Layer 2) و ارتقاهایی مثل گلمستردام در اتریوم برای همین مسئله طراحی شده‌اند.
  • مسئله اوراکل (Oracle): بلاکچین فقط داده‌های درون خودش را می‌شناسد. قیمت دلار یا نتیجه یک مسابقه باید از بیرون و با اعتماد به یک منبع وارد شود.
  • حریم خصوصی: بیشتر بلاکچین‌های عمومی شفاف‌اند؛ هر کسی می‌تواند تاریخچه یک آدرس را ببیند.
  • بازگشت‌ناپذیری: اشتباه در آدرس یا باگ در قرارداد معمولاً قابل برگشت نیست.

کی بلاکچین لازم نیست؟

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

با این دید، بلاکچین نه راه‌حل همه مشکلات است و نه یک حباب صرف؛ ابزاری مهندسی با بده‌بستان‌های مشخص است که شناختن آن‌ها، شما را از هیاهوی بازار جدا می‌کند.

پرسش‌های پرتکرار

بلاکچین با یک دیتابیس معمولی چه فرقی دارد؟

دیتابیس معمولی یک مدیر مورد اعتماد دارد که می‌تواند داده را تغییر دهد. بلاکچین دفتر کل فقط‌افزودنی است که میان نودهای مستقل تکثیر می‌شود و تغییر در آن فقط با قواعد اجماع ممکن است؛ در عوض کندتر و گران‌تر است.

آیا داده‌های بلاکچین واقعاً غیرقابل تغییر است؟

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

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

برای اتریوم و شبکه‌های سازگار با EVM، زبان Solidity نقطه شروع رایج است. برای کار با بلاکچین از سمت اپلیکیشن هم TypeScript یا Python با کتابخانه‌هایی مثل viem، ethers یا web3.py کاربردی است.

اثبات کار و اثبات سهام چه تفاوتی دارند؟

در اثبات کار، حق ساخت بلاک با صرف انرژی محاسباتی به دست می‌آید؛ در اثبات سهام، با قفل‌کردن رمزارز به‌عنوان وثیقه. اتریوم از سپتامبر ۲۰۲۲ اثبات سهام را به کار می‌برد و بیت‌کوین همچنان اثبات کار است.

منابع

  1. Bitcoin: A Peer-to-Peer Electronic Cash System — Satoshi Nakamoto
  2. Blocks — ethereum.org developer docs
  3. Proof-of-stake (PoS) — ethereum.org developer docs
  4. Introduction to smart contracts — ethereum.org developer docs

خطایی در این مطلب دیدید؟ به تحریریه گزارش دهید؛ اصلاحیه‌ها طبق اصول تحریریه ثبت می‌شوند.

مطالب مرتبط