رفتن به محتوای اصلی
ExACup

عدالتِ قابلِ اثبات

امنیت و عدالت

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

تأییدِ یک باز کردن

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

همین‌جا یک باز کردن را تأیید کن

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

چطور عدالت را تضمین می‌کنیم

باز کردنِ تکیِ پک

یک سیدِ سرورِ مخفی، سیدِ تو و یک نانس را در یک رشته ترکیب می‌کنیم، آن را با SHA-512 هش می‌کنیم و به یک عددِ تیکت میانِ ۱ تا ۱٬۰۰۰٬۰۰۰ نگاشت می‌کنیم. آن تیکت دقیقاً درونِ بازه‌ی یک آیتمِ مشخص می‌افتد و همان آیتم را می‌بری. همین سه ورودی را به تابعِ getTicketNumber ما بده تا خودت نتیجه را بازتولید کنی.

واژه‌ها و تعریف‌ها

عددِ تیکت

یک عددِ صحیح میانِ ۱ تا ۱٬۰۰۰٬۰۰۰ که از سیدِ کلاینت، سیدِ سرور و نانس ساخته می‌شود و آیتمِ نتیجه را با بازه‌ی تیکتِ همان آیتم پیدا می‌کند.

سیدِ کلاینت

رشته‌ای که پیش از تولیدِ نتیجه برای تو معلوم است و می‌توانی آن را از بخشِ عدالتِ کیف پول برای باز کردن‌های آینده بچرخانی.

سیدِ سرور

رشته‌ای مخفی که سرورهای ما می‌سازند. هشِ SHA-512ِ آن را پیش از خرید نشانت می‌دهیم و سیدِ خام را پس از آن افشا می‌کنیم تا با هش کردنِ دوباره صحتش را تأیید کنی.

نانس

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

پیاده‌سازیِ مرجع

import { createHash } from "crypto";

// 1..1,000,000 ticket from your client seed + our server seed + a nonce
export const sha512 = (v: string) =>
  createHash("sha512").update(v).digest("hex");

export const combineSeeds = (
  clientSeed: string,
  serverSeed: string,
  nonce: number,
) => sha512(`${clientSeed}:${serverSeed}:${nonce}`);

export const getTicketNumber = (hash: string) => {
  const hashInt = BigInt("0x" + hash);
  const maxInt = BigInt(1_000_000);
  return Number((hashInt % maxInt) + BigInt(1));
};