Faragiri

آموزش بلاک‌چینبرنامه‌نویسی

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

۵بخش
۶دقیقه خواندن
۲عمق

سازوکار

دست زدن به یک بلوک، هر بلوکی را که بعد از آن ثبت شده بی‌اعتبار می‌کند

چهار لحظه روی یک دفتر. هر بلوک خلاصه بلوک قبلی را با خود می‌برد، و کل ترفند همین است.

  1. فروردینبلوکی که مهاجم می‌خواهد عوضش کندارزان‌ترین جا برای امتحان کردن، چون هر چه بعد از آن آمده از قبل ته‌نشین شده
  2. اردیبهشتخلاصه فروردین را با خود داردهمان لحظه که فروردین عوض شود دیگر نمی‌خواند، و این ناهمخوانی حساب است نه نظر
  3. خردادو همین‌طور، هر بلوک بعد از آنهرکدام با همان یک استدلال بی‌اعتبار می‌شود، تا همین حالا
  4. اکنونبلوکی که دارد اضافه می‌شودشبکه هنوز اینجا می‌سازد، سریع‌تر از آنکه مهاجم بتواند بقیه را از نو بسازد

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

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

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

چرا بازنویسی گذشته گران است

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

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

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

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

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

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

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

  • bytes32 name_hash
  • string cooperative_name

خط اول همیشه یک واحد است، هر زبانی که نام با آن نوشته شده باشد. خط دوم به بلندی نام است، به بایت، نه به حرف.

پرسشی که تکلیف تعاونی را روشن کرد

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

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

گواهی زعفران

زنجیره واقعاً با چه چیزی خریده می‌شود، وقتی فناوری پرسش نیست

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

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

تکیه‌گاه این است که نهادی که هر دو طرف قبولش داشته باشند از قبل هست یا نه

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

جایی که کار می‌ایستد: رسیدن از راه قیمت، به جای مسئله

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

ایست دوم برای خواننده اینجا از همه گران‌تر است و فنی نیست: نقطه پایانی RPC. کتابخانه‌های آموزش‌ها به ارائه‌دهنده‌ای وصل می‌شوند که از ایران اغلب جواب نمی‌دهد، پس اولین خط کد کسی که دنبال یاد گرفتن است شکست می‌خورد، و شکستی که می‌بیند شبیه خطای کد است. جواب صادقانه‌اش این است که کار روی یک زنجیره محلی انجام شود، که هم مسئله دسترسی را حذف می‌کند و هم جایی است که هر قراردادی باید بار اول همان‌جا خراب شود.

سه چیزی که در ۲۰۲۶ باز می‌کنید

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

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

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

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

کنار این

بالای این