نرد لا يمكن التنبّؤ به: ما الذي كان خاطئًا وما الذي غيّرناه
اكتشفنا أنّ نتائج النرد في المباريات عبر الإنترنت كان يمكن، من حيث المبدأ، حسابها قبل الرمي: فبذرتها كانت تُبنى من معلومات يراها كلّ لاعب. ولم نجد أيّ دليل على أنّ أحدًا فعل ذلك. ومنذ 1 أكتوبر صارت بذرة كل رمية تأتي من سرّ لا يعرفه إلا الخادم، ولم يعد التوقّع القديم يصيب إلا مرّة واحدة من كل 36 — وهذه هي الصدفة المحضة.

بكلمات بسيطة
إليك ما وجدناه. كل ما هو عشوائي في مباراة عبر الإنترنت — النردان، وسحب بطاقة الحظ، ونرد الجائزة الكبرى — يأتي من مولّد أرقام عشوائية، والمولّد لا بدّ أن يبدأ من بذرة. وكانت بذرتنا تُبنى من شيئين يراهما كل لاعب: معرّف المباراة الظاهر في شريط العنوان لديك، ورقم الحركة الذي تعيده اللعبة بعد كل إجراء. أمّا المولّد نفسه فشيفرة عادية منشورة. اجمع هذه العناصر معًا، وكان بوسع من يعرف الطريقة أن يحسب الرمية قبل أن يرمي — بل كان بوسعه، من حيث المبدأ، أن يختار أيّ الرميات القليلة التالية يحصل عليها.
تحقّقنا من ذلك على مباريات حقيقية، لا من الناحية النظرية. فمن آخر 2,000 رمية قبل الإصلاح، جاءت 1,985 منها — أي 99.3% — مطابقة تمامًا لما تنبّأت به تلك المعلومات العلنية.
هل استغلّ أحدٌ ذلك؟
ثم بحثنا عن أيّ أحد يستغلّ ذلك، فلم نجد أحدًا. والرهان الذي تؤتي فيه معرفةُ الرمية ثمارها بأكثر الطرق مباشرةً هو رهان الجائزة الكبرى. وخلال الأيام السبعة التي سبقت الإصلاح، فازت رهانات الجائزة الكبرى — وعددها 2,354 — بنسبة 31.4%، مقابل 31.1% تتوقّعها الصدفة وحدها، ولم يبرز سجلّ أيّ لاعب على نحو لافت.
أسئلة يطرحها الناس
هل النرد في opolyx عادل؟
نعم. فعبر 247,968 رمية جرت من 2 إلى 6 أكتوبر 2026، ظهر كل وجه من وجوه كل نرد بنسبة تتراوح بين 16.54% و16.77% — والنرد المثالي يعطي 16.67% — وظهرت الأزواج بنسبة 16.67%.
هل يمكن توقّع النرد في opolyx؟
لا — ليس منذ 1 أكتوبر 2026. فبذرة كل رمية تأتي من سرّ لا يوجد إلا على الخادم، ولم يعد التوقّع القديم يطابق إلا 2.76% من الرميات، وهي نسبة 2.78% التي يمنحها تخمين نردين دون رؤيتهما.
هل استغلّ أحدٌ ثغرة النرد القديمة؟
لم نجد أيّ دليل على ذلك. فخلال الأيام السبعة التي سبقت الإصلاح، فازت رهانات الجائزة الكبرى — وعددها 2,354 — بنسبة 31.4%، مقابل 31.1% تتوقّعها الصدفة وحدها، ولم تبرز نتائج أيّ لاعب على نحو لافت.
أين تُحسم نتيجة الرمية؟
على خادم اللعبة، في لحظة رميك، بواسطة مولّد أرقام عشوائية تأتي بذرته من سرّ لا يملكه أحد غيره. وتُكتب النتيجة في سجلّ المباراة، وتقرأ إعادات المباريات والإحصاءات هذا السجلّ بدل أن ترمي النرد من جديد.
للمهتمين بالتفاصيل التقنية
كانت البذرة وسمًا بالشكل <معرّف المباراة>:<رقم الحركة>، يُعالَج بدالة التجزئة FNV-1a ثم يُمرَّر إلى mulberry32. وكان هذا التصميم مقصودًا — إذ جعل كل مباراة قابلة لإعادة البناء من سجلّها الخاص — لكنّ إعادة البناء لم تكن تحتاج قطّ إلى أن تكون البذرة علنية. فكل نتيجة تُكتب في الحدث الذي أنتجها، وإعادات المباريات والإحصاءات تقرأ تلك الأحداث بدل أن ترمي النرد من جديد.
// before: anyone who knew the game id and the move number could do this
rng = mulberry32(fnv1a(`${gameId}:${seq}`))
// after: the same label, signed with a key that never leaves the server
rng = mulberry32(uint32(hmacSha256(serverSecret, `${gameId}:${seq}`)))أمّا الآن فيمرّ الوسم أولًا عبر HMAC-SHA256، بمفتاح هو سرّ طوله 32 بايت لا يوجد إلا داخل الخادم. وافتراضيًّا يُولَّد هذا السرّ من جديد في كل مرّة يبدأ فيها الخادم. ولا شيء يحتاج إلى بقائه بعد إعادة التشغيل، لأنّ أيّ رمية سابقة لا يُعاد حسابها أبدًا — والسرّ الذي لا يُدوَّن في أيّ مكان سرّ لا يمكن أن يتسرّب.
وكل سحب عشوائي يحسم أمرًا في المباراة يُوقَّع بهذه الطريقة: النرد، وسحب بطاقة الحظ، ونرد الجائزة الكبرى، واختيار من يبدأ اللعب أولًا.
والنرد عادل كما ينبغي للنرد أن يكون. فعبر كل الرميات منذ 2 أكتوبر — وعددها 247,968 — ظهر كل وجه من وجوه كل نرد بنسبة تتراوح بين 16.54% و16.77%، مقابل 16.67% للنرد المثالي، وظهرت الأزواج بنسبة 16.67%:
| الوجه | النرد الأول | النرد الثاني |
|---|---|---|
| الوجه 1 | 16.75% | 16.72% |
| الوجه 2 | 16.77% | 16.65% |
| الوجه 3 | 16.56% | 16.61% |
| الوجه 4 | 16.54% | 16.70% |
| الوجه 5 | 16.67% | 16.70% |
| الوجه 6 | 16.72% | 16.62% |
وقد فُحص الإصلاح بالمعايير نفسها التي فُحصت بها المشكلة. فالتوقّع الذي أصاب 99.3% من الرميات قبل الإصلاح أُعيد تشغيله بعده على مدى يوم كامل: فأصاب 1,388 من 50,212، أي 2.76% — وهي النسبة نفسها، 2.78%، التي تتوقّعها حين تخمّن نتيجة نردين دون أن تراهما.
