ZK Color Sort امتیازهای پازل روزانه را روی زنجیره با اثباتهای دانش صفر تأیید میکند

پازل روزانه با تابلوی امتیازات رمزنگاریشده
ZK Color Sort شبیه بازیهای مرتبسازی رنگ است که هنگام انتظار برای قهوه روی گوشی بازی میکنید: دوازده لوله، ده رنگ، و باید آنقدر بریزید تا هر لوله فقط یک رنگ داشته باشد. نکتهٔ اصلی درخواستی است که صفحه پس از پایان بازی از شما میکند. کنار دکمهٔ «Scores» و شمارندهٔ حرکت، نوشته شده: «برای فعال کردن این قابلیت، کیف پول آلگورند خود را وصل کنید.» این یک دیوار پرداخت نیست. اتصال یک کیف پول پشتیبانیشده — فعلاً Lute یا Pera — ورود به هدف واقعی بازی است: ارسال امتیازتان به یک قرارداد هوشمند شبکهٔ اصلی آلگورند بههمراه یک اثبات دانش صفر؛ گواهی رمزنگاریشده که نشان میدهد یک ادعا درست است بدون افشای دادههای پشت آن. در اینجا ادعا این است که «این پازل خاص را در N حرکت حل کردهام» و دادهای که خصوصی نگه داشته میشود، خود توالی حرکتهاست. بازی کردن به هیچ کیف پولی نیاز ندارد؛ تابلوی امتیازاتِ محدودشده با اثبات، لایهٔ روی زنجیره است.
پازل روزانه خودش از زنجیره استخراج میشود. فرانتاند از یک ایندکسر آلگورند میخواهد اولین هدر بلاک را بعد از نیمهشب UTC بیاید و بهصورت قطعی تخته بازی را از seed آن هدر مشتق میکند؛ بنابراین چالش عمومی است و از تاریخچهٔ زنجیره قابل بازتولید است، نه انتخابی توسط توسعهدهنده. قوانین از قالب استاندارد Color Sort پیروی میکنند و دقیقاً در README پروژه مشخص شدهاند: دوازده لوله با ظرفیت چهار؛ ده رنگ که هر کدام دقیقاً چهار بار ظاهر میشوند؛ دو لولهٔ خالی برای ریختن؛ یک ریختن قانونی، طولانیترین توالی پیوسته از یک رنگ را به یک لولهٔ خالی یا لولهای که رنگ رویهاش همرنگ است منتقل میکند؛ پازل وقتی حل میشود که هر لولهٔ غیرخالی کاملاً تکرنگی باشد. امتیاز همان تعداد حرکات است، هرچه کمتر بهتر، و بهترین امتیازهای محلی با تاریخچهٔ کامل حرکات در localStorage مرورگر ذخیره میشوند. ثبتِ روی زنجیره هرگز امتیازی را نمیپذیرد که بهترین ثبتشدهٔ خود بازیکن را شکست ندهد.
اثبات دانش صفر دقیقاً چه چیزی را ثابت میکند؟
هر تابلوی امتیازات روی زنجیرهای برای یک بازی مهارتی مشکل اعتبار دارد: قراردادی که یک عدد را میپذیرد، هر عددی را میپذیرد. یک سرور معتمد که بازی را اعتبارسنجی میکند، تمرکزگرایی را دوباره برمیگرداند، و انتشار راهحل برنده، استراتژی تولیدکنندهٔ آن را لو میدهد. ZK Color Sort مسیر سومی را امتحان میکند — اثباتش کن، نشانش نده.
وقتی بازیکنی امتیازش را ارسال میکند، مرورگر یک مدار Circom را از طریق snarkjs، کتابخانهٔ متنباز تولید اثبات جاوااسکریپت، اجرا میکند و یک اثبات Groth16 تولید میکند؛ یکی از پرکاربردترین طرحهای دانش صفر. اولین ارسال، کلید اثبات تقریباً ۵۵ مگابایتی را دانلود میکند که بازی بهعنوان یک دارایی استاتیک ارائه میدهد؛ از آن به بعد کل خط لوله سمت کلاینت اجرا میشود و هیچ سرور اثباتی پشت بازی نیست. انتخاب تکنولوژی عمدی است: README کتابخانهٔ snarkjs-algorand اشاره میکند که gnark، کامپایلر پشت راهحل جایگزین AlgoPlonk، از WebAssembly پشتیبانی نمیکند، که تولید اثبات درونمرورگری را رد میکند — snarkjs تایپاسکریپت است و همانجایی که بازیکن است اجرا میشود.
مدار دقیقاً برای مشخصات همین بازی تنظیم شده است — دوازده لوله، ظرفیت چهار، حداکثر ۱۲۰ حرکت، ده رنگ، دو لولهٔ خالی — و تمام معناشناسی بازی را اعمال میکند: تختهٔ شروع معتبر، حرکات قانونی طبق قوانین ریختن بالا، انتقال صحیح حالت بعد از هر حرکت، تختهٔ نهایی کاملاً حلشده، و تعداد حرکات برابر با تعداد حرکات فعال. اینکه چه چیزی عمومی است و چه چیزی خصوصی میماند، کل طراحی است:
| مفهوم | پیامد در دنیای واقعی |
|---|---|
| عمومی: تختهٔ شروع | هر کسی میتواند تأیید کند که یک امتیاز به کدام پازل اشاره دارد |
| عمومی: تعداد حرکات | عددی که ثبت آن را ذخیره میکند و تابلوی امتیازات بر اساس آن رتبهبندی میکند |
| عمومی: هویت پازل و آدرس کیف پول | در اثبات قید شده است، بنابراین اثباتی که برای یک پازل یا یک حساب تولید شده نمیتواند برای دیگری استفاده شود |
| خصوصی: توالی کامل حرکات | ناظران میتوانند ادعا را تأیید کنند بدون اینکه استراتژی برنده را کپی کنند — عاملی که معمولاً تابلوی امتیازات پازلهای روی زنجیره را از بین میبرد |
ثبت امتیاز روی زنجیره
طرف دریافتکننده یک قرارداد هوشمند به نام PuzzleScores است که با Algorand TypeScript نوشته شده، زبان قرارداد مدرن مبتنی بر کامپایلر Puya که جایگزین PyTeal قدیمیتر شده است. این قرارداد به ازای هر جفت (پازل، کیف پول) یک امتیاز در باکس استوریج برنامه نگهداری میکند — حالت کلید-مقداری که به خود قرارداد متصل است. کلید شامل یک کد پازل ۲۰ بایتی بههمراه آدرس کیف پول ۳۲ بایتی است (در مجموع ۵۲ بایت)؛ مقدار فقط یک بایت است، که امتیازهای ذخیرهشده را به ۲۵۵ حرکت محدود میکند، بسیار فراتر از آنچه هر حلی برای این پازل نیاز دارد. ایجاد یک ورودی دقیقاً معادل نیاز حداقل موجودی باکس هزینه دارد که قرارداد در زمان اجرا محاسبه میکند (۲٬۵۰۰ میکروآلگو پایه بهعلاوه ۴۰۰ برای هر بایت) و اگر بازیکن ورودی را از طریق removeScore حذف کند، آن را بازپرداخت میکند. متدهای فقطخواندنی به بازیکن اجازه میدهند امتیاز خودش یا هر کس دیگری را دریافت کند.
دو مسیر نوشتن وجود دارد: addScore برای ورودی اول و updateScore که قرارداد فقط زمانی میپذیرد که امتیاز جدید بهطور قطعی کمتر از امتیاز ذخیرهشده باشد. هر دو به یک تراکنش «تأییدکننده» همراه در همان گروه اتمی نیاز دارند و این جایی است که اثبات واقعاً بررسی میشود. فرانتاند گروهی از سه تراکنش میسازد — یک پرداخت بدون ارزش با امضای یک حساب امضای منطقی (حسابی که اختیارش با یک برنامه است نه کلید خصوصی، مشتقشده از کلید تأیید بازی)، پرداخت حداقل موجودی، و فراخوانی برنامه. قرارداد بررسی میکند که پرداخت گواهی از آدرس تأییدکنندهٔ پیکربندیشده آمده و سیگنالهای عمومی اثبات با امتیاز ادعاشده، کد پازل و فرستنده مطابقت دارند؛ خود محاسبات تأیید Groth16 داخل برنامهٔ امضای منطقی اجرا میشود که فقط وقتی شاهد را بپذیرد پرداخت گواهی را تولید میکند. چون امتیاز، پازل و کیف پول بازیکن همگی در یک اثبات قید شدهاند، ارسالی که برای یک پازل یا یک حساب تولید شده نمیتواند برای دیگری بازیافت شود. در فرانتاند، همان باکس استوریج نمای صدک را تغذیه میکند: پس از اتصال، بازی ورودیهای روی زنجیرهٔ پازل روز را اسکن میکند و به بازیکن میگوید چند نفر دیگر را شکست داده است.
فعال روی مایننت — اما چه کسی بازی میکند؟
قرارداد واقعی است، مستقر شده و فعال است: برنامهٔ ۳۶۰۳۴۵۹۴۲۵ در راند ۶۲٬۲۰۹٬۳۱۵ در ۱۶ ژوئن ۲۰۲۶ توسط حساب پشت پروژه (که مالک نام .algo با نام tools.orange.algo است) ایجاد شد و تأییدکنندهاش چند دقیقه بعد پیکربندی شد. در حال حاضر ۹۴ باکس امتیاز دارد و دفتر کل فراخوانیهای برنامه را تا راند ۶۴٬۱۳۰٬۵۲۰ نشان میدهد — ۱۶ اوت ۲۰۲۶، دو روز قبل از نگارش این مطلب. باندل وب تأیید میکند که شبکهٔ پیشفرض فرانتاند مایننت است و با شناسهٔ برنامه در پیکربندی شبکهٔ ریپازیتوری مطابقت دارد.
دفتر کل فرستندهها، با این حال، داستان پذیرش محدودتری را روایت میکند. کیف پول خود توسعهدهنده هم در گزارش تراکنشها و هم در کلیدهای باکس غالب است؛ یک کیف پول ارسالکنندهٔ دوم در روز عرضه ایجاد شد و توسط توسعهدهنده با ۱ آلگو تأمین شد — یک حساب آزمایشی. دو کیف پول دیگر اولین تأمین مالی خود را به حسابهای نامرتبطی که در ۲۰۲۲ و ۲۰۲۴ ایجاد شدهاند نسبت میدهند، که با بازیکنان خارجی سازگار است، هرچند هیچکدام نام .algo ندارند. خوانش صادقانه: این یک ثبتِ فعال اما کوچک است، که بیشتر ورودیهای آن به تستهای خود توسعهدهنده نسبت داده میشود و هنوز شواهدی از پایگاه بازیکن قابل توجهی وجود ندارد.
خود پروژه کار یک توسعهدهندهٔ واحد است — حساب گیتهاب funk-af که پروفایلش مالک را «اندرو» نام میبرد — و همین حساب سایر کارهای قرارداد آلگورند را منتشر میکند، از جمله ریپازیتوریهایی که بهعنوان قراردادهای هوشمند برای Baanx و برای پروتکل تأمین مالی کارت انعطافپذیر Immersve توصیف شدهاند. ریپازیتوری بازی ۱۸ کامیت از ژوئن ۲۰۲۶ و هیچ فعالیتی از ۱۸ ژوئن ندارد، در حالی که فرانتاند مستقر و قرارداد روی زنجیره همچنان در حال اجرا هستند.
محدودیتهای مدل اعتماد
سه نکتهٔ احتیاطی برای هر کسی که این ثبت را چیزی فراتر از یک بازی میبیند مهم است. اول، استخراج پازل روزانه یک قراردادِ فرانتاندی است، نه یک قاعدهٔ قرارداد: قرارداد هرگز بررسی نمیکند که کد پازل ارسالشده با پازلِ مشتقشده از بلاک امروز مطابقت دارد، و مدار فقط اعتبار و حلشدن یک پازل را تأیید میکند. اثبات برای هر پازل خوشفرم از همان پروفایل مدار پذیرفته میشود؛ هیچچیز روی زنجیره یک ارسال را به تاریخ فعلی گره نمیزند. دوم، هم آدرس تأییدکننده و هم خود قرارداد تحت کنترل سازنده هستند — setVerifier و updateApplication به کیف پول سازنده محدود شدهاند — بنابراین یکپارچگی ثبت در نهایت به این بستگی دارد که یک توسعهدهندهٔ تنها تأییدکننده را عوض نکند یا قرارداد را بازنویسی نکند. سوم، پشتهٔ اثبات حسابرسی نشده است: README اسنارکس-الگورند هشدار میدهد که SDK «در حال توسعه است و هنوز پایدار نیست» و «کد این ریپازیتوری حسابرسی نشده است. با مسئولیت خودتان استفاده کنید!»
هیچکدام از اینها از نکتهٔ واقعاً قابلتوجه اینجا کم نمیکند: یک نمایش سرتاسری و کارآمد از تولید اثبات Groth16 سمت مرورگر که به یک تأییدکنندهٔ روی زنجیرهای در مایننت آلگورند تغذیه میشود، با یک پازل روزانه که از خود هدرهای بلاکهای زنجیره سرچشمه میگیرد. اگر این الگو بالغ شود — تأییدکنندهٔ حسابرسیشده، اتصال پازل اعمالشده توسط قرارداد، و بازیکنان واقعی — بازیهای مهارتیِ تأییدشده با ZK یک حوزهٔ خاص با پایهای معتبر هستند. برای حالا، این یک آزمایش صادقانه و کوچک است و کار میکند.
منبع
- ZK Color Sort
- funk-af/zk-colorsort
- snarkjs-algorand
- snarkjs
- Algorand
- https://mainnet-idx.algonode.cloud/v2/transactions?application-id=3603459425&limit=20
- raw.githubusercontent.com
- https://mainnet-idx.algonode.cloud/v2/transactions?application-id=3603459425&min-round=63000000&limit=50
- https://mainnet-idx.algonode.cloud/v2/transactions?application-id=3603459425&min-round=64000000&limit=5
- https://mainnet-idx.algonode.cloud/v2/transactions?application-id=3603459425&min-round=64000000&limit=50
- https://mainnet-idx.algonode.cloud/v2/applications/3603459425/boxes?limit=5